[ { "title": "Clase del Lunes 30/09/2019", "excerpt": "Clase del Lunes 30/09/2019\n\n", "content": "Clase del Lunes 30/09/2019\n\n\n Presentación de la Asignatura SYTWS\n Práctica Bono: GitHub Campus Expert (pb-gh-campus-expert)\n\n", "url": "/clases/2019/09/30/leccion.html" }, { "title": "Clase del Lunes 07/10/2019", "excerpt": "Clase del Lunes 07/10/2019\n\n", "content": "Clase del Lunes 07/10/2019\n\n\n El Bucle de Eventos de JS\n practicas/p01-t1-iaas/\n\n", "url": "/clases/2019/10/07/leccion.html" }, { "title": "Clase del Lunes 14/10/2019 (Semana B)", "excerpt": "Clase del Lunes 14/10/2019\n\n", "content": "Clase del Lunes 14/10/2019\n\n\n El Bucle de Eventos de JS\n Micro tasks y Macro tasks\n Web Workers\n practicas/p01-t1-iaas/\n Introducción a Express.js\n \n El concepto de Express Middleware\n \n \n Ejemplo simple de Promesa\n practicas/p2-t1-vscode\n\n", "url": "/clases/2019/10/14/leccion.html" }, { "title": "Clase del Miércoles 16/10/2019 (Semana B)", "excerpt": "Miércoles 16/10/2019\n\n", "content": "Miércoles 16/10/2019\n\n\n practicas/p2-t1-c3-file-system\n\n", "url": "/clases/2019/10/16/leccion.html" }, { "title": "Clase del Lunes 21/10/2019", "excerpt": "Lunes 21/10/2019\n\n", "content": "Lunes 21/10/2019\n\nPrácticas. Revisar Estado Actual\n\n\n https://docs.google.com/spreadsheets/d/123qbWECg5CNWbuIzgGHGvoixnTMYybL8rjVQAqtBYEI/edit?pli=1#gid=1468059606\n https://github.com/ULL-MII-SYTWS-1920/practicas/blob/master/README.md\n https://classroom.github.com/classrooms/55384072-master-de-ingenieria-informatica-sistemas-y-tecnologias-web-servidor-classroom\n\n\nSolución a p2-t1-c3-filesystem\n\n1\n2\n3\n[~/.../crguezl-filesystem-ch2/solutions(master)]$ pwd -P\n/Users/casiano/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2/solutions\n[~/.../crguezl-filesystem-ch2/solutions(master)]$ cat watcher-sol.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n#!/usr/bin/env node \n/*\n *\n Consider these questions:\n * Instead, how would you take the process to spawn from process.argv?\n * How would you pass an arbitrary number of additional parameters from \n * process.argv to the spawned process \n * (e.g., node watcher-spawn-cmd.js target.txt ls -l -h)?\n*/\n\n'use strict';\n\nconst path = require('path');\nconst fs = require('fs');\nconst spawn = require('child_process').spawn;\nconst fileName = process.argv[2];\nconst processName = process.argv[3] || 'ls';\nconst params = process.argv.slice(4) || [ '-lh' ];\n\nif (!fileName) {\n console.log(`Usage:\\n ${path.basename(process.argv[1])} <fileName> [command] [args ... ]\\n`);\n}\nelse {\n fs.watch(fileName, { recursive: true }, (eventType, changed) => {\n params.push(changed);\n const command = spawn(processName, params);\n command.stdout.pipe(process.stdout);\n command.stderr.pipe(process.stderr);\n\n command.on('close', () => {\n console.log(`Closing ${processName}`);\n });\n });\n console.log(`Now watching ${fileName} for changes...`);\n}\n\n\n\n Streams by Flavio\n pipe by Flavio\n How to spawn a child process with Node.js by Flavio\n\n\nPromises: Microtask queue (Promisejobs queue) vs Callback Queue\n\n\n Promises en los apuntes\n Section Microtasks queue in the book The Modern JavaScript Tutorial\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n[~/.../event-loop/promise-ejemplo(master)]$ pwd\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/promise-ejemplo\n[~/.../event-loop/promise-ejemplo(master)]$ ls -l\ntotal 24\n-rw-r--r-- 1 casiano wheel 2132 14 oct 14:14 index.html\n-rw-r--r-- 1 casiano staff 1193 16 oct 10:09 promise-job-queue.js\n-rw-r--r-- 1 casiano wheel 1139 14 oct 14:17 script.js\n[~/.../event-loop/promise-ejemplo(master)]$ cat promise-job-queue.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n// Promises that resolve before the current function ends \n// will be executed right after the current function.\n//\nlet promise = new Promise(function(resolve, reject) {\n resolve(1)\n});\n\npromise.then(function(resolve) { console.log(1) });\n\nconsole.log('a');\n\npromise.then(function(resolve) { console.log(2); });\n\nsetTimeout(function() { console.log('h') }, 0);\n\npromise.then(function(resolve) { console.log(3) });\n\nconsole.log('b');\n\n/*\n * The message queue contains all the events waiting to be executed by the browser (scripts, repaint, reflows/layouts, etc.). \n * They are added to the order they are triggered based on event triggering, timers, user input, DOM manipulation, etc.\n\n The event loop pulls from the message queue one at a time and\n adds them to the stack for execution.\n\n The job queue is a new queue that contains then() events added to the queue after the completion of a Promise. \n In theory the browser can pull from either queue when the event loop occurs. \n In practice, Promise jobs are given priority and that queue is emptied first. \n This is because the specification specifies then() to be executed after the current event on the call stack is finished.\n*/\n\n\n1\n2\n3\n4\n5\n6\n7\n[~/.../event-loop/promise-ejemplo(master)]$ node promise-job-queue.js \na\nb\n1\n2\n3\nh\n\n\n", "url": "/clases/2019/10/21/leccion.html" }, { "title": "Clase del Lunes 28/10/2019", "excerpt": "Lunes 28/10/2019\n\n", "content": "Lunes 28/10/2019\n\nEvent Loop in https://javascript.info/event-loop\n\n\n Event Loop: https://javascript.info/event-loop\n\n\nSplitting CPU-hungry tasks And Progress indication\n\nTo demonstrate the approach, for the sake of simplicity, instead of syntax-highlighting let’s take a function that counts from 1 to a big number.\n\n\n Splitting CPU-hungry tasks: https://javascript.info/event-loop#use-case-1-splitting-cpu-hungry-tasks\n Progress indication: https://javascript.info/event-loop#use-case-2-progress-indication\n\n\nFile p2-t1-c3-file-system/event-loop/splitting-cpu-hungry-task.html\n\n\n Ejecución: splitting-cpu-hungry-task.html\n\n\n1\n2\n3\n[~/.../p2-t1-c3-file-system/event-loop(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop\n[~/.../p2-t1-c3-file-system/event-loop(master)]$ cat splitting-cpu-hungry-task.html \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n<!DOCTYPE html>\n\n<div id=\"progress\"></div>\n\n<script>\n'use strict';\n\nlet start = Date.now();\n\nlet i = 0;\n\nlet chunk = () => {\n // do a piece of the heavy job (*)\n do {\n i++;\n } while (i % 1e5 != 0);\n progress.innerHTML = i;\n};\n\nlet stop = () => (i == 1e7);\n\nfunction count(task, condition) { \n if (condition()) {\n alert(\"Done in \" + (Date.now() - start) + 'ms');\n } else {\n setTimeout(() => count(task, condition)); // schedule the new call (**)\n };\n task();\n}\n\ncount(chunk, stop);\n</script>\n\n\nA single run of count does a part of the job, and then re-schedules itself if needed:\n\n\n First run counts: i=1…1e5.\n Second run counts: i=100001..200000.\n … etc.\n\n\nAnother benefit of splitting heavy tasks for browser scripts is that we can show progress indication.\n\nEjercicios en Promise Basics\n\nloadScript Exercise\n\nResolve and Reject\n\n1\n2\n3\n4\n5\n6\n7\nlet promise = new Promise(function(resolve, reject) {\n resolve(1);\n\n setTimeout(() => resolve(2), 1000);\n});\n\npromise.then(alert);\n\n\nWrite a setTimeout with Promises\n\nThe built-in function setTimeout uses callbacks. \nCreate a promise-based alternative.\n\nThe function delay(ms) should return a promise. \nThat promise should resolve after ms milliseconds, so that we can add .then to it, \nlike this:\n\n1\n2\n3\n4\n5\nfunction delay(ms) {\n // your code\n}\n\ndelay(3000).then(() => alert('runs after 3 seconds'));\n\n\n\n Solución\n\n\nExercises: Exceptions and Promises\n\n\n Exceptions and Promises\n\n\nPromise Chaining\n\n\n Promise Chaining\n tema2-async/exercises/promises/promise-chaining/\n\n\n", "url": "/clases/2019/10/28/leccion.html" }, { "title": "Clase del Lunes 04/11/2019 (Semana B)", "excerpt": "Lunes 04/11/2019\n\n", "content": "Lunes 04/11/2019\n\nPromise API\n\n\n Promise API explained at https://javascript.info/promise-api\n\n", "url": "/clases/2019/11/04/leccion.html" }, { "title": "Clase del Miércoles 06/11/2019 (Semana B)", "excerpt": "Miércoles 06/11/2019\n\n", "content": "Miércoles 06/11/2019\n\nExercise: Building Promise.all\n\n\n Blog view of the exercise description and solution:\n Repo view of the exercise description and solution: tema2-async/exercises/promises/promise-all\n Where is it:\n 1\n2\n~/.../promises/promise-all(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/promise-all\n \n \n\n\nPromisification\n\n\n Read: https://javascript.info/promisify\n Repo View: tema2-async/exercises/promises/promisify\n \n Blog view of the exercise description and solution:\n \n Where is it:\n 1\n2\n~/.../promises/promisify(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/promisify\n \n \n\n\nAsync/Await\n\n\n https://javascript.info/async-await\n\n\n1\n2\n3\n~/.../promises/async-await(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/async-await\n[~/.../promises/async-await(master)]$ cat github.html \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n<!DOCTYPE html>\n<script>\n 'use strict';\n async function showAvatar() {\n\n // read our JSON\n let response = await fetch('https://javascript.info/article/promise-chaining/user.json');\n let user = await response.json();\n\n // read github user\n let githubResponse = await fetch(`https://api.github.com/users/${user.name}`);\n let githubUser = await githubResponse.json();\n\n // show the avatar\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n\n // wait 3 seconds\n await new Promise((resolve, reject) => setTimeout(resolve, 3000));\n\n img.remove(); // removes the object from the tree it belongs to.\n return githubUser;\n }\n\n showAvatar();\n</script>\n\n\nRace Condition and Promises. Promise.all. Await and Async\n\nThis example illustrates how using promises\nwe can produce race conditions in JS.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/.../p2-t1-c3-file-system/event-loop(master)]$ cd race-condition\n[~/.../event-loop/race-condition(master)]$ pwd -P\n/Users/casiano/local/src/uai/uai2015/race-condition\n[~/.../event-loop/race-condition(master)]$ ls -l\ntotal 152\n-rw-r--r-- 1 casiano wheel 784 18 oct 11:41 README.md\n-rw-r--r-- 1 casiano wheel 1278 14 oct 17:53 index.html\n-rw-r--r--@ 1 casiano staff 59603 14 oct 14:44 infinity-loop.png\n-rw-r--r-- 1 casiano wheel 1437 18 oct 11:44 not-race-example.js\n-rw-r--r-- 1 casiano wheel 1656 18 oct 11:27 race-example.js\n[~/.../event-loop/race-condition(master)]$ cat race-example.js \n\n\n\n Yes, there are race conditions in JavaScript\n Can node.js code result in race conditions? StackOverflow\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n// An example race condition in JavaScript\n// When you run this script using Node or in a browser, it\n// does not print \"Ended with 0\", but a random number.\n// Even though the functions running\n// simply loop 100 iterations of adding and subtracting.\n// The reason the end result is random is because the\n// sleeps are of random duration and the time between the read\n// of the variable causes the eventual write to be incorrect\n// when `adder` and `subber` interleave.\n// This problem is similar to:\n// https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use\n\nlet number = 0;\nconst times = 100;\n\nfunction sleep() { \n return new Promise(\n (resolve) => setTimeout(resolve, Math.random() * 5));\n}\n\nasync function adder() {\n for (let i = 0; i < times; i++) {\n await sleep();\n\n let read = number; \n read = read + 1;\n\n await sleep(); // This task is interrupted here giving opportunity for 'subber' to take the processor\n\n number = read; // But there is a chance 'read' is obsolete. \n // It is a sort of \"manual\" co-routine race cndition: not atomic anymore\n }\n}\n\nasync function subber() {\n for (let i = 0; i < times; i++) {\n await sleep();\n let read = number;\n read = read - 1;\n await sleep();\n\n number = read;\n }\n}\n\nasync function main() {\n console.log(\"Started with\", number);\n\n await Promise.all([\n adder(),\n subber(),\n ]);\n /*\n await adder().then(subber)\n */\n\n console.log(\"Ended with\", number);\n}\n\nmain()\n .then(() => console.log(\"All done\"))\n .catch((err) => console.error(err));\n\n\nExecutions:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n[~/.../event-loop/race-condition(master)]$ node race-example.js \nStarted with 0\nEnded with -6\nAll done\n[~/.../event-loop/race-condition(master)]$ node race-example.js \nStarted with 0\nEnded with 7\nAll done\n[~/.../event-loop/race-condition(master)]$ node race-example.js \nStarted with 0\nEnded with 8\nAll done\n\n\n", "url": "/clases/2019/11/06/leccion.html" }, { "title": "Clase del Lunes 11/11/2019", "excerpt": "Clase del Lunes 11/11/2019 (Semana C)\n\n", "content": "Clase del Lunes 11/11/2019 (Semana C)\n\nChapter 20 of Eloquent JS\n\n\n https://ull-mii-sytws-1920.github.io/tema1-introduccion/practicas/p3-t1-c3-http/\n\n\nOn the section The HTTP module of the book\n\n\n See section of the EJS book: The HTTP module\n\n\nSimple Server\n1\n2\n3\n~/.../2019-11-04/the-http-module(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/chapter20-node-js-crguezl/the-http-module\n[~/.../2019-11-04/the-http-module(master)]$ cat simple-server.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\nconst port = 8000;\nconst ip = require(\"ip\");\nconst http = require(\"http\");\nconst ins =require('util').inspect;\nconst inspect = (x) => ins(x, {depth: null});\n\n// The Server object returned by createServer is an EventEmitter\nconst server = http.createServer(function(request, response) {\n /*\n The function passed as an argument to createServer is called every\n time a client tries to connect to the server. The request and\n response variables are objects representing the incoming and outgoing\n data. The first contains information about the request, such as its\n url property, which tells us to what URL the request was made.\n */\n response.writeHead(200, {\"Content-Type\": \"text/html\"});\n /*\n To send something back, you call methods on the response object.\n\n writeHead, will write out the response headers. \n You give it the status code (200 for \"OK\" in this case)\n and an object that contains header values. \n Here we tell the client\n that we will be sending back an HTML document.\n */\n response.write(`\n<h1>Hello!</h1>\n<p>You asked for \n<code>\n${request.url} \n<!-- The url is the full URL without the server, protocol or port. -->\n</code>\nusing the ${request.method} method\n</p>\n<p>Your headers:</p> \n<pre>\n${ins(request.headers)}\n</pre>\n`);\n\n /*\n The actual response body (the document itself) is sent with\n response.write. You are allowed to call this method multiple times\n if you want to send the response piece by piece, possibly streaming\n data to the client as it becomes available.\n */\n response.end();\n /* Finally, response.end signals the end of the response. */\n});\nserver.listen(port, ip.address(), () => {\n const host = server.address().address;\n const port = server.address().port;\n console.log('Example app listening at http://%s:%s', host, port)\n});\n/*\nThe call to server.listen causes the server to start waiting for\nconnections on port 8000. This is the reason you have to connect\nto localhost:8000, rather than just localhost (which would use the\ndefault port, 80), to speak to this server.\n*/\n\n\nIn fact, the Server object returned by createServer is an EventEmitter, \nand what we have here is just shorthand for creating a server object and then adding the listener later:\n\n1\n2\n3\n4\nconst server = http.createServer();\nserver.on('request', (request, response) => {\n // the same kind of magic happens here!\n});\n\n\nWhen an HTTP request hits the server, node calls the request handler function with a few handy objects for dealing with the transaction, request and response.\n\nThe url is the full URL without the server, protocol or port. For a typical URL, this means everything after and including the third forward slash.\n\nAll headers are represented in lower-case only, regardless of how the client actually sent them. This simplifies the task of parsing headers for whatever purpose.\n\n\n http.createServer doc\n server.listen doc\n response.writeHead doc\n response.write doc\n \n response.end\n \n HTTP Headers at developer.mozilla\n \n Content-Type\n \n \n\n\nSimple Client\n\n1\n2\n3\n/Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/chapter20-node-js-crguezl/the-http-module\n[~/.../2019-11-04/the-http-module(master)]$ \n[~/.../2019-11-04/the-http-module(master)]$ cat simple-client.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\nconst portNumber = 8000;\nconst ip = require(\"ip\");\nvar util = require(\"util\");\nvar http = require(\"http\");\nvar request = http.request(\n{ \n /* \n The first argument to request configures the request, telling Node\n what server to talk to, what path to request from that server, which\n method to use, and so on.\n */\n hostname: ip.address(), // \"eloquentjavascript.net\",\n port: portNumber,\n path: \"/20_node.html\",\n method: \"GET\",\n headers: {Accept: \"text/html\"}\n}, function(response) {\n /*\n The second argument is the function that should be called when a\n response comes in. It is given an object that allows us to inspect\n the response, for example to find out its status code.\n */\n response.on('data', (chunk) => {\n // chunk is a buffer. Avoid console.log since introduces a newline\n process.stdout.write(chunk.toString());\n });\n\n response.on('error', (err) => {\n console.error(err);\n });\n\n response.on('end', () => {\n console.log('reached end of response ');\n });\n console.log(\"Server responded with status code\",\n response.statusCode);\n //console.log(util.inspect(response), true, 1);\n /*\n Just like the response object we saw in the server, the object\n returned by request allows us to stream data into the request with\n the write method and finish the request with the end method. The\n example does not use write because GET requests should not contain\n data in their request body.\n */\n});\n/*\n This method signals to the server that all of the response headers and body have been sent; \n that server should consider this message complete. \n The method, response.end(), MUST be called on each response.\n*/\nrequest.end();\n\n\n\n http.request doc\n Class http.clientRequest doc. It represents an in-progress request whose header has already been queued\n\n\nRunning Server and Client\n\n1\n2\n[~/.../chapter20-node-js-crguezl/the-http-module(master)]$ node simple-server.js \nExample app listening at http://10.150.22.51:8000\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n~/.../chapter20-node-js-crguezl/the-http-module(master)]$ node simple-client.js \nServer responded with status code 200\n\n<h1>Hello!</h1>\n<p>You asked for \n<code>\n/20_node.html \n<!-- The url is the full URL without the server, protocol or port. -->\n</code>\nusing the GET method\n</p>\n<p>Your headers:</p> \n<pre>\n{ accept: 'text/html', host: '10.150.22.51:8000', connection: 'close' }\n</pre>\nreached end of response \n\n\nDebugging Node.js programs with Chrome\n\n\n Véase el apartado Debugging Node.js en la sección Node.js del Tema 1\n\n\nTesting the Server with Rest Clients\n\nAPI testing requires an application to interact with API. \nRest API can be tested with tools like:\n\n\n Insomnia\n Postman\n Curl\n\n\nExample Using Insomnia\n\n\n\n\n https://insomnia.rest/\n\n\nExample Using Postman\n\n\n\n\n https://www.getpostman.com/\n API Building and Testing Made Easier with Postman\n Postman docs\n\n\nExample Using curl\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n~/.../chapter20-node-js-crguezl/the-http-module(master)]$ curl -d \"param1=value1&param2=value2\" -H \"Content-Type: application/x-www-form-urlencoded\" -X POST http://10.150.22.51:8000/data\n\n<h1>Hello!</h1>\n<p>You asked for \n<code>\n/data \n<!-- The url is the full URL without the server, protocol or port. -->\n</code>\nusing the POST method\n</p>\n<p>Your headers:</p> \n<pre>\n{\n host: '10.150.22.51:8000',\n 'user-agent': 'curl/7.54.0',\n accept: '*/*',\n 'content-type': 'application/x-www-form-urlencoded',\n 'content-length': '27'\n}\n</pre>\n\n\n\n curl.md gist illustrating the use of curl\n\n\nLa práctica p3-t1-c3-http: Exercises from Chapter 20 of EJS\n\nSoluciones a la práctica\n\n\n \n Este repo https://github.com/ULL-MII-SYTWS-1920/eloquent-javascript-exercises/tree/master/20_3_public_space es un fork de un repo con soluciones por Juan Irache modificadas\n \n \n Soluciones por el autor del libro Marijn Haverbeke: https://eloquentjavascript.net/code/\n \n\n\nVídeo sobre la resolución de la Práctica del capítulo 20\n\nExplicando como escribir y comprobar el funcionamiento del requisito DIRECTORY CREATION usando insomnia:\n\n\n \n\n\n1\n2\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nconst {mkdir} = require(\"fs\").promises;\n\nmethods.MKCOL = async function(request) {\n let path = urlPath(request.url);\n let stats;\n try {\n stats = await stat(path);\n } catch (error) {\n if (error.code != \"ENOENT\") throw error;\n await mkdir(path);\n return {status: 204};\n }\n if (stats.isDirectory()) return {status: 204};\n else return {status: 400, body: \"Not a directory\"};\n};\n\n\nIdempotent REST APIs\n\n\n Idempotent REST APIs\n\n\nHTTP POST\n\nGenerally – not necessarily – POST APIs are used to create a new resource on server. So when you invoke the same POST request N times, you will have N new resources on the server. So, POST is not idempotent.\n\nHTTP PUT\n\nGenerally – not necessarily – PUT APIs are used to update the resource state. If you invoke a PUT API N times, the very first request will update the resource; then rest N-1 requests will just overwrite the same resource state again and again – effectively not changing anything. Hence, PUT is idempotent.\n\nHTTP DELETE\n\nWhen you invoke N similar DELETE requests, first request will delete the resource and response will be 200 (OK) or 204 (No Content). Other N-1 requests will return 404 (Not Found). Clearly, the response is different from first request, but there is no change of state for any resource on server side because original resource is already deleted. So, DELETE is idempotent.\n\nPlease keep in mind if some systems may have DELETE APIs like this:\n\nDELETE /item/last\n\nIn the above case, calling operation N times will delete N resources – hence DELETE is not idempotent in this case. In this case, a good suggestion might be to change above API to POST – because POST is not idempotent.\n\nPOST /item/last\n\nNow, this is closer to HTTP spec – hence more REST compliant.\n\nSTATUS\n\n\n 204\n\n\nGulp\n\nResources and References for this Lesson\n\n\n This class in GitHub pages\n See this repo with the solutions by Juan Irache to EJS exercises\n \n 20_3_a_public_space\n \n \n See section of the EJS book: The HTTP module\n Node.js docs: Anatomy of an HTTP Transaction\n\n\nChapter 3: Networking with Sockets\n\n\n Apuntes del tema Sockets\n Material suplementario\n Descripción de la práctica tema2-async/practicas/p4-t2-networking/\n GitHub Actions\n \n Repo de ejemplo con una solución y GitHub Actions p4-t2-networking-crguezl\n\n 1\n2\n [~/.../github-actions-learning/p4-t2-net-github-actions-crguezl(master)]$ pwd -P\n /Users/casiano/local/src/github-actions-learning/p4-t2-net-github-actions-crguezl\n \n \n\n\n", "url": "/clases/2019/11/11/leccion.html" }, { "title": "Clase del Lunes 18/11/2019", "excerpt": "Clase del Lunes 18/11/2019\n\n", "content": "Clase del Lunes 18/11/2019\n\nChapter 20 of Eloquent JS\n\n\n Chapter 20: Node.js\n Descripción de la Práctica http\n\n\nUsing Promises with node-fetch in the client\n\nMaking requests with Node’s raw functionality is rather verbose. There are much more convenient wrapper packages available on NPM. For example, node-fetch provides the promise-based fetch interface that is used in the browser.\n\n\n Fetch Living Standard\n\n\n1\n2\n3\n~/.../chapter20-node-js-crguezl/the-http-module(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/chapter20-node-js-crguezl/the-http-module\n~/.../chapter20-node-js-crguezl/the-http-module(master)]$ cat simple-client-promise.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\nconst portNumber = 8000;\nconst ip = require(\"ip\");\nconst fetch = require('node-fetch');\n\nconst hostname = ip.address(), \n port = portNumber,\n path = \"/20_node.html\";\n\nconst options = { \n method: \"DELETE\",\n headers: {Accept: \"text/html\"}\n };\n\nfetch(`http://${hostname}:${port}/${path}`, options)\n .then(r => { // r is a Response object which is a stream\n let p = r.text();\n console.log(p); // Promise { <pending> }\n return p;\n })\n .then( (r) => console.log(r))\n .catch( e => console.log(\"Hubieron errores:\\n\"+e));\n\n\nEjecución contra el server sencillo descrito en la lección del 11/11/2019:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n[~/.../chapter20-node-js-crguezl/the-http-module(master)]$ node simple-client-promise.js \nPromise { <pending> }\n\n<h1>Hello!</h1>\n<p>You asked for \n<code>\n//20_node.html \n<!-- The url is the full URL without the server, protocol or port. -->\n</code>\nusing the DELETE method\n</p>\n<p>Your headers:</p> \n<pre>\n{\n accept: 'text/html',\n 'user-agent': 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)',\n 'accept-encoding': 'gzip,deflate',\n connection: 'close',\n host: '10.150.22.51:8000'\n}\n</pre>\n\n\n Options for fetch\n\n\nRewriting the client with async-await\n\n1\n2\n3\n[~/.../chapter20-node-js-crguezl/the-http-module(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/chapter20-node-js-crguezl/the-http-module\n[~/.../chapter20-node-js-crguezl/the-http-module(master)]$ cat simple-client-await.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\nconst portNumber = 8000;\nconst ip = require(\"ip\");\nconst fetch = require('node-fetch');\n\nconst hostname = ip.address(), \n port = portNumber,\n path = \"/20_node.html\";\n\nconst options = { \n method: \"DELETE\",\n headers: {Accept: \"text/html\"}\n };\n\n(async () => {\n try {\n let r = await fetch(`http://${hostname}:${port}/${path}`, options);\n let t = await r.text();\n console.log(t); \n }\n catch (e) {\n console.log(\"Hubieron errores:\\n\"+e);\n }\n})()\n\n\nPeople who are just starting to use await tend to forget the fact that we can’t use await in top-level code.\nThe solution is to wrap it into an anonymous async function.\n\n1\n2\n3\n4\n5\n(async () => {\n let response = await fetch('/article/promise-chaining/user.json');\n let user = await response.json();\n ...\n})();\n\n\nLa práctica p3-t1-c3-http: Exercises from Chapter 20 of EJS\n\nPara ver una solución a la práctica repase la sección *soluciones a la Práctica de la clase del 11/11/2019.\n\n1\n2\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space\n\nQuote from the EJS book hints for this exercise:\n\n\n You can use the function that implements the DELETE method as a blueprint for the MKCOL method. When no file is found, try to create a directory with mkdir. When a directory exists at that path, you can return a 204 response so that directory creation requests are idempotent. If a nondirectory file exists here, return an error code. Code 400 (bad request) would be appropriate.\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nconst {mkdir, stat} = require(\"fs\").promises;\n\nmethods.MKCOL = async function(request) {\n let path = urlPath(request.url);\n let stats;\n try {\n stats = await stat(path);\n } catch (error) {\n if (error.code != \"ENOENT\") throw error;\n await mkdir(path);\n return {status: 204}; // NO CONTENT\n }\n if (stats.isDirectory()) return {status: 204};\n else return {status: 400, body: \"Not a directory\"};\n};\n\n\nIdempotent REST APIs\n\n\n A Web service is defined as “a software system designed to support interoperable machine-to-machine interaction over a network”. \nWeb services are frequently just Web APIs that can be accessed over a network, such as the Internet, and executed on a remote system hosting the requested services.\n \n Representational state transfer (REST) is a software architectural style that defines a set of constraints to be used for creating Web services.\n \n Idempotent REST APIs\n\n\n\n When you design REST APIs, you must realize that API consumers can make mistakes. They can write client code in such a way that there can be duplicate requests as well. These duplicate requests may be unintentional as well as intentional some time (e.g. due to timeout or network issues). You have to design fault-tolerant APIs in such a way that duplicate requests do not leave the system unstable.\n\n\nSee also What are idempotent and/or safe methods? del libro restcookbook.com/\n\nSafe methods are methods that can be cached, prefetched without any repercussions to the resource.\n\nHTTP POST\n\nGenerally – not necessarily – POST APIs are used to create a new resource on server. So when you invoke the same POST request N times, you will have N new resources on the server. So, POST is not idempotent.\n\nHTTP PUT\n\nGenerally – not necessarily – PUT APIs are used to update the resource state. If you invoke a PUT API N times, the very first request will update the resource; then rest N-1 requests will just overwrite the same resource state again and again – effectively not changing anything. Hence, PUT is idempotent.\n\nRecuerda la definición de idempotente:\n\n\n when making multiple identical requests has the same effect as making a single request\n\n\nSi el request es idéntico el fichero no cambiará en los subsiguientes requests\n\nHTTP DELETE\n\nWhen you invoke N similar DELETE requests, first request will delete the resource and response will be 200 (OK) or 204 (No Content). Other N-1 requests will return 404 (Not Found).\n\nClearly, the response is different from first request, but there is no change of state for any resource on server side because original resource is already deleted. So, DELETE is idempotent.\n\nPlease keep in mind if some systems may have DELETE APIs like this:\n\nDELETE /item/last\n\nIn the above case, calling operation N times will delete N resources – hence DELETE is not idempotent in this case. In this case, a good suggestion might be to change above API to POST – because POST is not idempotent.\n\nPOST /item/last\n\nNow, this is closer to HTTP spec – hence more REST compliant.\n\nResumen de los Distintos Métodos\n\n\n HTTP MethodIdempotentSafe\n OPTIONS yes yes\n GET yes yes\n HEAD yes yes\n PUT yes no \n POST no no \n DELETE yes no \n PATCH no no \n\n\n\n See So when is PATCH not idempotent, then?\n\n\nResources and References for this Lesson\n\n\n This class in GitHub pages\n See this repo with the solutions by Juan Irache to EJS exercises\n \n 20_3_a_public_space\n \n \n See section of the EJS book: The HTTP module\n Node.js docs: Anatomy of an HTTP Transaction\n\n", "url": "/clases/2019/11/18/leccion.html" }, { "title": "Clase del Lunes 25/11/2019", "excerpt": "Clase del Lunes 25/11/2019\n\n", "content": "Clase del Lunes 25/11/2019\n\nChapter 20 of Eloquent JS\n\n\n Chapter 20: Node.js\n Descripción de la Práctica http\n\n\nIdempotent REST APIs\n\n\n A Web service is defined as a software system designed to support interoperable machine-to-machine interaction over a network. \nWeb services are frequently just Web APIs that can be accessed over a network, such as the Internet, and executed on a remote system hosting the requested services.\n \n Representational state transfer (REST) is a software architectural style that defines a set of constraints to be used for creating Web services.\n \n Idempotent REST APIs\n\n\n\n When you design REST APIs, you must realize that API consumers can make mistakes. They can write client code in such a way that there can be duplicate requests as well. These duplicate requests may be unintentional as well as intentional some time (e.g. due to timeout or network issues). You have to design fault-tolerant APIs in such a way that duplicate requests do not leave the system unstable.\n\n\nSee also What are idempotent and/or safe methods? del libro restcookbook.com/\n\nSafe methods are methods that can be cached, prefetched without any repercussions to the resource.\n\nHTTP POST\n\nGenerally – not necessarily – POST APIs are used to create a new resource on server. So when you invoke the same POST request N times, you will have N new resources on the server. So, POST is not idempotent.\n\nHTTP PUT\n\nGenerally – not necessarily – PUT APIs are used to update the resource state. If you invoke a PUT API N times, the very first request will update the resource; then rest N-1 requests will just overwrite the same resource state again and again – effectively not changing anything. Hence, PUT is idempotent.\n\nRecuerda la definición de idempotente:\n\n\n when making multiple identical requests has the same effect as making a single request\n\n\nSi el request es idéntico el fichero y el nombre del fichero el estado del servidor no cambiará en los subsiguientes requests.\n\nSi hubieramos hecho una implementación que creara un fichero nuevo con cada request\n(por ejemplo añadiendo un sufijo .1, .2, etc. al nombre del fichero por cada request)\nnuestra implementación de PUT dejaría de ser idempotente.\n\nHTTP DELETE\n\nWhen you invoke N similar DELETE requests, first request will delete the resource and response will be 200 (OK) or 204 (No Content). Other N-1 requests will return 404 (Not Found).\n\nClearly, the response is different from first request, but there is no change of state for any resource on server side because original resource is already deleted. So, DELETE is idempotent.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nconst {rmdir, unlink} = require(\"fs\").promises;\n\nmethods.DELETE = async function(request) {\n let path = urlPath(request.url);\n let stats;\n try {\n stats = await stat(path);\n } catch (error) {\n if (error.code != \"ENOENT\") throw error;\n else return {status: 204};\n }\n if (stats.isDirectory()) await rmdir(path);\n else await unlink(path);\n return {status: 204};\n};\n\n\nPlease keep in mind if some systems may have DELETE APIs like this:\n\nDELETE /item/last\n\nIn the above case, calling operation N times will delete N resources – hence DELETE is not idempotent in this case. In this case, a suggestion might be to change above API to POST – because POST is not idempotent.\n\nPOST /item/last\n\nNow, this is closer to HTTP spec – hence more REST compliant.\n\nResumen de los Distintos Métodos\n\n\n HTTP MethodIdempotentSafe\n OPTIONS yes yes\n GET yes yes\n HEAD yes yes\n PUT yes no \n POST no no \n DELETE yes no \n PATCH no no \n\n\n\n See So when is PATCH not idempotent, then?\n\n\nTo illustrate an example of a server implementation of a non-idempotent PATCH, suppose there is a /users resource, and suppose that calling GET /users returns a list of users, currently:\n\n1\n[{ \"id\": 1, \"username\": \"firstuser\", \"email\": \"firstuser@example.org\" }]\n\n\nRather than PATCHing /users/{id}, suppose the server allows PATCHing /users. \nLet’s issue this PATCH request:\n\n1\n2\nPATCH /users\n[{ \"op\": \"add\", \"username\": \"newuser\", \"email\": \"newuser@example.org\" }]\n\nThe op is add, so a new user is added to the list.\nOur patch document instructs the server to add a new user called newuser to the list of users. \nAfter calling this the first time, GET /users would return:\n\n1\n2\n[{ \"id\": 1, \"username\": \"firstuser\", \"email\": \"firstuser@example.org\" },\n { \"id\": 2, \"username\": \"newuser\", \"email\": \"newuser@example.org\" }]\n\n\nNow, if we issue the exact same PATCH request as above, what happens? (Let’s assume that the /users resource allows duplicate usernames.) \nThe op is add, so a new user is added to the list, and a subsequent GET /users returns:\n\n1\n2\n3\n[{ \"id\": 1, \"username\": \"firstuser\", \"email\": \"firstuser@example.org\" },\n { \"id\": 2, \"username\": \"newuser\", \"email\": \"newuser@example.org\" },\n { \"id\": 3, \"username\": \"newuser\", \"email\": \"newuser@example.org\" }]\n\n\nThe /users resource has changed again, even though we issued the exact same PATCH against the exact same endpoint. This particular PATCH is not idempotent.\n\nAlthough PATCH isn’t guaranteed to be idempotent, there’s nothing in the PATCH specification to prevent you from making all PATCH operations on your \nparticular server idempotent.\n\nSTATUS\n\n\n 204\n\n\n204:\n\n\n \n The server has successfully fulfilled the request and that there is no additional content to send in the response payload body.\n \n \n A 204 response is terminated by the first empty line after the header fields because it cannot contain a message body.\n \n \n A 204 response is cacheable by default\n \n\n\nUn experimento: si añadimos un body a una respuesta 204 en el código de la práctica:\n\n1\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ git diff -U12 server.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\ndiff --git a/20_3_public_space/server.js b/20_3_public_space/server.js\nindex 79d3f5d..3fa658a 100644\n--- a/20_3_public_space/server.js\n+++ b/20_3_public_space/server.js\n@@ -83,25 +83,25 @@ const { createWriteStream } = require('fs');\n function pipeStream(from, to) {\n return new Promise((resolve, reject) => {\n from.on('error', reject);\n to.on('error', reject);\n to.on('finish', resolve);\n from.pipe(to);\n });\n }\n \n methods.PUT = async function(request) {\n let path = urlPath(request.url);\n await pipeStream(request, createWriteStream(path));\n- return { status: 204 };\n+ return { status: 204, body: path };\n };\n\n\n… Y hacemos un request con PUT, observamos que el status 204 hace que no llegue ningún cuerpo al cliente:\n\n\n ServerClient\n \n \n $ nodemon server.js \n [nodemon] 1.11.0\n [nodemon] to restart at any time, enter `rs`\n [nodemon] watching: *.*\n [nodemon] starting `node server.js`\n method= PUT url=/tutu.txt\n \n \n $ curl -X PUT -d \"hello world!\" localhost:8000/tutu.txt\n $ \n \n \n \n The server returns a 204\n No body received\n \n\n\nIf now we change the code to return a status 200:\n1\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ git diff server.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\ndiff --git a/20_3_public_space/server.js b/20_3_public_space/server.js\nindex 79d3f5d..66fa8b9 100644\n--- a/20_3_public_space/server.js\n+++ b/20_3_public_space/server.js\n@@ -92,7 +92,7 @@ function pipeStream(from, to) {\n methods.PUT = async function(request) {\n let path = urlPath(request.url);\n await pipeStream(request, createWriteStream(path));\n- return { status: 204 };\n+ return { status: 200, body: path };\n };\n\nAnd execute the same request, we get the body (the path to the modified file):\n1\n2\n$ curl -X PUT -d \"hello world!\" localhost:8000/tutu.txt\n/Users/casiano/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space/tutu.txt\n\n\nGulp: a tool to Automate and Enhance your Workflow\n\n\n Learning the Basics of Gulp\n\n\nJAM Stack\n\nJekyll\n\nRecuerda que GitHub provee un servicio de Hosting de páginas estáticas (GitHub Pages) que se sirven mediante Jekyll.\n\nEn las prácticas que siguen, práctica a usar Jekyll desplegando el finrome en GitHub Pages.\n\nFor more details, see section Jekyll\n\nJekyll en tu máquina\n\nTo run the blog in your machine you need a Gemfile:\n\n\n Using Jekyll with Bundler\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ bundle init\nWriting new Gemfile to /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/Gemfile\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ bundle exec jekyll serve\nConfiguration file: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/_config.yml\n Source: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs\n Destination: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/_site\n Incremental build: disabled. Enable with --incremental\n Generating... \n done in 0.303 seconds.\n Auto-regeneration: enabled for '/Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs'\n Server address: http://127.0.0.1:4000/p3-t1-c3-http-p2-t1-c3-filesystem-omarperezznakar/\n Server running... press ctrl-c to stop.\n\nThe reason the server is listening at that address is because the value\ngiven to baseurl\nin the configuration file _config.yml:\n\n1\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ cat _config.yml \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n# Site settings\ntitle: Práctica 4\nemail: alu0100945645@ull.edu.es\ndescription: > # this means to ignore newlines until \"baseurl:\"\n Write an awesome description for your new site here. You can edit this\n line in _config.yml. It will appear in your document head meta (for\n Google search results) and in your feed.xml site description.\nbaseurl: \"/p3-t1-c3-http-p2-t1-c3-filesystem-omarperezznakar\" # the subpath of your site, e.g. /blog/\nurl: \"http://jekyll.github.io\" # the base hostname & protocol for your site\ntwitter_username: jekyllrb\ngithub_username: jekyll\nauthor: Omar Patricio Pérez Znakar\n\n# Build settings\nmarkdown: kramdown\npermalink: /:year/:title:output_ext\n\n\n\n\nGastby\n\nGatsby is a React-based, GraphQL powered, static site generator.\n\nChapter 3: Networking with Sockets\n\n\n Apuntes del tema Sockets\n Material suplementario\n Descripción de la práctica tema2-async/practicas/p4-t2-networking/\n GitHub Actions\n \n Repo de ejemplo con una solución y GitHub Actions p4-t2-networking-crguezl\n\n 1\n2\n [~/.../github-actions-learning/p4-t2-net-github-actions-crguezl(master)]$ pwd -P\n /Users/casiano/local/src/github-actions-learning/p4-t2-net-github-actions-crguezl\n \n \n\n\nLa Librería: lib/ldj-client.js\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ldj-client.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\nconst { EventEmitter } = require(\"events\");\n\nconst net = require(\"net\");\n\nconst EOM = \"\\n\";\n\nclass LDJClient extends EventEmitter {\n constructor(stream) {\n super();\n let buffer = \"\";\n\n stream.on(\"data\", data => {\n try {\n buffer += data;\n let boundary = buffer.indexOf(EOM);\n while (boundary !== -1) {\n const input = buffer.substring(0, boundary);\n buffer = buffer.substring(boundary+1);\n this.emit('message', JSON.parse(input));\n boundary = buffer.indexOf(EOM);\n }\n } catch(e) {\n console.log(\"remaining buffer = \"+buffer)\n console.log(e);\n }\n });\n\n stream.on('close', () => {\n if (buffer.length > 0) {\n const input = buffer.toString();\n try {\n this.emit('message', JSON.parse(input));\n } catch (e) {\n throw new Error('Not a JSON message '+e);\n }\n } \n this.emit('close');\n });\n }\n\n /*\n A static method is attached to the LDJClient class rather than\n to individual instances.\n */\n static connect(...args) {\n /*\n The connect method is a convenience\n for consumers so that they don't have to use new LDJClient to\n create a new instance of LDJClient\n */\n let stream = net.connect(...args);\n return new LDJClient(stream);\n }\n\n}\n\nmodule.exports = LDJClient;\n\n\n\n \n net.createConnection(options[, connectListener]) (net.connect es un sinónimo de net.createConnection)\n \n \n Algunos métodos de los objetos de la clase EventEmitter:\n \n\n\n\n\nEl cliente\n\nEl código del cliente:\n\n1\n$ cat net-watcher-ldj-client.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n'use strict';\nconst ins = require(\"lib/ins.js\");\nconst PORT = require(\"./port.js\");\n\nconst LDJClient = require(\"lib/ldj-client.js\");\nconst ldjClient = LDJClient.connect({port: PORT});\n\nldjClient.on(\"message\", message => {\n console.log(\"received data: \"+ ins(message));\n});\n\n\nEl módulo auxiliar:\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ins.js \n\n\n1\n2\n3\nconst inspect = require(\"util\").inspect;\n\nmodule.exports = (x) => inspect(x, {depth: Infinity, colors: true});\n\n\n1\n2\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat port.js \nmodule.exports = 60300;\n\n\nServidor\n\nVamos a construir una clase lib/ldj-server.js para que los sockets sepan enviar \nmensajes de acuerdo con el protocolo LDJ\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ldj-server.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\nconst net = require(\"net\");\nconst EOM = \"\\n\";\n\nclass LDJServer extends net.Server {\n\n static toLDJSocket(socket) {\n socket.send = message => socket.write(JSON.stringify(message)+EOM);\n } \n\n static createServer(...args) {\n let connectionListener = args.pop();\n return net.createServer(...args, socket => {\n this.toLDJSocket(socket); \n return connectionListener(socket);\n })\n }\n}\n\nmodule.exports = LDJServer;\n\n\nLo que hacemos en la clase LDJServer as modificar createServerpara que el objeto Socket disponga de un método send que \nenvía un mensaje siguiendo el protocolo LDJ.\n\nAhora el código del servidor queda así:\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat net-watcher-json-service.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n'use strict';\n\nconst PORT = require(\"./port.js\");\nconst LDJServer = require(\"./lib/ldj-server.js\");\nconst fs = require(\"fs\");\n\nLDJServer.toLDJSocket(process.stdout);\n\nconst fileName = process.argv[2] || '.';\n\n// Only one watcher, not a watcher per client as in the book\nconst watcher = fs.watch(fileName, { recursive: true }); \n\nLDJServer.createServer(connection => {\n console.log('Subscriber connected');\n\n connection.send({type: \"watching\", target: fileName});\n watcher.on('change', (eventType, filename) => {\n if (filename) {\n let message = { type: eventType, timestamp: Date.now(), target: filename };\n process.stdout.send(message);\n connection.send(message);\n }\n });\n\n connection.on(\"close\", () => {\n console.log(\"Subscriber disconnected\");\n });\n}).listen(PORT, () => console.log(\"listening on port \"+PORT));\n\n\nRunning Server and Client\n\n\n ServerClient\n \n \n$ node net-watcher-json-service.js\nlistening on port 60300\nSubscriber connected\n{\"type\":\"change\",\"timestamp\":1574757343821,\"target\":\"target.txt\"}\n \n \n$ node net-watcher-ldj-client.js \nreceived data: { type: 'watching', target: '.' }\nreceived data: { type: 'change', timestamp: 1574757343821, target: 'target.txt' }\n \n \n \n Salida para el comando \n touch target.txt\n \n\n\nThe Observer Pattern\n\n\n The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.\n\n\n\n\nSee also\n\n\n Learning JavaScript Design Patterns. A book by Addy Osmani\n\n\nResources and References for this Lesson\n\n\n Real-Time Chat With Node.js’ Readline & Socket.io\n Para leer: How to code your own event emitter in Node.js: a step-by-step guide por Rajesh Pillai\n This class in GitHub pages\n See this repo with the solutions by Juan Irache to EJS exercises\n \n 20_3_a_public_space\n \n \n See section of the EJS book: The HTTP module\n Node.js docs: Anatomy of an HTTP Transaction\n\n", "url": "/clases/2019/11/25/leccion.html" }, { "title": "Clase del Miércoles 27/11/2019", "excerpt": "Clase del Miércoles 27/11/2019\n\n", "content": "Clase del Miércoles 27/11/2019\n\nChapter 3: Networking with Sockets\n\nThe Observer Pattern\n\n\n The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.\n\n\n\n\nSee also\n\n\n Learning JavaScript Design Patterns. A book by Addy Osmani\n\n\nLa Clase EventEmitter\n\n\n Algunos métodos de los objetos de la clase EventEmitter:\n\n\n\n\non\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ node\nWelcome to Node.js v12.10.0.\nType \".help\" for more information.\n> const {EventEmitter} = require(\"events\")\nundefined\n> function c1() { console.log('an event occurred!');}\nundefined\n> function c2() { console.log('yet another event occurred!');}\nundefined\n> const myEmitter = new EventEmitter();\nundefined\n> myEmitter.on('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] { eventOne: [Function: c1] },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.on('eventOne', c2)\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ]\n },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne');\nan event occurred!\nyet another event occurred!\ntrue\n\nonce\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n> myEmitter.once('eventOnce', () => console.log('eventOnce once fired')); \nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n eventOnce: [Function: bound onceWrapper] { listener: [Function] }\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOnce');\neventOnce once fired\ntrue\n> myEmitter.emit('eventOnce');\nfalse\n> myEmitter.emit('eventOnce');\nfalse\n\nArgumentos\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n> myEmitter.on('status', (code, msg)=> console.log(`Got ${code} and ${msg}`));\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('status', 200, 'ok');\nGot 200 and ok\n\n\noff\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n> myEmitter.off('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [Function: c2],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne'); \nyet another event occurred!\ntrue\n\n\nlistenerCount and rawListeners\n\n1\n2\n3\n4\n> myEmitter.listenerCount('eventOne')\n1\n> myEmitter.rawListeners('eventOne')\n[ [Function: c2] ]\n\n\nEjercicio\n\nVamos ahora a escribir una clase WithTime cuyos objetos disponen de un método execute que permite ejecutar \nuna función asíncrona asyncfun que acepta como último argumento una callback cb.\n\nComo es habitual, se supone que la callback es llamada cb(err, data) por asyncfun cuando esta termina su tarea asíncrona.\n\nEl primer parámetro err indica el error si lo hubo y el segundo data con el resultado de la operación asíncrona: cb(err, data).\n\nSe pide que:\n\n\n La función execute emita eventos begin y end señalando el comienzo y final de la ejecución de asyncfun\n Deberá así mismo emitir un evento result con el resultado de la operación asíncrona.\n Deberá emitir un evento time indicando el tiempo que ha tomado la ejecución en nanosegundos (use process.hrtime.bigint para ello)\n\n\nPor ejemplo, un código como:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\nconst inspect = require(\"util\").inspect;\nconst ins = (x) => inspect(x, {depth: Infinity, colors: true});\nconst fetch = require(\"node-fetch\");\nconst WithTime = require(\"./with-time.js\");\n\nconst withTime = new WithTime();\n\nwithTime.on('begin', (label) => console.log('About to execute '+label));\n\nwithTime.on('end', (label) => console.log('Done with execution of '+label));\n\nwithTime.on('result', (label, data) => console.log('Function '+label+' produced:\\n'+ins(data)));\n\nwithTime.on('time', (label, t) => console.log('Function '+label+' took '+t+' nanoseconds'));\n\nconst readFile = (url, cb) => {\n fetch(url)\n .then((resp) => resp.json())\n .then(function(data) {\n cb(null, data);\n })\n .catch(e => console.log(`Buf!\\n${e}`));\n}\n\nwithTime.execute(readFile, 'https://jsonplaceholder.typicode.com/posts/3');\n\n\nDebería producir una salida como está:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nAbout to execute readFile\nFunction readFile produced:\n{\n userId: 1,\n id: 3,\n title: 'ea molestias quasi exercitationem repellat qui ipsa sit aut',\n body: 'et iusto sed quo iure\\n' +\n 'voluptatem occaecati omnis eligendi aut ad\\n' +\n 'voluptatem doloribus vel accusantium quis pariatur\\n' +\n 'molestiae porro eius odio et labore et velit aut'\n}\nFunction readFile took 331675217 nanoseconds\nDone with execution of readFile\n\n\nEsta es una Solución\n\n1\n[~/.../networking-with-sockets-chapter-3-crguezl/event-emitter-tutorial(master)]$ cat with-time.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\nconst { EventEmitter } = require(\"events\");\n\nclass WithTime extends EventEmitter {\n\n // This function executes asyncFunc(...args)\n execute(asyncFunc, ...args) {\n let label = asyncFunc.name;\n\n this.emit('begin', label);\n let old = process.hrtime.bigint();\n asyncFunc(...args, (err, data) => {\n if (err) { \n this.emit('error', err); \n } else {\n this.emit('result', label, data);\n this.emit('time', label, process.hrtime.bigint() - old);\n this.emit('end', label);\n }\n });\n }\n\n}\n\nmodule.exports = WithTime;\n\n\nPráctica p4-t2-networking. La Librería: lib/ldj-client.js\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ldj-client.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\nconst { EventEmitter } = require(\"events\");\n\nconst net = require(\"net\");\n\nconst EOM = \"\\n\";\n\nclass LDJClient extends EventEmitter {\n constructor(stream) {\n super();\n let buffer = \"\";\n\n stream.on(\"data\", data => {\n try {\n buffer += data;\n let boundary = buffer.indexOf(EOM);\n while (boundary !== -1) {\n const input = buffer.substring(0, boundary);\n buffer = buffer.substring(boundary+1);\n this.emit('message', JSON.parse(input));\n boundary = buffer.indexOf(EOM);\n }\n } catch(e) {\n console.log(\"remaining buffer = \"+buffer)\n console.log(e);\n }\n });\n\n stream.on('close', () => {\n if (buffer.length > 0) {\n const input = buffer.toString();\n try {\n this.emit('message', JSON.parse(input));\n } catch (e) {\n throw new Error('Not a JSON message '+e);\n }\n } \n this.emit('close');\n });\n }\n\n /*\n A static method is attached to the LDJClient class rather than\n to individual instances.\n */\n static connect(...args) {\n /*\n The connect method is a convenience\n for consumers so that they don't have to use new LDJClient to\n create a new instance of LDJClient\n */\n let stream = net.connect(...args);\n return new LDJClient(stream);\n }\n\n}\n\nmodule.exports = LDJClient;\n\n\n\n net.createConnection(options[, connectListener]) (net.connect es un sinónimo de net.createConnection)\n\n\np4-t2-networking: El cliente\n\nEl código del cliente:\n\n1\n$ cat net-watcher-ldj-client.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n'use strict';\nconst ins = require(\"lib/ins.js\");\nconst PORT = require(\"./port.js\");\n\nconst LDJClient = require(\"lib/ldj-client.js\");\nconst ldjClient = LDJClient.connect({port: PORT});\n\nldjClient.on(\"message\", message => {\n console.log(\"received data: \"+ ins(message));\n});\n\n\nEl módulo auxiliar:\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ins.js \n\n\n1\n2\n3\nconst inspect = require(\"util\").inspect;\n\nmodule.exports = (x) => inspect(x, {depth: Infinity, colors: true});\n\n\n1\n2\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat port.js \nmodule.exports = 60300;\n\n\nEl Servidor de p4-t2-networking\n\nVamos a construir una clase lib/ldj-server.js para que los sockets sepan enviar \nmensajes de acuerdo con el protocolo LDJ\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat lib/ldj-server.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\nconst net = require(\"net\");\nconst EOM = \"\\n\";\n\nclass LDJServer extends net.Server {\n\n static toLDJSocket(socket) {\n socket.send = message => socket.write(JSON.stringify(message)+EOM);\n } \n\n static createServer(...args) {\n let connectionListener = args.pop();\n return net.createServer(...args, socket => {\n this.toLDJSocket(socket); \n return connectionListener(socket);\n })\n }\n}\n\nmodule.exports = LDJServer;\n\n\nLo que hacemos en la clase LDJServer as modificar createServerpara que el objeto Socket disponga de un método send que \nenvía un mensaje siguiendo el protocolo LDJ.\n\nAhora el código del servidor queda así:\n\n1\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ cat net-watcher-json-service.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n'use strict';\n\nconst PORT = require(\"./port.js\");\nconst LDJServer = require(\"./lib/ldj-server.js\");\nconst fs = require(\"fs\");\n\nLDJServer.toLDJSocket(process.stdout);\n\nconst fileName = process.argv[2] || '.';\n\n// Only one watcher, not a watcher per client as in the book\nconst watcher = fs.watch(fileName, { recursive: true }); \n\nLDJServer.createServer(connection => {\n console.log('Subscriber connected');\n\n connection.send({type: \"watching\", target: fileName});\n watcher.on('change', (eventType, filename) => {\n if (filename) {\n let message = { type: eventType, timestamp: Date.now(), target: filename };\n process.stdout.send(message);\n connection.send(message);\n }\n });\n\n connection.on(\"close\", () => {\n console.log(\"Subscriber disconnected\");\n });\n}).listen(PORT, () => console.log(\"listening on port \"+PORT));\n\n\nRunning Server and Client en p4-t2-networking\n\n\n ServerClient\n \n \n$ node net-watcher-json-service.js\nlistening on port 60300\nSubscriber connected\n{\"type\":\"change\",\"timestamp\":1574757343821,\"target\":\"target.txt\"}\n \n \n$ node net-watcher-ldj-client.js \nreceived data: { type: 'watching', target: '.' }\nreceived data: { type: 'change', timestamp: 1574757343821, target: 'target.txt' }\n \n \n \n Salida para el comando \n touch target.txt\n \n\n\nResources and References for this Section\n\n\n Apuntes del tema Sockets\n PDFs y Material suplementario\n Descripción de la práctica tema2-async/practicas/p4-t2-networking/\n GitHub Actions\n \n Repo de ejemplo con una solución y GitHub Actions p4-t2-networking-crguezl\n\n 1\n2\n [~/.../github-actions-learning/p4-t2-net-github-actions-crguezl(master)]$ pwd -P\n /Users/casiano/local/src/github-actions-learning/p4-t2-net-github-actions-crguezl\n \n \n Real-Time Chat With Node.js’ Readline & Socket.io\n Para leer: How to code your own event emitter in Node.js: a step-by-step guide por Rajesh Pillai\n This class in GitHub pages\n\n\nJAM Stack\n\nJekyll\n\nRecuerda que GitHub provee un servicio de Hosting de páginas estáticas (GitHub Pages) que se sirven mediante Jekyll.\n\nEn las prácticas que siguen, práctica a usar Jekyll desplegando el proyecto en GitHub Pages.\n\nFor more details, see section Jekyll\n\nJekyll en tu máquina\n\nTo run the blog in your machine you need a Gemfile:\n\n\n Using Jekyll with Bundler\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ bundle init\nWriting new Gemfile to /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/Gemfile\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ bundle exec jekyll serve\nConfiguration file: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/_config.yml\n Source: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs\n Destination: /Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs/_site\n Incremental build: disabled. Enable with --incremental\n Generating... \n done in 0.303 seconds.\n Auto-regeneration: enabled for '/Users/casiano/campus-virtual/1920/sytws1920/eval/p4-t2-networking/p4-t2-networking-Omar97perez/docs'\n Server address: http://127.0.0.1:4000/p3-t1-c3-http-p2-t1-c3-filesystem-omarperezznakar/\n Server running... press ctrl-c to stop.\n\nThe reason the server is listening at that address is because the value\ngiven to baseurl\nin the configuration file _config.yml:\n\n1\n[~/.../p4-t2-networking-Omar97perez/docs(master)]$ cat _config.yml \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n# Site settings\ntitle: Práctica 4\nemail: alu0100945645@ull.edu.es\ndescription: > # this means to ignore newlines until \"baseurl:\"\n Write an awesome description for your new site here. You can edit this\n line in _config.yml. It will appear in your document head meta (for\n Google search results) and in your feed.xml site description.\nbaseurl: \"/p3-t1-c3-http-p2-t1-c3-filesystem-omarperezznakar\" # the subpath of your site, e.g. /blog/\nurl: \"http://jekyll.github.io\" # the base hostname & protocol for your site\ntwitter_username: jekyllrb\ngithub_username: jekyll\nauthor: Omar Patricio Pérez Znakar\n\n# Build settings\nmarkdown: kramdown\npermalink: /:year/:title:output_ext\n\n\n\n\nGastby\n\nGatsby is a React-based, GraphQL powered, static site generator.\n\nPráctica p8-t3-jekyll-netlify\n\nHagamos la práctica p8-t3-jekyll-netlify\n\n\n Práctica p8-t3-jekyll-netlify\n\n\n", "url": "/clases/2019/11/27/leccion.html" }, { "title": "Clase del Lunes 02/12/2019", "excerpt": "Clase del Lunes 02/12/2019\n\n", "content": "Clase del Lunes 02/12/2019\n\nRecuerda que GitHub provee un servicio de Hosting de páginas estáticas (GitHub Pages) que se sirven mediante Jekyll.\n\nEn las prácticas que siguen, práctica a usar Jekyll desplegando el proyecto en GitHub Pages.\n\nFor more details, see section Jekyll\n\nAdding a Simple Search to our Jekyll Site\n\nEl ejercicio consiste en que añada la capacidad de búsqueda al sitio asociado a alguna de las prácticas, por ejemplo a p8-t3-jekyll-netlify.\n\nEstos son algunos requisitos:\n\n\n Queremos que busque en todos los ficheros, no solo los de los posts sino también los de las páginas\n Que admita expresiones regulares\n Queremos que los resultados vayan apareciendo conforme tecleamos\n Se mostrará una lista de enlaces a los ficheros que contienen la expresión buscada y un resumen de las primeros caracteres del fichero\n\n\n¿Como hacerlo?\n\n\n Since Jekyll has no server side execution, we have to rely on storing all the required content in a single file and search our keyword from that file.\n \n We will be creating a JSON file in which we will store title, url, content, excerpt, etc., at building time\n\n 1\n2\n $ bundle exec jekyll build\n $ head -n 30 _site/assets/src/search.json \n \n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n [\n {\n \"title\": \"Clase del Lunes 30/09/2019\",\n \"excerpt\": \"Clase del Lunes 30/09/2019\\n\\n\", ⇐ Resumen\n \"content\": \"Clase del Lunes 30/09/2019\\n\\n\\n ...\", ⇐ Contenido del fichero\n \"url\": \"/clases/2019/09/30/leccion.html\"\n },\n ...\n ]\n \n \n\n\nLiquid template search.json to generate at build time the _site/assets/src/search.json\n\nPara lograrlo usaremos este template Liquid: search.json (protected)\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n- - -\nlayout: null\nsitemap: false\n- - -\n\n{ % capture json % }\n[\n { % assign collections = site.collections | where_exp:'collection','collection.output != false' %}\n { % for collection in collections %}\n { % assign docs = collection.docs | where_exp:'doc','doc.sitemap != false' %}\n { % for doc in docs %}\n {\n \"title\": { { doc.title | jsonify }},\n \"excerpt\": { { doc.excerpt | markdownify | strip_html | jsonify }},\n \"content\": { { doc.content | markdownify | strip_html | jsonify }},\n \"url\": { { site.baseurl | append: doc.url | jsonify }}\n },\n { % endfor %}\n { % endfor %}\n { % assign pages = site.html_pages | where_exp:'doc','doc.sitemap != false' | where_exp:'doc','doc.title != null' %}\n { % for page in pages % }\n {\n \"title\": { { page.title | jsonify }},\n \"excerpt\": { { page.excerpt | markdownify | strip_html | jsonify }},\n \"content\": { { page.content | markdownify | strip_html | jsonify }},\n \"url\": { { site.baseurl | append: page.url | jsonify }}\n }{ % unless forloop.last %},{ % endunless %}\n { % endfor %}\n]\n{ % endcapture %}\n\n{ { json | lstrip }}\n\n\n\n\n layout: null: To disable layout in Jekyll.\n sitemap: false:\n \n A Sitemap is an XML file that lists the URLs for a site. This allows search engines to crawl the site more efficiently and to find URLs that may be isolated from rest of the site’s content. The sitemaps protocol is a URL inclusion protocol and complements robots.txt, a URL exclusion protocol. We can use the front-matter to set the sitemap property to false\n jekyll-sitemap is a Jekyll plugin to silently generate a sitemaps.org compliant sitemap for your Jekyll site\n \n \n Liquid: { % capture json % } ... { % endcapture %} Captures the string inside of the opening and closing tags and assigns it to a variable. Variables that you create using capture are stored as strings.\n { { json | lstrip }}:\n \n Filters are simple methods that modify the output of numbers, strings, variables and objects. They are placed within an output tag { { } } and are denoted by a pipe character |.\n lstrip: Removes all whitespace (tabs, spaces, and newlines) from the left side of a string. It does not affect spaces between words.\n \n \n { % assign collections = site.collections ...\n \n site.collections: Collections are also available under site.collections. Posts are considered a collections by Jekyll.\n … where_exp:'collection','collection.output != false'\n \n site.collections is an array. With where_exp we select all the objects in the array with the elements for which the attribute collection has its output attribute to true.\n The output attribute of a collection controls whether the collection’s documents will be output as individual files.\n \n \n \n \n iteration in Liquid\n site.html_pages: A subset of site.pages listing those which end in .html.\n\n\nEntendiendo la línea \"content\": { { page.content | markdownify | strip_html | jsonify }},\n\n\n page.content el contenido de la página todavia sin renderizar (se supone que es fundamentalmente markdown, pero puede contener yml en el front-matter, html, scripts, liquid, etc.)\n markdownify: Convert a Markdown-formatted string into HTML.\n strip_html: Removes any HTML tags from a string.\n jsonify: If the data is an array or hash you can use the jsonify filter to convert it to JSON.\n\n\nPor ejemplo, supongamos que tenemos estas definiciones en el front-matter de nuestra página:\n\n1\n2\n3\n4\n5\n6\n7\nchuchu: \"Cadena **negritas** e *italicas*\"\nhtml: \"<h1>hello</h1> <b>world</b>\"\ncolors:\n - red\n - blue\n - green\n---\n\n\ny que en el contenido de nuestra página tenemos algo así:\n\n1\n2\n3\n4\n5\nCompara < script>{ { page.chuchu }} </script> con su markdownify: < script>{ { page.chuchu | markdownify }}</script>\n\nCompara < script> { { page.colors}} </script> con su jsonify: < script>{ { page.colors | jsonify }} </script>\n\nCompara < script>{ {page.html}}</script> con su `strip_html` < script> { { page.html | strip_html }} </script>\n\n\nEsta es la salida que produce jekyll 4.0.0:\n\n1\n2\n3\n4\n5\n6\n<p>Compara < script>Cadena **negritas** e *italicas* </script> con su markdownify: < script>&lt;p&gt;Cadena <strong>negritas</strong> e <em>italicas</em>&lt;/p&gt;\n</script></p>\n\n<p>Compara < script> redbluegreen </script> con su jsonify: < script>[\"red\",\"blue\",\"green\"] </script></p>\n\n<p>Compara < script>&lt;h1&gt;hello&lt;/h1&gt; <b>world</b></script> con su <code class=\"highlighter-rouge\">strip_html</code> < script> hello world </script></p>\n\n\nLa idea general es que necesitamos suprimir los tags, tanto yml, markdown, HTML, etc. para que no confundan al método de busca. \nPor eso convertimos el markdown a HTML y después suprimimos los tags HTML. También convertimos el yml a JSON.\n\nLa página de Búsqueda: search.md\n\n\n search.md (protected)\n\n\nFichero search.md:\n\nLa idea es que vamos a escribir una clase JekyllSearch que implementa la búsqueda.\nDebe disponer de un constructor al que se le pasan cuatro argumentos:\n\n\n La ruta donde esta disponible el fichero .json generado durante la construcción (jekyll build)\n El id del objeto del DOM en la página en la que está el tag input de la búsqueda\n El iddel objeto del DOM en el que se deben volcar los resultados\n La url del lugar en el que está el deployment (pudiera ser que el site en el que queremos buscar fuera una subcarpeta de todo el site)\n\n\n1\n2\n3\n4\n5\n6\n7\nconst search = new JekyllSearch(\n '/assets/src/search.json',\n '#search',\n '#list',\n ''\n );\n search.init(); \n\n\nLos objetos JekyllSearch deben disponer de un método init que realiza la búsqueda especificada en el elemento del DOM #search y añade los resultados en en el elemento del DOM #list\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n- - -\nlayout: error \npermalink: /search/\ntitle: Search\n- - -\n\n{ % capture initSearch % }\n\n<h1>Search</h1>\n\n<form id=\"search-form\" action=\"\">\n <label class=\"label\" for=\"search\">Search term (accepts a regex):</label>\n <br/>\n <input class=\"input\" id=\"search\" type=\"text\" name=\"search\" autofocus placeholder=\"e.g. Promise\" autocomplete=\"off\">\n \n <ul class=\"list list--results\" id=\"list\">\n </ul>\n</form>\n\n< script type=\"text/javascript\" src=\"/assets/src/fetch.js\"></script>\n< script type=\"text/javascript\" src=\"/assets/src/search.js\"></script>\n\n\n< script type=\"text/javascript\">\n\n const search = new JekyllSearch(\n '{ {site.url} }/assets/src/search.json',\n '#search',\n '#list',\n '{ {site.url} }'\n );\n search.init(); \n \n</script>\n\n<noscript>Please enable JavaScript to use the search form.</noscript>\n\n{ % endcapture % }\n\n{ { initSearch | lstrip } }\n\n\n\n autocomplete=\"off\"\n \n En algunos casos, el navegador continuará sugiriendo valores de autocompletado incluso si el atributo autocompletar está desactivado. Este comportamiento inesperado puede resultar bastante confuso para los desarrolladores. El truco para realmente no aplicar el autocompletado es asignar un valor no válido al atributo, por ejemplo:\n \n\n 1\nautocomplete=\"nope\"\n \n Dado que este valor no es válido para el atributo autocompletar, el navegador no tiene forma de reconocerlo y deja de intentar autocompletarlo.\n \n Filters are simple methods that modify the output of numbers, strings, variables and objects. They are placed within an output tag { { } } and are denoted by a pipe character |.\n \n lstrip Removes all whitespace (tabs, spaces, and newlines) from the left side of a string. It does not affect spaces between words.\n \n \n Clearing Up Confusion Around baseurl. About site.url vs site.baseurl\n\n\n\n\nLa clase JekyllSearch: Fichero search.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\nclass JekyllSearch {\n constructor(dataSource, searchField, resultsList, siteURL) {\n this.dataSource = dataSource // ruta al fichero json\n this.searchField = document.querySelector(searchField) // DOM el. del input\n this.resultsList = document.querySelector(resultsList) // DOM el. para el output\n this.siteURL = siteURL // folder\n\n this.data = '';\n }\n\n fetchedData() {\n return fetch(this.dataSource)\n .then(blob => blob.json())\n }\n\n async findResults() {\n this.data = await this.fetchedData()\n const regex = new RegExp(this.searchField.value, 'gi')\n return this.data.filter(item => {\n return item.title.match(regex) || item.content.match(regex)\n })\n }\n\n async displayResults() {\n const results = await this.findResults()\n const html = results.map(item => {\n return `\n <li class=\"result\">\n <article class=\"result__article article\">\n <h4>\n <a href=\"${this.siteURL + item.url}\">${item.title}</a>\n </h4>\n <p>${item.excerpt}</p>\n </article>\n </li>`\n }).join('')\n if ((results.length == 0) || (this.searchField.value == '')) {\n this.resultsList.innerHTML = `<p>Sorry, nothing was found</p>`\n } else {\n this.resultsList.innerHTML = html\n }\n }\n\n // https://stackoverflow.com/questions/43431550/async-await-class-constructor\n init() {\n const url = new URL(document.location)\n if (url.searchParams.get(\"search\")) {\n this.searchField.value = url.searchParams.get(\"search\") // Update the attribute\n this.displayResults()\n }\n this.searchField.addEventListener('keyup', () => {\n this.displayResults()\n // So that when going back in the browser we keep the search\n url.searchParams.set(\"search\", this.searchField.value)\n window.history.pushState('', '', url.href)\n })\n \n // to not send the form each time <enter> is pressed\n this.searchField.addEventListener('keypress', event => {\n if (event.keyCode == 13) {\n event.preventDefault()\n }\n })\n }\n}\n\n\nurl.searchParams\n\nIf the URL of your page is https://example.com/?name=Jonathan%20Smith&age=18 you could parse out the name and age parameters using:\n\n1\n2\n3\nlet params = (new URL(document.location)).searchParams;\nlet name = params.get('name'); // is the string \"Jonathan Smith\".\nlet age = parseInt(params.get('age')); // is the number 18\n\n\nLive collections\n\nAll methods getElementsBy* return a live collection. \nSuch collections always reflect the current state of the document and auto-update when it changes. \nIn contrast, querySelectorAll returns a static collection. \nIt’s like a fixed array of elements.\n\n1\n2\n3\n4\n5\n6\n7\n8\nconstructor(dataSource, searchField, resultsList, siteURL) {\n this.dataSource = dataSource // ruta al fichero json\n this.searchField = document.querySelector(searchField) // DOM el. del input\n this.resultsList = document.querySelector(resultsList) // DOM el. para el output\n this.siteURL = siteURL // folder\n\n this.data = '';\n }\n\n\nwindow.history.pushState\n\nThe window object provides access to the browser’s session history through the history object. \nThe history.pushState(state, title, url) method adds a state to the browser’s session history stack.\n\n1\n2\n3\n4\n5\n6\n7\n ... // inside init\n this.searchField.addEventListener('keyup', () => {\n this.displayResults()\n // So that when going back in the browser we keep the search\n url.searchParams.set(\"search\", this.searchField.value)\n window.history.pushState('', '', url.href)\n })\n\n\nCaching\n\nThe resources downloaded through fetch(), similar to other resources that the browser downloads, are subject to the HTTP cache.  \n\n1\n2\n3\nfetchedData() {\n return fetch(this.dataSource).then(blob => blob.json())\n }\n\n\nThis is usually fine, since it means that if your browser has a cached copy of the response to the HTTP request, it can use the cached copy instead of wasting time and bandwidth re-downloading from a remote server.\n\nThe search.json is not going to change until the next push\n\nFetch Polyfill\n\n\nPolyfill\n\nA polyfill is a piece of code (usually JavaScript on the Web) used to provide modern functionality on older browsers that do not natively support it. The polyfill uses non-standard features in a certain browser to give JavaScript a standards-complaint way to access the feature\n\n\n\n\n El código del polyfill que he usado: assets/src/fetch.js\n Para mas información podemos leer este blog: Polyfill para Fetch\n \n whatwg-fetch: polyfill de Fetch que ha creado el equipo de Github\n Para agregar este polyfill a nuestro proyecto podemos descargarnos su archivo js desde github,\n pero también podríamos instalarlo usando cualquiera de los gestores de dependencias más habituales:\n npm install whatwg-fetch --save\n o bien:\n bower install fetch --save\n \n \n\n\nEstructura del sitio\n\nEsta imagen muestra los ficheros implicados en este ejercicio dentro de \nla estructura del sitio de estos apuntes:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n$ tree -I _site\n.\n├── 404.md\n├── assets\n│ ├── css\n│ │ └── style.scss\n│ ├── images\n│ │ ├── event-emitter-methods.png\n│ │ └── ,,,\n│ └── src\n│ ├── fetch.js ⇐ Polyfill for fetch\n│ ├── search.js ⇐ Librería con la Clase JekyllSearch que implementa el Código de búsqueda\n│ └── search.json ⇐ Plantilla Liquid para generar el fichero JSON \n├── search.md ⇐ Página de la búsqueda. Formulario y script de arranque \n├── clases.md\n├── _config.yml ⇐ Fichero de configuración de Jekyll\n├── degree.md\n├── favicon.ico\n├── Gemfile\n├── Gemfile.lock\n├── _includes ⇐ The include tag allows to include the content of files stored here\n│ ├── navigation-bar.html\n│ └── ...\n├── _layouts ⇐ templates that wrap around your content\n│ ├── default.html\n│ ├── error.html\n│ └── post.html\n├── _posts ⇐ File names must follow YEAR-MONTH-DAY-title.MARKUP and must begin with front matter \n│ ├── ...\n│ └── 2019-12-02-leccion.md\n├── _practicas ⇐ Folder for the collection \"practicas\" (list of published \"practicas\") \n│ ├── ...\n│ └── p9-t3-transfoming-data.md \n├── practicas.md ⇐ { % for practica in site.practicas % } ... { % endfor % }\n├── Rakefile ⇐ For tasks\n├── README.md\n├── references.md\n├── resources.md\n├── tema0-presentacion ⇐ Pages folders \n│ ├── README.md\n│ └── ...\n├── tema ...\n├── tfa\n│ └── README.md\n└── timetables.md\n\n58 directories, 219 files\n\n\nReferencias\n\n\n Sección Jekyll en estos apuntes\n Liquid\n A GitHub Pages compatible Table of Contents generator without a plugin or JavaScript The code is here: toc.html\n CloudCannon is cloud content management system and hosting provider for Jekyll websites\n documentation-theme-jekyll Un tema muy completo. Tiene de todo\n Using HTMLProofer From Ruby and Travis. Para testear tus páginas: links, imágenes, etc.\n\n\n", "url": "/clases/2019/12/02/leccion.html" }, { "title": "Clase del Lunes 09/12/2019", "excerpt": "Clase del Lunes 09/12/2019\n\n", "content": "Clase del Lunes 09/12/2019\n\nAnuncio\n\nIncidencia en el servicio IaaS y sistemas de cómputo. Contacto: http://soporte.ull.es/stic (soporte@ull.es). \nMáquinas apagadas.\n\nTransforming Data and Testing Continuously. Chapter 5 of the Book Node.js the Right Way\n\nEste es el primer capítulo de una serie que cubre los capítulos del 5 al 9 en el que se construye una aplicación Web.\n\nEn este capítulos 5 vamos a obtener los datos con los que vamos a cargar nuestra base de datos para la web app:\n\n\n \n Descargar desde el Proyecto Gutenberg (ebooks gratuitos) el catálogo de libros en Resource Description Framework RDF.\n\n \n \n\n\nEl RDF es una familia de especificaciones de la World Wide Web Consortium (W3C) para describir en XML los datos que aparecen en un recurso web.\n\nWe will be treating the RDF files like regular, undifferentiated XML files for parsing and for data extraction.\n\n\n RDF\n \n El Marco de Descripción de Recursos (del inglés Resource Description Framework, RDF) es una familia de especificaciones de la World Wide Web Consortium (W3C) originalmente diseñado como un modelo de datos para metadatos\n \n \n \n JavaScript Object Notation for Linked Data, JSON_LD\n \n Extraeremos del fichero RDF/XML la información que nos interesa, produciendo como salida un fichero JSON con la misma\n \n La idea es escribir algo así como un programa rdf-to-json.js que funcione así:\n 1\n ~/.../transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ./rdf-to-json.js ../data/cache/epub/12/pg12.rdf \n \n \n Que deberá producir una salida parecida a esta:\n \n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n {\n \"id\": 12,\n \"title\": \"Through the Looking-Glass\",\n \"authors\": [\n \"Carroll, Lewis\"\n ],\n \"subjects\": [\n \"Fantasy literature\"\n ]\n }\n \n \n Estos JSON van a guardarse en una base de Datos denominada Elastic Search que va a ser usada en el capítulo 6 del libro (Commanding Databases).\n \n Elasticsearch es una base de datos NoSQL que funciona como un servicio REST a la que se accede vía HTTP y que almacena e indexa documentos JSON. En el capítulo 6 se construye un programa de línea de comandos que permite interactuar con la base de datos que se crea en el capítulo 5.\n \n \n Este es el esquema de trabajo para los dos capítulos:\n \n\n\nLine Delimited JSON\n\nNo vamos a usar JSON como formato de salida, sino Line Delimited JSON.\n\nLine Delimited JSON (JDL), newline-delimited JSON (NDJSON), and JSON lines (JSONL) are three terms for equivalent formats of JSON streaming.\n\nStreaming makes use of the fact that the JSON format does not allow newline and return characters within primitive values (in strings those must be escaped as \\n and \\r, respectively) and that most JSON formatters default to not including any whitespace, including newlines and returns.\nThese features allow the newline and/or return characters to be used as a delimiter.\n\nThis format is documented at the JSON Lines website.\n\nThis example shows two JSON objects (the implicit newline characters at the end of each line are not shown):\n\n1\n{\"some\":\"thing\\n\"}\n\n\n1\n{\"may\":{\"include\":\"nested\",\"objects\":[\"and\",\"arrays\"]}}\n\n\nThe use of a newline as a delimiter enables this format to work very well with traditional line-oriented Unix tools.\n\nEstructura de directorios\n\nEste es un ejemplo de como estructurar este proyecto:\n\n⇐\nLEFTWARDS DOUBLE ARROW\nUnicode: U+21D0, UTF-8: E2 87 90\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n$ tree -s -I 'node_modules*|epub*|jim*|images'\n.\n├── [ 192] data\n│   ├── [ 294] README.md\n│   ├── [ 13005066] bulk_pg.ldj ⇐ Fichero en formato LDJ con todo el catálogo\n│   ├── [ 10809492] bulk_result.json ⇐ Lo generaremos en el capítulo 6\n│   └── [ 96] cache ⇐ Donde quedarán los ficheros RDF de la descarga\n└── [ 256] databases\n ├── [ 38863] README.md\n ├── [ 96] lib\n │   └── [ 3665] parse-rdf.js\n ├── [ 786] rdf-to-bulk.js\n ├── [ 338] rdf-to-json.js\n └── [ 128] test\n ├── [ 1101] parse-rdf-test.js\n └── [ 12393] pg132.rdf\n\n5 directories, 9 files\n\n\nEn el directorio data guardaremos los datos descargados de Guttenberg y en el directorio databases nuestro código: ejecutables, librerías y las pruebas.\n\nDescarga de los datos\n\nEn esta página encontrará el catálogo completo de Guttenberg en formato RDF/XML:\n\n\n\nPara descargarlo nos posicionamos en el directorio adecuado y podemos usar curl. El fichero está compactado:\n\n1\n~/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5(master)]$ sed -ne '/c5-get/,/^$/p' ~/sol-nodejs-the-right-way/gulpfile.js \n\n\n1\n2\n3\n4\n5\n6\ngulp.task(\"c5-get-guttenberg\", shell.task(\n \n 'cd transforming-data-and-testing-continuously-chapter-5/data && ' +\n 'curl -O https://www.gutenberg.org/cache/epub/feeds/rdf-files.tar.bz2 &&' +\n 'tar -xvjf rdf-files.tar.bz2'\n));\n\n\n\n curl option -O, --remote-name\n \n Write output to a local file named like the remote file we get. (Only the file part of the remote file is used, the path is cut off.) The file will be saved in the current working directory. If you want the file saved in a different directory, make sure you change the current working directory before invoking curl with this option. The remote file name to use for saving is extracted from the given URL, nothing else, and if it already exists it will be overwritten.\n \n \n tar -xvjf rdf-files.tar.bz2\n -x Extract to disk from the archive. If a file with the same name appears more than once in the archive, each copy will be extracted, with later copies overwriting (replacing) earlier copies.\n -j (c mode only) Compress the resulting archive with bzip2(1). In extract or list modes, this option is ignored. Note that unlike other tar implementations, this implementation recognizes bzip2 compression automatically when reading archives.\n -f file Read the archive from or write the archive to the specified file. The filename can be for standard input or standard output.\n -v Produce verbose output. In create and extract modes, tar will list each file name as it is read from or written to the archive. In list mode, tar will produce output similar to that of ls(1). Additional -v options will provide additional detail.\n\n\nCuando ejecutamos esta secuencia de comandos crearemos en el directorio data los ficheros *.rdf, una por libro:\n\n1\n2\n3\n4\n5\n6\n7\n8\nx cache/epub/0/pg0.rdf\nx cache/epub/1/pg1.rdf\nx cache/epub/10/pg10.rdf\n...\nx cache/epub/9998/pg9998.rdf\nx cache/epub/9999/pg9999.rdf\nx cache/epub/999999/pg999999.rdf\n...\n\n\nEsto nos deja en cache/epub/ un montón de directorios numerados:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n$ ls data/cache/epub/ | head -n 4\n0\n1\n10\n100\n$ ls data/cache/epub/ | tail -n 4\n9999\n999999\nDELETE-52276\nDELETE-55495\n\n\nAnalizando la estructura de los ficheros RDF\n\nPor ejemplo, aquí están los contenidos de data/cache/epub/132/pg132.rdf\n\nThe important pieces of information that we’d like to extract are as follows:\n\n\n The Gutenberg ID (132)\n The book’s title\n The list of authors (agents)\n The list of subjects\n\n\n1\n$ ./rdf-to-json.js ../data/cache/epub/132/pg132.rdf\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n{\n \"id\": 132,\n \"title\": \"The Art of War\",\n \"authors\": [\n \"Sunzi, active 6th century B.C.\",\n \"Giles, Lionel\"\n ],\n \"subjects\": [\n \"Military art and science -- Early works to 1800\",\n \"War -- Early works to 1800\"\n ]\n}\n\n\nLas Pruebas\n\nMocha y Chai\n\n1\n2\n3\n$ cd databases\n$ npm init -y\n$ npm install --save-dev --save-exact mocha chai\n\n\nChai supports several different styles of assertions, each with their own pros and cons.\nHere We’ll use Chai’s expect style.\n\nHere is an example, first using Node.js’s built-in assert module,\n\n1\n2\n3\n​ assert.ok(book.authors, ​'book should have authors'​);\n​ assert.ok(Array.isArray(book.authors), ​'authors should be an array'​);\n​ assert.equal(book.authors.length, 2, ​'authors length should be 2'​);\n\n\nIf you read the code carefully, you can deconstruct that it’s confirming that the book object\nhas a property called authors that is an Array of length 2.\n\nBy contrast, check out this example using Chai’s expect method:\n\n… and the same using Chai’s expect style:\n\n1\n2\n​ expect(book).to.have.a.property(​'authors'​)\n​ .that.is.an(​'array'​).​with​.lengthOf(2);\n\n\nBy comparison to the native Node.js assert code, this reads like English.\n\nSetting Up Tests with Mocha and Chai\n\n1\n2\n3\n$ ​​cd​​ ​​databases​\n​$ ​​npm​​ ​​init​​ ​​-y​\n$ ​​npm​​ ​​install​​ ​​--save-dev​​ ​​--save-exact​​ ​​mocha​​ ​​chai\n\n\nEjecución de las Pruebas\n\n1\n[~/sol-nodejs-the-right-way(master)]$ jq .scripts package.json \n\n\n1\n2\n3\n4\n5\n{\n \"test-databases\": \"mocha transforming-data-and-testing-continuously-chapter-5/databases/test/parse-rdf-test.js\",\n \"test-debug-databases\": \"mocha --inspect-brk --no-timeouts transforming-data-and-testing-continuously-chapter-5/databases/test/parse-rdf-test.js\",\n \"test:watch-databases\": \"mocha --watch --reporter min transforming-data-and-testing-continuously-chapter-5/databases/test/parse-rdf-test.js\",\n}\n\n\nBDD, TDD and The Red-Green-Refactor cycle\n\n\n Add new criteria to the test.\n Run the test and see that it fails.\n Modify the code being tested.\n Run the test and see that it passes.\n\n\n\n\nWe keep this cycle going over and over again:\n\n\n We write the test before a single line of implementation code is written.\n \n That test will serve as a guideline what to build and to make sure we don’t break anything in the future that prevents the regular flow from working.\n We describe each unit of the system through a failing test\n \n \n We write the code to make it pass\n Then, we can refactor it if necessary\n\n\nCódigo de las Pruebas\n\n1\n2\n3\n4\n5\ncp ../data/cache/epub/132/pg132.rdf test/\n[~/.../Capitulo5/databases(master)]$ tree test/\ntest/\n├── parse-rdf-test.js\n└── pg132.rdf\n\n\n1\n$ cat databases/test/parse-rdf-test.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n'use strict';\n\nconst fs = require('fs');\nconst expect = require('chai').expect;\nconst parseRDF = require('../lib/parse-rdf.js');\nconst rdf = fs.readFileSync(`${__dirname}/pg132.rdf`);\n\ndescribe(\"Chapter 5: Transforming Data and Testing Continuously\", () => {\n describe('parseRDF', () => {\n it('should be a function', () => {\n debugger;\n expect(parseRDF).to.be.a('function');\n });\n it('should parse RDF content', () => {\n const book = parseRDF(rdf);\n // https://www.chaijs.com/api/bdd/#method_language-chains\n expect(book).to.be.a('object');\n\n expect(book).to.have.a.property('id', 132);\n\n expect(book).to.have.a.property('title', 'The Art of War');\n\n expect(book).to.have.a.property('authors').that.is.an('array').with.lengthOf(2).\n and.contains('Sunzi, active 6th century B.C.').\n and.contains('Giles, Lionel');\n\n expect(book).to.have.a.property('subjects').that.is.an('array').with.lengthOf(2).\n and.contains('Military art and science -- Early works to 1800').\n and.contains('War -- Early works to 1800');\n });\n });\n});\n\n\nDepurando las Pruebas\n\nMocha options for debugging. The options:\n\n1\n--debug, --inspect, --debug-brk, --inspect-brk, debug, inspect\n\n\nEnables Node.js’ debugger or inspector.\n\nUse --inspect / --inspect-brk / --debug / --debug-brk to launch the V8 inspector for use with Chrome Dev Tools.\n\nUse inspect / debug to launch Node.js’ internal debugger.\n\nAll of these options are mutually exclusive.\n\nImplies --no-timeout.\n\n1\n2\n3\n4\n5\n6\n7\n8\n[~/.../p9-t3-transforming-data/transforming-data-and-testing-continuously-chapter-5(master)]$ npm run test-debug-databases\n\n> nodejs-8-the-right-way@1.0.0 test-debug-databases /Users/casiano/local/src/CA/sol-nodejs-the-right-way\n> mocha --inspect-brk --no-timeouts transforming-data-and-testing-continuously-chapter-5/databases/test/parse-rdf-test.js\n\nDebugger listening on ws://127.0.0.1:9229/db1b1cee-1632-4541-9ef9-608b2943c3a3\nFor help, see: https://nodejs.org/en/docs/inspector\nDebugger attached.\n\n\n\n\nExtracting Data from XML with Cheerio\n\nCheerio is a fast Node.js module that provides a jQuery-like API for working with HTML and XML documents.\n\n\n cheerio GitHub\n https://cheerio.js.org/\n\n\nCheerio uses CSS selectors as a Domain specific Language (DSL) to traverse and modify the Abstract Syntax Tree (AST) of te XML document. \nThe AST of a HTML or XML document is usually referred as the DOM.\n\nOther popular alternatives include\n\n\n jsdom\n xmldom\n\n\nboth of which are based on the W3C’s DOM specification.\n\nIn your own projects, if the XML files that you’re working with are quite large, then you’re probably going to want a streaming SAX (parser instead. SAX, which stands for Simple API for XML, treats XML as a stream of tokens that your program digests in sequence. Unlike a DOM parser, which considers the document as a whole, a SAX parser operates on only a small piece at a time.\n\nCompared to DOM parsers, SAX parsers can be quite fast and memory-efficient. But the downside of using a SAX parser is that your program will have to keep track of the document structure in flight\n\n\n sax-js\n\n\nGetting Started with Cheerio\n\nTo get started with Cheerio, install it with npm and save the dependency.\n\n1\n​ ​$ ​​npm​​ ​​install​​ ​​--save​​ ​​--save-exact​​ ​​cheerio\n\n\nBefore we start using Cheerio, let’s create some BDD tests that we can make pass by doing so.\n\n1\n​ ​$ ​​npm​​ ​​run​​ ​​test:watch​\n\n\nIt should clear the screen and report two passing tests:\n\n1\n​ 2 passing (44ms)\n\n\nNow let’s require that the book object returned by parseRDF has the correct numeric ID for The Art of War.\n\nOpen your parse-rdf-test.js file and expand the second test by adding a check that the book object has an id property containing the number 132.\n\ntest/parse-rdf-test.js\n\n1\n2\n3\n4\n5\n​ it(​'should parse RDF content'​, () => {\n ​ const​ book = parseRDF(rdf);\n ​ expect(book).to.be.an(​'object'​);\n ​ expect(book).to.have.a.property(​'id'​, 132);\n​ });\n\n\nThis code takes advantage of Chai’s sentence-like BDD API\n\nSince we have not yet implemented the code to include the ‘id‘ in the returned ‘book‘ object, as soon as you save the file, your Mocha terminal should report this:\n\n1\n2\n3\n4\n5\n6\n1 passing (4ms)\n1 failing\n​\n1) parseRDF should parse RDF content:\n AssertionError: expected {} to have a property 'id'\n​ at Context.it (test/parse-rdf-test.js:32:28)\n\n\nThe test is failing exactly as we expect it should.\n\nNow it’s time to use Cheerio to pull out the four fields we want:\n\n\n the book’s ID,\n the title,\n the authors, and\n the subjects.\n\n\nReading Data from an Attribute\n\nThe first piece of information we hope to extract using Cheerio\nis the book’s ID. \nRecall that we’re trying to grab the number 132 out of this XML tag:\n\nFile pg132.rdf:\n\n1\n​ <pgterms:ebook rdf:about=​\"ebooks/132\"​>\n\n\nOpen your lib/parse-rdf.js file and make it look like the following:\n\nlib/parse-rdf.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n​'use strict'​;\n​const​ cheerio = require(​'cheerio'​);\n\nmodule.exports = rdf => {\n​ const​ $ = cheerio.load(rdf);\n​\n​ const​ book = {};\n\n book.id = +$(​'pgterms​​\\\\​​:ebook'​).attr(​'rdf:about'​).replace(​'ebooks/'​, ​''​);\n\n ​return​ book;\n​};\n\n\nIn CSS, the colon character (:) has special meaning—it is used to introduce pseudo selectors like :hover for links that are hovered over.\n\nIn our case, we need a literal colon character for the <pgterms:ebook> tag name, so we have to escape it with a backslash.\n\nBut since the backslash is a special character in JavaScript string literals, that too needs to be escaped-. Thus, our query selector for finding the tag is pgterms\\\\:ebook.\n\nLo ilustramos en esta sesión de node:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n> s = 'pgterms\\:ebook\\n'\n'pgterms:ebook\\n'\n> console.log(`-${s}-`)\n-pgterms:ebook\n-\n> t = 'pgterms\\\\:ebook\\n'\n'pgterms\\\\:ebook\\n'\n> console.log(`-${t}-`)\n-pgterms\\:ebook\n\n\nReading the Text of a Node\n\nNext, let’s add a test for the title of the book. \nInsert the following code:\n\ntest/parse-rdf-test.js\n\n1\n​ expect(book).to.have.a.property(​'title'​, ​'The Art of War'​);\n\n\nYour continuous testing terminal should read as follows:\n\n1\n2\n3\n4\n5\n6\n 1 passing (3ms)\n 1 failing\n\n​ 1) parseRDF should parse RDF content:\n ​ AssertionError: expected { id: 132 } to have a property 'title'\n​ at Context.it (test/parse-rdf-test.js:35:28)\n\n\nNow let’s grab the title and add it to the returned book object. Recall that the XML containing the title looks like this:\n\n1\n​ <dcterms:title>The Art of War</dcterms:title>\n\n\nAdd the following to your lib/parse-rdf.js file, after the line where we set book.id:\n\nlib/parse-rdf.js\n\n1\n​ book.title = $(​'dcterms​​\\\\​​:title'​).text();\n\n\nUsing Cheerio, we select the tag named dcterms:title and used the text()method of the element to save its text contents to the book.title property.\n\nCollecting an Array of Values\n\nNow, let’s tests the array of book authors:\n\ntest/parse-rdf-test.js\n\n1\n2\n3\n4\n​ expect(book).to.have.a.property(​'authors'​)\n​ that.is.an(​'array'​).​with​.lengthOf(2)\n​ .and.contains(​'Sunzi, active 6th century B.C.'​)\n​ .and.contains(​'Giles, Lionel'​);\n\n\nIn Chai’s language-chaining DSL, words like\n\n\n and,\n that, and\n which\n\n\nare largely interchangeable. \nThis let us write clauses like\n\n.and.contains(’X’) or .that.contains(’X’),\n\ndepending on which version reads better in your test case.\n\nOur continuous testing reports a failure:\n\n1\n2\n3\n4\n5\n6\n​ 1 passing (11ms)\n​ 1 failing\n​ \n​ 1) parseRDF should parse RDF content:\n​ AssertionError: expected { id: 132, title: 'The Art of War' } to have a\n​ property 'authors' at Context.it (test/parse-rdf-test.js:39:28)\n\n\nTo make the test pass, recall that we will need to pull out the content from these tags:\n\ndata/cache/epub/132/pg132.rdf\n\n1\n2\n3\n4\n5\n6\n​ <pgterms:agent rdf:about=​\"2009/agents/4349\"​>\n ​ <pgterms:name>Sunzi, active 6th century B.C.</pgterms:name>\n​ </pgterms:agent>\n​ <pgterms:agent rdf:about=​\"2009/agents/5101\"​>\n ​ <pgterms:name>Giles, Lionel</pgterms:name>\n​ </pgterms:agent>\n\n\nWe’re looking to extract the text of each <pgterms:name> tag that’s a child of a <pgterms:agent>.\n\nThe CSS selector pgterms:agent pgterms:name finds the elements we need, so we can start with this:\n\n1\n​ $(​'pgterms​​\\\\​​:agent pgterms​​\\\\​​:name'​)\n\n\nYou might be tempted to grab the text straight away like this:\n\n1\n​ book.authors = $(​'pgterms​​\\\\​​:agent pgterms​​\\\\​​:name'​).text();\n\n\nBut unfortunately, this won’t give us what we want, because Cheerio’s text method returns a single string and we need an array of strings.\n\nInstead, we use a map:\n\nlib/parse-rdf.js\n\n1\n2\nbook.authors = $(​'pgterms​​\\\\​​:agent pgterms​​\\\\​​:name'​)\n .toArray().map(elem => $(elem).text());\n\n\nCalling Cheerio’s .toArray method converts the collection object into a true JavaScript Array.\n\nUnfortunately, the collection of objects that comes out of toArray doesn’t consist of Cheerio-wrapped objects, but rather document nodes.\n\nTo extract the text using Cheerio’s text, we need to wrap each node with the $ function, then call text on it.\n\n1\n elem => $(elem).text().\n\n\nTraversing the Document: The List of Subjects\n\nFinally, we want to obtain the list of subjects.\n\nFile: pg132.rdf\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n​ <dcterms:subject>\n ​ <rdf:Description rdf:nodeID=​\"N26bb21da0c924e5abcd5809a47f231e7\"​>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCSH\"​/>\n ​ <rdf:value>Military art and science -- Early works to 1800</rdf:value>\n ​ </rdf:Description>\n​ </dcterms:subject>\n​ <dcterms:subject>\n ​ <rdf:Description rdf:nodeID=​\"N269948d6ecf64b6caf1c15139afd375b\"​>\n ​ <rdf:value>War -- Early works to 1800</rdf:value>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCSH\"​/>\n ​ </rdf:Description>\n​ </dcterms:subject>\n\n\nAs with previous examples, let’s start by adding a test:\n\ntest/parse-rdf-test.js\n\n1\n2\n3\n4\n​ expect(book).to.have.a.property(​'subjects'​)\n .that.is.an(​'array'​).​with​.lengthOf(2)\n​ .and.contains(​'Military art and science -- Early works to 1800'​)\n​ .and.contains(​'War -- Early works to 1800'​);\n\n\nIt would be nice if we could use the tag structure to craft a simple CSS selector like this:\n\n1\n​ $(​'dcterms​​\\\\​​:subject rdf​​\\\\​​:value'​)\n\n\nHowever, this selector would match another tag that is in the document, which we don’t want.\n\nFile: pg132.rdf\n\n1\n2\n3\n4\n5\n6\n​ <dcterms:subject>\n ​ <rdf:Description rdf:nodeID=​\"Nfb797557d91f44c9b0cb80a0d207eaa5\"​>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCC\"​/>\n ​ <rdf:value>U</rdf:value>\n ​ </rdf:Description>\n​ </dcterms:subject>\n\n\nTo spot the difference, look at the <dcam:memberOf> tags’ rdf:resource URLs.\n\nThe ones we want end in LCSH, which stands for Library of Congress Subject Headings.\n\nThese headings are a collection of rich indexing terms used in bibliographic records.\n\nContrast that with the tag we don’t want to match, which ends in LCC.\nThis stands for Library of Congress Classification.\n\nThese are codes (C) that divide all knowledge into 21 top-level classes (like U for Military Science) with many subclasses.\n\nRight now we only want the Subject Headings (SH).\n\nHere’s the code:\n\nlib/parse-rdf.js\n\n1\n2\n3\n​ book.subjects = $(​'[rdf​​\\\\​​:resource$=\"/LCSH\"]'​)\n​ .parent().find(​'rdf​​\\\\​​:value'​)\n​ .toArray().map(elem => $(elem).text());\n\n\nFirst, we select the <dcam:memberOf> tags of interest with the CSS selector [rdf\\:resource$=\"/LCSH\"].\n\n The brackets introduce a CSS attribute selector, and the\n $= indicates that we want elements whose rdf:resource attribute ends with /LCSH.\n\n\nThe .parent method traverses up to our currently selected elements’ parents.\n\nIn this case, those are the <rdf:Description> tags.\n\nThen we traverse back down using .find to locate all of their <rdf:value> tags.\n\nWe convert the Cheerio selection object into a true Array and use .map to get each element’s text.\n\nAnticipating Format Changes\n\nA problem with parsing external files are the chances that the format will change over time.\nAn older version of the Project Gutenberg RDF format had its subjects listed like this:\n\n1\n2\n3\n4\n5\n6\n7\n​ <dcterms:subject>\n <rdf:Description>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCSH\"​/>\n ​ <rdf:value>Military art and science -- Early works to 1800</rdf:value>\n ​ <rdf:value>War -- Early works to 1800</rdf:value>\n ​ </rdf:Description>\n​ </dcterms:subject>\n\n\nCompare with the current one:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n​ <dcterms:subject>\n ​ <rdf:Description rdf:nodeID=​\"N26bb21da0c924e5abcd5809a47f231e7\"​>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCSH\"​/>\n ​ <rdf:value>Military art and science -- Early works to 1800</rdf:value>\n ​ </rdf:Description>\n​ </dcterms:subject>\n​ <dcterms:subject>\n ​ <rdf:Description rdf:nodeID=​\"N269948d6ecf64b6caf1c15139afd375b\"​>\n ​ <rdf:value>War -- Early works to 1800</rdf:value>\n ​ <dcam:memberOf rdf:resource=​\"http://purl.org/dc/terms/LCSH\"​/>\n ​ </rdf:Description>\n​ </dcterms:subject>\n\n\nInstead of finding each subject’s <rdf:value> living in its own <dcterms:subject> tag, we find them bunched together under a single one.\n\nNow consider the traversal code we just wrote.\n\n\n By finding the /LCSH tag,\n going up to its parent <rdf:Description>, and then\n searching down for <rdf:value> tags,\n\n\nour code would work with both this earlier data format and the current one (at the time of this writing, anyway).\n\nWhenever you work with third-party data, there’s a chance that it could change over time.\n\nWhen it does, your code may or may not continue to work as expected.\n\nThe beauty of testing in these scenarios is that when a data format changes, you can add more tests.\n\nThis gives you confidence that you’re meeting the new demands of the updated data format while still honoring past data.\n\nRecapping Data Extraction with Cheerio\n\ntest/parse-rdf-test.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n​ 'use strict';\n\nconst fs = require('fs');\nconst expect = require('chai').expect;\nconst parseRDF = require('../lib/parse-rdf.js');\nconst rdf = fs.readFileSync(`${__dirname}/pg132.rdf`);\n\ndescribe(\"Chapter 5: Transforming Data and Testing Continuously\", () => {\n describe('parseRDF', () => {\n it('should be a function', () => {\n debugger;\n expect(parseRDF).to.be.a('function');\n });\n it('should parse RDF content', () => {\n const book = parseRDF(rdf);\n // https://www.chaijs.com/api/bdd/#method_language-chains\n expect(book).to.be.a('object');\n\n expect(book).to.have.a.property('id', 132);\n\n expect(book).to.have.a.property('title', 'The Art of War');\n\n expect(book).to.have.a.property('authors').that.is.an('array').with.lengthOf(2).\n and.contains('Sunzi, active 6th century B.C.').\n and.contains('Giles, Lionel');\n\n expect(book).to.have.a.property('subjects').that.is.an('array').with.lengthOf(2).\n and.contains('Military art and science -- Early works to 1800').\n and.contains('War -- Early works to 1800');\n });\n });\n});\n\n\nlib/parse-rdf.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n'use strict';\nconst cheerio = require(\"cheerio\");\n\nmodule.exports = rdf => {\n const $ = cheerio.load(rdf);\n const book = {};\n\n /* We're trying to grab the number 132 out of this XML tag:\n <pgterms:ebook rdf:about=\"ebooks/132\">\n */\n book.id = + // Convert to a number\n $('pgterms\\\\:ebook') // In CSS, the colon : is used for pseudo selectors (like :hover) that is why we have to escape it\n .attr('rdf:about') // get the rdf:about attribute\n .replace('ebooks/','');\n // Find <dcterms:title>The Art of War</dcterms:title>\n book.title = $('dcterms\\\\:title').text();\n\n book.authors = $('pgterms\\\\:agent pgterms\\\\:name')\n .toArray() // The collection object returned is not a true Array we have to convert it\n .map(\n (e) => { // e is a document node has no text method\n // that is why we wrap it $(e) to a cheerio object\n return $(e).text();\n }\n );\n\n\n book.subjects = $('[rdf\\\\:resource$=\"/LCSH\"]').\n parent() // https://api.jquery.com/parent/\n .find('rdf\\\\:value') // https://api.jquery.com/find/\n .toArray()\n .map(e => $(e).text());\n return book;\n};\n\n\nUsing this, we can now quickly put together a command-line program to explore some of the other RDF files. Open your editor and enter this:\n\nrdf-to-json.js\n\n1\n2\n3\n4\n5\n6\n#!/usr/bin/env node\nconst fs = require('fs');\nconst parseRDF = require('./lib/parse-rdf.js');\nconst rdf = fs.readFileSync(process.argv[2]);\nconst book = parseRDF(rdf);\nconsole.log(JSON.stringify(book, null, ' '));\n\n\nWhen calling JSON.stringify we’re passing three arguments:\n\n The second argument (null) is an optional replacer function that can be used for filtering\n The last argument (' ') is used to indent nested objects, making the output more human-readable.\n\n\nLet’s open a terminal in our databases project directory and run it:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5(master)]$ cd databases/\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ls -l rdf-to-json.js \n-rw-r--r-- 1 casiano staff 217 7 nov 13:36 rdf-to-json.js\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ chmod a+x rdf-to-json.js \n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ls -l rdf-to-json.js \n-rwxr-xr-x 1 casiano staff 217 7 nov 13:36 rdf-to-json.js\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ./rdf-to-json.js ../data/cache/epub//11/pg11.rdf \n{\n \"id\": 11,\n \"title\": \"Alice's Adventures in Wonderland\",\n \"authors\": [\n \"Carroll, Lewis\"\n ],\n \"subjects\": [\n \"Fantasy literature\"\n ]\n}\n\n\nProcessing Data Files Sequentially\n\nOur lib/parse-rdf.js converts RDF content into JSON documents.\n\nAll that remains is to walk through the Project Gutenberg catalog directory and collect all the JSON documents.\n\nMore concretely, we need to do the following:\n\n\n Traverse down the data/cache/epub directory looking for files ending in rdf.\n Read each RDF file.\n Run the RDF content through parseRDF.\n Collect the JSON serialized objects into a single, bulk file for insertion.\n\n\nThe NoSQL database we’ll be using is Elasticsearch, a document datastore that indexes JSON objects.\n\nGOAL: We want to transform the Gutenberg data into an intermediate form for bulk import.\n\nElasticsearch has a bulk-import API that lets you pull in many records at once\n\nAlthough we could insert them one at a time, it is significantly faster to use the bulk-insert API.\n\nThe format of the file we need to create is described on Elasticsearch’s Bulk API page\n\nIt’s an LDJ file consisting of\n\n actions and\n the source objects on which to perform each action.\n\n\nIn our case, we’re performing index operations—that is, \ninserting new documents into an index.\n\nEach source object is the book object returned by parseRDF.\nHere’s an example of an action followed by its source object:\n\n1\n2\n​ {​\"index\"​:{​\"_id\"​:​\"pg11\"​}}\n​ {​\"id\"​:11,​\"title\"​:​\"Alice's Adventures in Wonderland\"​,​\"authors\"​:...}\n\n\nAnd here’s another one:\n\n1\n2\n​ {​\"index\"​:{​\"_id\"​:​\"pg132\"​}}\n​ {​\"id\"​:132,​\"title\"​:​\"The Art of War\"​,​\"authors\"​:...}\n\n\nIn each case,\n\n an action is a JSON object on a line by itself, and\n the source object is another JSON object on the next line.\n\n\nElasticsearch’s bulk API allows you to chain any number of these together like so:\n\n1\n2\n3\n4\n {​\"index\"​:{​\"_id\"​:​\"pg11\"​}}\n​ {​\"id\"​:11,​\"title\"​:​\"Alice's Adventures in Wonderland\"​,​\"authors\"​:...}\n​ {​\"index\"​:{​\"_id\"​:​\"pg132\"​}}\n​ {​\"id\"​:132,​\"title\"​:​\"The Art of War\"​,​\"authors\"​:...}\n\n\nTo find and open each of the RDF files under the data/cache/epub directory, we will use a module called node-dir.\n\nInstall it:\n\n1\n​​$ ​​npm​​ ​​install​​ ​​​​node-dir\n\n\nThis module comes with a handful of useful methods for walking a directory tree.\n\nThe method we’ll use is \nreadFiles, \nwhich sequentially operates on files as it encounters them while walking a directory tree.\n\n \n Argumentos de readFiles\n \n \n encoding: file encoding (defaults to 'utf8')\n exclude: a regex pattern or array to specify filenames to ignore\n excludeDir: a regex pattern or array to specify directories to ignore\n match: a regex pattern or array to specify filenames to operate on\n matchDir: a regex pattern or array to specify directories to recurse\n recursive: whether to recurse subdirectories when reading files (defaults to true)\n reverse: sort files in each directory in descending order\n shortName: whether to aggregate only the base filename rather than the full filepath\n sort: sort files in each directory in ascending order (defaults to true)\n doneOnErr: control if done function called on error (defaults to true)\n \n\n\nrdf-to-bulk\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n// Run as:\n// node rdf-to-bulk.js ../data/cache/epub | head\n// or gulp c5-rdf-to-json-11\n'use strict';\nconst dir = require('node-dir');\nconst parseRDF = require(__dirname+'/lib/parse-rdf.js');\nconst dirname = process.argv[2];\n\nconst options = {\n match: /\\.rdf$/,\n exclude: ['pg0.rdf']\n};\n\n// Because the head command closes the pipe after echoing the beginning lines\n// we capture error events on the process.stdout stream\nprocess.stdout.on('error', err => process.exit());\n\ndir.readFiles(dirname, options, (err, content, next) => {\n if (err) throw err;\n const doc = parseRDF(content);\n console.log(JSON.stringify({ index: { _id: `pg${doc.id}`} }));\n console.log(JSON.stringify(doc));\n next();\n});\n\n\n\nThe _id field of each index operation is the unique identifier that Elasticsearch will use for the document.\n\nHere the author has chosen to use the string pg followed by the Project Gutenberg ID. This way, if we ever wanted to store documents from another source in the same index, they shouldn’t collide with the Project Gutenberg book data.\n\nRun the program like that:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ node rdf-to-bulk.js ../data/cache/epub | head\n{\"index\":{\"_id\":\"pg1\"}}\n{\"id\":1,\"title\":\"The Declaration of Independence of the United States of America\",\"authors\":[\"Jefferson, Thomas\"],\"subjects\":[\"United States -- History -- Revolution, 1775-1783 -- Sources\",\"United States. Declaration of Independence\"]}\n{\"index\":{\"_id\":\"pg10\"}}\n{\"id\":10,\"title\":\"The King James Version of the Bible\",\"authors\":[],\"subjects\":[\"Bible\"]}\n{\"index\":{\"_id\":\"pg100\"}}\n{\"id\":100,\"title\":\"The Complete Works of William Shakespeare\",\"authors\":[\"Shakespeare, William\"],\"subjects\":[\"English drama -- Early modern and Elizabethan, 1500-1600\"]}\n{\"index\":{\"_id\":\"pg1000\"}}\n{\"id\":1000,\"title\":\"La Divina Commedia di Dante: Complete\",\"authors\":[\"Dante Alighieri\"],\"subjects\":[]}\n{\"index\":{\"_id\":\"pg10000\"}}\n{\"id\":10000,\"title\":\"The Magna Carta\",\"authors\":[\"Anonymous\"],\"subjects\":[\"Constitutional history -- England -- Sources\",\"Magna Carta\"]}\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ \n\n\nBecause the head command closes the pipe after echoing the beginning lines, this can sometimes cause Node.js to throw an exception.\nWe can capture error events on the process.stdout stream. That is why we have added the following line to rdf-to-bulk.js:\n\n1\n​ \tprocess.stdout.on(​'error'​, err => process.exit());\n\n\nUse the following command to capture the output in a new file called bulk_pg.ldj.\n1\n ​​node​​ ​​rdf-to-bulk.js​​ ​​../data/cache/epub/​​ ​​>​​ ​​../data/bulk_pg.ldj​\n\n\nEsto lleva su tiempo, en mi máquina ocupa mas de 12MB:\n\n1\n2\n3\n4\n5\n6\n$ ls -lh data/\ntotal 46664\n-rw-r--r-- 1 casiano staff 294B 29 oct 2018 README.md\n-rw-r--r-- 1 casiano staff 12M 11 mar 2019 bulk_pg.ldj\n-rw-r--r-- 1 casiano staff 10M 20 nov 2018 bulk_result.json\ndrwxr-xr-x 3 casiano staff 96B 25 oct 2018 cache\n\n\nLa práctica p9-t3-transforming-data: Extracting Classigication Codes and Sources\n\n\n La práctica p9-t3-transforming-data\n\n\nEl Reto: Precios de Hiperdino\n\n\n Escriba un programa que liste los precios de Hiperdino por categoría del producto\n\n", "url": "/clases/2019/12/09/leccion.html" }, { "title": "Clase del Lunes 16/12/2019", "excerpt": "Clase del Lunes 16/12/2019\n\n", "content": "Clase del Lunes 16/12/2019\n\nFinal de Curso\n\n\n Descripción del calendario\n Entiendo que las clases se acaban el 17/01/2019\n Los exámenes aparece del 20/01 al 01/02. Los de la Web ULL no han actualizado el enlace, pero es este:\n \n Exámenes de la Convocatoria de Enero\n Enero:\n \n 24/1/2020\n 16:00\n 2.2\n 31/1/2020\n 16:00\n 2.2\n \n \n Junio\n \n 3/7/2020\n 16:00\n 2.2\n \n \n Septiembre\n \n 4/9/2020\n 16:00\n 2.2\n \n \n \n \n Cierre de actas: Viernes 7 de Febrero de 2020\n Hemos añadido una práctica nueva y el Trabajo Fin de Asignatura\n \n p11-t3-restful\n p12-tfa-user-experience\n \n \n Pueden encontrar las soluciones a las prácticas del autor del libro en este repo ULL-MII-SYTWS-1920/book-solution-nodejs-the-right-way. Debería tener permisos de acceso\n Para cada convocatoria, las prácticas deberían estar entregadas en su mayoría 5 días antes antes de los cierres de actas, que son estos días:\n \n Viernes 14 de Febrero 2020\n Viernes 27 de Marzo 2020\n Jueves 25 de Junio 2020\n Miércoles 22 de Julio 2020\n Jueves 25 de Septiembre 2020\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n \n\n\nRecapping the Transforming Data and Testing Continuously Lesson\n\ntest/parse-rdf-test.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n​ 'use strict';\n\nconst fs = require('fs');\nconst expect = require('chai').expect;\nconst parseRDF = require('../lib/parse-rdf.js');\nconst rdf = fs.readFileSync(`${__dirname}/pg132.rdf`);\n\ndescribe(\"Chapter 5: Transforming Data and Testing Continuously\", () => {\n describe('parseRDF', () => {\n it('should be a function', () => {\n debugger;\n expect(parseRDF).to.be.a('function');\n });\n it('should parse RDF content', () => {\n const book = parseRDF(rdf);\n // https://www.chaijs.com/api/bdd/#method_language-chains\n expect(book).to.be.a('object');\n\n expect(book).to.have.a.property('id', 132);\n\n expect(book).to.have.a.property('title', 'The Art of War');\n\n expect(book).to.have.a.property('authors').that.is.an('array').with.lengthOf(2).\n and.contains('Sunzi, active 6th century B.C.').\n and.contains('Giles, Lionel');\n\n expect(book).to.have.a.property('subjects').that.is.an('array').with.lengthOf(2).\n and.contains('Military art and science -- Early works to 1800').\n and.contains('War -- Early works to 1800');\n });\n });\n});\n\n\nlib/parse-rdf.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n'use strict';\nconst cheerio = require(\"cheerio\");\n\nmodule.exports = rdf => {\n const $ = cheerio.load(rdf);\n const book = {};\n\n /* We're trying to grab the number 132 out of this XML tag:\n <pgterms:ebook rdf:about=\"ebooks/132\">\n */\n book.id = + // Convert to a number\n $('pgterms\\\\:ebook') // In CSS, the colon : is used for pseudo selectors (like :hover) that is why we have to escape it\n .attr('rdf:about') // get the rdf:about attribute\n .replace('ebooks/','');\n // Find <dcterms:title>The Art of War</dcterms:title>\n book.title = $('dcterms\\\\:title').text();\n\n book.authors = $('pgterms\\\\:agent pgterms\\\\:name')\n .toArray() // The collection object returned is not a true Array we have to convert it\n .map(\n (e) => { // e is a document node has no text method\n // that is why we wrap it $(e) to a cheerio object\n return $(e).text();\n }\n );\n\n\n book.subjects = $('[rdf\\\\:resource$=\"/LCSH\"]').\n parent() // https://api.jquery.com/parent/\n .find('rdf\\\\:value') // https://api.jquery.com/find/\n .toArray()\n .map(e => $(e).text());\n return book;\n};\n\n\nUsing this, we can now quickly put together a command-line program to explore some of the other RDF files. Open your editor and enter this:\n\nrdf-to-json.js\n\n1\n2\n3\n4\n5\n6\n#!/usr/bin/env node\nconst fs = require('fs');\nconst parseRDF = require('./lib/parse-rdf.js');\nconst rdf = fs.readFileSync(process.argv[2]);\nconst book = parseRDF(rdf);\nconsole.log(JSON.stringify(book, null, ' '));\n\n\nWhen calling JSON.stringify we’re passing three arguments:\n\n The second argument (null) is an optional replacer function that can be used for filtering\n The last argument (' ') is used to indent nested objects, making the output more human-readable.\n\n\nLet’s open a terminal in our databases project directory and run it:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5(master)]$ cd databases/\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ls -l rdf-to-json.js \n-rw-r--r-- 1 casiano staff 217 7 nov 13:36 rdf-to-json.js\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ chmod a+x rdf-to-json.js \n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ls -l rdf-to-json.js \n-rwxr-xr-x 1 casiano staff 217 7 nov 13:36 rdf-to-json.js\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ ./rdf-to-json.js ../data/cache/epub//11/pg11.rdf \n{\n \"id\": 11,\n \"title\": \"Alice's Adventures in Wonderland\",\n \"authors\": [\n \"Carroll, Lewis\"\n ],\n \"subjects\": [\n \"Fantasy literature\"\n ]\n}\n\n\nProcessing Data Files Sequentially\n\nOur lib/parse-rdf.js converts RDF content into JSON documents.\n\nAll that remains is to walk through the Project Gutenberg catalog directory and collect all the JSON documents.\n\nMore concretely, we need to do the following:\n\n\n Traverse down the data/cache/epub directory looking for files ending in rdf.\n Read each RDF file.\n Run the RDF content through parseRDF.\n Collect the JSON serialized objects into a single, bulk file for insertion.\n\n\nThe NoSQL database we’ll be using is Elasticsearch, a document datastore that indexes JSON objects.\n\nGOAL: We want to transform the Gutenberg data into an intermediate form for bulk import.\n\nElasticsearch has a bulk-import API that lets you pull in many records at once\n\nAlthough we could insert them one at a time, it is significantly faster to use the bulk-insert API.\n\nThe format of the file we need to create is described on Elasticsearch’s Bulk API page\n\nIt’s an LDJ file consisting of\n\n actions and\n the source objects on which to perform each action.\n\n\nIn our case, we’re performing index operations—that is, \ninserting new documents into an index.\n\nEach source object is the book object returned by parseRDF.\nHere’s an example of an action followed by its source object:\n\n1\n2\n​ {​\"index\"​:{​\"_id\"​:​\"pg11\"​}}\n​ {​\"id\"​:11,​\"title\"​:​\"Alice's Adventures in Wonderland\"​,​\"authors\"​:...}\n\n\nAnd here’s another one:\n\n1\n2\n​ {​\"index\"​:{​\"_id\"​:​\"pg132\"​}}\n​ {​\"id\"​:132,​\"title\"​:​\"The Art of War\"​,​\"authors\"​:...}\n\n\nIn each case,\n\n an action is a JSON object on a line by itself, and\n the source object is another JSON object on the next line.\n\n\nElasticsearch’s bulk API allows you to chain any number of these together like so:\n\n1\n2\n3\n4\n {​\"index\"​:{​\"_id\"​:​\"pg11\"​}}\n​ {​\"id\"​:11,​\"title\"​:​\"Alice's Adventures in Wonderland\"​,​\"authors\"​:...}\n​ {​\"index\"​:{​\"_id\"​:​\"pg132\"​}}\n​ {​\"id\"​:132,​\"title\"​:​\"The Art of War\"​,​\"authors\"​:...}\n\n\nTo find and open each of the RDF files under the data/cache/epub directory, we will use a module called node-dir.\n\nInstall it:\n\n1\n​​$ ​​npm​​ ​​install​​ ​​​​node-dir\n\n\nThis module comes with a handful of useful methods for walking a directory tree.\n\nThe method we’ll use is \nreadFiles, \nwhich sequentially operates on files as it encounters them while walking a directory tree.\n\n \n Argumentos de readFiles\n \n \n encoding: file encoding (defaults to 'utf8')\n exclude: a regex pattern or array to specify filenames to ignore\n excludeDir: a regex pattern or array to specify directories to ignore\n match: a regex pattern or array to specify filenames to operate on\n matchDir: a regex pattern or array to specify directories to recurse\n recursive: whether to recurse subdirectories when reading files (defaults to true)\n reverse: sort files in each directory in descending order\n shortName: whether to aggregate only the base filename rather than the full filepath\n sort: sort files in each directory in ascending order (defaults to true)\n doneOnErr: control if done function called on error (defaults to true)\n \n\n\nrdf-to-bulk\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n// Run as:\n// node rdf-to-bulk.js ../data/cache/epub | head\n// or gulp c5-rdf-to-json-11\n'use strict';\nconst dir = require('node-dir');\nconst parseRDF = require(__dirname+'/lib/parse-rdf.js');\nconst dirname = process.argv[2];\n\nconst options = {\n match: /\\.rdf$/,\n exclude: ['pg0.rdf']\n};\n\n// Because the head command closes the pipe after echoing the beginning lines\n// we capture error events on the process.stdout stream\nprocess.stdout.on('error', err => process.exit());\n\ndir.readFiles(dirname, options, (err, content, next) => {\n if (err) throw err;\n const doc = parseRDF(content);\n console.log(JSON.stringify({ index: { _id: `pg${doc.id}`} }));\n console.log(JSON.stringify(doc));\n next();\n});\n\n\n\nThe _id field of each index operation is the unique identifier that Elasticsearch will use for the document.\n\nHere the author has chosen to use the string pg followed by the Project Gutenberg ID. This way, if we ever wanted to store documents from another source in the same index, they shouldn’t collide with the Project Gutenberg book data.\n\nRun the program like that:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ node rdf-to-bulk.js ../data/cache/epub | head\n{\"index\":{\"_id\":\"pg1\"}}\n{\"id\":1,\"title\":\"The Declaration of Independence of the United States of America\",\"authors\":[\"Jefferson, Thomas\"],\"subjects\":[\"United States -- History -- Revolution, 1775-1783 -- Sources\",\"United States. Declaration of Independence\"]}\n{\"index\":{\"_id\":\"pg10\"}}\n{\"id\":10,\"title\":\"The King James Version of the Bible\",\"authors\":[],\"subjects\":[\"Bible\"]}\n{\"index\":{\"_id\":\"pg100\"}}\n{\"id\":100,\"title\":\"The Complete Works of William Shakespeare\",\"authors\":[\"Shakespeare, William\"],\"subjects\":[\"English drama -- Early modern and Elizabethan, 1500-1600\"]}\n{\"index\":{\"_id\":\"pg1000\"}}\n{\"id\":1000,\"title\":\"La Divina Commedia di Dante: Complete\",\"authors\":[\"Dante Alighieri\"],\"subjects\":[]}\n{\"index\":{\"_id\":\"pg10000\"}}\n{\"id\":10000,\"title\":\"The Magna Carta\",\"authors\":[\"Anonymous\"],\"subjects\":[\"Constitutional history -- England -- Sources\",\"Magna Carta\"]}\n[~/local/src/CA/sol-nodejs-the-right-way/transforming-data-and-testing-continuously-chapter-5/databases(master)]$ \n\n\nBecause the head command closes the pipe after echoing the beginning lines, this can sometimes cause Node.js to throw an exception.\nWe can capture error events on the process.stdout stream. That is why we have added the following line to rdf-to-bulk.js:\n\n1\n​ \tprocess.stdout.on(​'error'​, err => process.exit());\n\n\nUse the following command to capture the output in a new file called bulk_pg.ldj.\n1\n ​​node​​ ​​rdf-to-bulk.js​​ ​​../data/cache/epub/​​ ​​>​​ ​​../data/bulk_pg.ldj​\n\n\nEsto lleva su tiempo, en mi máquina ocupa mas de 12MB:\n\n1\n2\n3\n4\n5\n6\n$ ls -lh data/\ntotal 46664\n-rw-r--r-- 1 casiano staff 294B 29 oct 2018 README.md\n-rw-r--r-- 1 casiano staff 12M 11 mar 2019 bulk_pg.ldj\n-rw-r--r-- 1 casiano staff 10M 20 nov 2018 bulk_result.json\ndrwxr-xr-x 3 casiano staff 96B 25 oct 2018 cache\n\n\nDescripción de la práctica p9-t3-transforming-data: Extracting Classification Codes and Sources\n\n\n La práctica p9-t3-transforming-data\n\n\nEl Reto: Precios de Hiperdino\n\n\n Escriba un programa que liste los precios de Hiperdino por categoría del producto\n\n", "url": "/clases/2019/12/16/leccion.html" }, { "title": "Clase del Miércoles 18/12/2019", "excerpt": "Clase del Miércoles 18/12/2019\n\n", "content": "Clase del Miércoles 18/12/2019\n\nFinal de Curso\n\n\n Descripción del calendario\n Entiendo que las clases se acaban el 17/01/2019\n Los exámenes aparece del 20/01 al 01/02. Los de la Web ULL no han actualizado el enlace, pero es este:\n \n Exámenes de la Convocatoria de Enero\n Enero:\n \n 24/1/2020\n 16:00\n 2.2\n 31/1/2020\n 16:00\n 2.2\n \n \n Junio\n \n 3/7/2020\n 16:00\n 2.2\n \n \n Septiembre\n \n 4/9/2020\n 16:00\n 2.2\n \n \n \n \n Cierre de actas: Viernes 7 de Febrero de 2020\n Hemos añadido una práctica nueva y el Trabajo Fin de Asignatura\n \n p11-t3-restful\n p12-tfa-user-experience\n \n \n Pueden encontrar las soluciones a las prácticas del autor del libro en este repo ULL-MII-SYTWS-1920/book-solution-nodejs-the-right-way. Debería tener permisos de acceso\n Para cada convocatoria, las prácticas deberían estar entregadas en su mayoría 5 días antes antes de los cierres de actas, que son estos días:\n \n Viernes 14 de Febrero 2020\n Viernes 27 de Marzo 2020\n Jueves 25 de Junio 2020\n Miércoles 22 de Julio 2020\n Jueves 25 de Septiembre 2020\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n \n\n\nChapter 6: Commanding DataBases\n\nEn este capítulo del libro \n(práctica p10-t3-commanding-databases/)\nconstruiremos un programa de línea de comandos esclu \npara interactuar con la base de datos Elasticsearch.\n\nElasticsearch is a schema-free, RESTful, NoSQL database that stores and indexes JSON documents over HTTP.\n\nNuestro programa esclu hará requests REST al servidor de ElasticSearch y este retornará un JSON con la respuesta al \nrequest. Sigue un ejemplo de ejecución.\n\nPuesto que la salida es un JSON muy grande, la hemos canalizado a un programa \njq (JSON query language):\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n$ ./esclu query authors:Twain AND subjects:children | jq .hits.hits[1]._source\n{\n \"id\": 1837,\n \"title\": \"The Prince and the Pauper\",\n \"authors\": [\n \"Twain, Mark\"\n ],\n \"subjects\": [\n \"Edward VI, King of England, 1537-1553 -- Fiction\",\n \"Lookalikes -- Fiction\",\n \"London (England) -- Fiction\",\n \"Historical fiction\",\n \"Impostors and imposture -- Fiction\",\n \"Boys -- Fiction\",\n \"Princes -- Fiction\",\n \"Social classes -- Fiction\",\n \"Poor children -- Fiction\"\n ]\n}\n\n\nLo que nos permite el DSL jq es navegar a través del JSON y obtener el campo en el que estamos interesados. En\nel ejemplo anterior la salida del comando ./esclu query authors:Twain AND subjects:children es un JSON como este:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n{\n \"took\": 37,\n ...\n \"hits\": {\n \"total\": 41,\n \"max_score\": 9.074243,\n \"hits\": [\n { ... },\n {\n ...\n \"_id\": \"pg7195\",\n \"_source\": {\n \"id\": 1837,\n \"title\": \"The Prince and the Pauper\",\n ...\n }\n },\n ...\n }\n\n\nDe manera que con la expresión jq .hits.hits[1]._source describimos un elemento concreto del JSON.\n\nElasticsearch es un servidor de búsqueda basado en Lucene. Provee un motor de búsqueda de texto completo, distribuido y con capacidad de multi-tenencia con una interfaz web RESTful y con documentos JSON. Elasticsearch está desarrollado en Java y está publicado como código abierto bajo las condiciones de la licencia Apache.\n\nUsando el comando esclu bulk cargaremos los documentos JSON generados en el capítulo\nanterior en la base de datos de Elasticsearch:\n\n1\n$ ./esclu bulk ../data/bulk_pg.ldj -i books -t book > ../data/bulk_result.json\n\n\n\n\nElasticsearch y Kibana\n\n\n Vea la sección Elasticsearch y Kibana de los apuntes\n\n\nCreating a Command-Line Program in Node.js with Commander\n\nNow, we are going to start to build a command-line program that provides access to the Elasticsearch\nserver.\n\nWe’ll start by creating a package.json inside the folder esclu:\n\n1\n2\n3\n$ mkdir esclu\n$ cd esclu\n$ npm init -f\n\n\nIntroducing the Commander and Request Modules\n\nWe’re going to use a module called Commander, which makes it easy to construct elaborate and powerful command-line tools in Node.js. We will use the module request to write our requests to the elasticsearch server:\n\n1\nnpm i commander request\n\n\n\n Commander at GitHub\n Commander: Teacher examples\n Commander: Examples of use\n YouTube Video commander.js, npm scopes, and node.js cli’s (part 1)\n\n\nAlternatives to Commander and Request\n\n\n yargs\n node-fetchThis module implements the Fetch API\n\n\nAdding a Command to Your program\n\nURLs in Elasticsearch RESTful Search Engine\n\nIn Elasticsearch, the RESTful resources are JSON documents.\n\nEach Elasticsearch document:\n\n\n lives in an index and\n has a type, which defines a class of related documents.\n\n\nTo construct a URL for an Elasticsearch document,\n\n first you append which index you’re interested in (if any) and then\n optionally the type of object you’re interested in, separated by slashes.\n\n\nTo get information about your whole cluster, you could make an HTTP GET request to the root: http://localhost:9200/.\n\nTo request information about the index named books, you would GET http://localhost:9200/books.\n\n\n See Index vs. Type article:\n \n In the past we tried to make elasticsearch easier to understand by building an analogy with relational databases: *indices would be like a database, and types like a table in a database.*\n This was a mistake: the way data is stored is so different that any comparisons can hardly make sense, and this ultimately led to an overuse of types in cases where they were more harmful than helpful.\n \n \n\n\nSee the code of fullUrl\n\nAdding a command in Commander.js\n\nAdding a command in commander.js consists of three steps:\n\n\n Specifying the command name and parameters url [path]\n \n Required arguments should be surrounded by angle brackets <file>\n Optional arguments should be surrounded by square brackets [path]\n \n \n Providing a description 'generate the URL for the options and path (default is /)'\n Setting up an action callback (path= \"/\") => console.log(fullUrl(path))\n\n\nSee the code that adds the command esclu url path\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu\nUsage: esclu [options] <command> [...]\n\nElasticsearch command line utilities\n\nOptions:\n -V, --version output the version number\n -o, --host <hostname> hostname [localhost] (default: \"localhost\")\n -p, --port <number> port number [9200] (default: \"9200\")\n -j, --json format output as json\n -i, --index <name> which index to use\n -t, --type <type> default type for bulk operations\n -h, --help output usage information\n\nCommands:\n url [path] generate the URL for the options and path (default is /)\n get [path] perform and HTTP GET request for path (default is /)\n create-index create an index\n\n\n1\n2\n~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu url\nhttp://localhost:9200/\n\n\n1\n2\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu url 'some/path' -p 8080 -o mymachine.ull.es\nhttp://mymachine.ull.es:8080/some/path\n\n\nTesting web services with json-server and Postman\n\n\n json-server\n Video Create a Fake REST API with JSON-Server Usa postman para los requests\n Video en egg-head describiendo el uso de json-server\n postman\n Video Create A REST API With JSON Server\n\n\nUsing request to Fetch JSON over HTTP\n\n\n request npm\n Código de get path\n\n\n1\n2\n3\n4\n5\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu -o api.github.com -p 80 -j get /repos/stedolan/jq/commits?per_page=5 | jq '.[0] | {message: .commit.message, name: .commit.committer.name}'\n{\n \"message\": \"Minor website fixes for 1.6\",\n \"name\": \"William Langford\"\n}\n\n\nCreating an Elastic Index\n\n\n Code of create-index\n Why PUT and no POST?\n \n PUT vs. POST in REST Stack Overflow\n Better is to choose between PUT and POST based on idempotence of the action.\n PUT implies putting a resource - completely replacing whatever is available at the given URL with a different thing. By definition, a PUT is idempotent. Do it as many times as you like, and the result is the same. x=5 is idempotent. You can PUT a resource whether it previously exists, or not (eg, to Create, or to Update)!\n POST updates a resource, adds a subsidiary resource, or causes a change. A POST is not idempotent, in the way that x++ is not idempotent.\n By this argument, PUT is for creating when you know the URL of the thing you will create. POST can be used to create when you know the URL of the “factory” or manager for the category of things you want to create.\n so: POST /expense-report\n or: PUT /expense-report/10929\n \n \n\n\nListing Elasticsearch indices\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu li -h\nUsage: list-indices|li [options]\n\nget a list of indices in this cluster\n\nOptions:\n -h, --help output usage information\n\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu li\nhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.size\nyellow open prueba HdtW7qEZTP-2Wx78ICygEA 5 1 0 0 1.2kb 1.2kb\nyellow open accounts 9TNc0k0LQ1e4y97yFX8_vg 5 1 2 0 10.4kb 10.4kb\nyellow open books wP3DgQPZQZq0qBtH_dd0LA 5 1 0 0 1.2kb 1.2kb\n\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu -j li | jq\n{\n \"accounts\": {\n \"aliases\": {},\n \"mappings\": {\n \"person\": {\n \"properties\": {\n \"job_description\": {\n \"type\": \"text\",\n \"fields\": {\n \"keyword\": {\n \"type\": \"keyword\",\n \"ignore_above\": 256\n }\n }\n },\n \"lastname\": {\n \"type\": \"text\",\n \"fields\": {\n \"keyword\": {\n \"type\": \"keyword\",\n \"ignore_above\": 256\n }\n }\n },\n \"name\": {\n \"type\": \"text\",\n \"fields\": {\n \"keyword\": {\n \"type\": \"keyword\",\n \"ignore_above\": 256\n }\n }\n }\n }\n }\n },\n \"settings\": {\n \"index\": {\n \"creation_date\": \"1541679750244\",\n \"number_of_shards\": \"5\",\n \"number_of_replicas\": \"1\",\n \"uuid\": \"9TNc0k0LQ1e4y97yFX8_vg\",\n \"version\": {\n \"created\": \"6040299\"\n },\n \"provided_name\": \"accounts\"\n }\n }\n },\n \"books\": {\n \"aliases\": {},\n \"mappings\": {},\n \"settings\": {\n \"index\": {\n \"creation_date\": \"1542216727600\",\n \"number_of_shards\": \"5\",\n \"number_of_replicas\": \"1\",\n \"uuid\": \"wP3DgQPZQZq0qBtH_dd0LA\",\n \"version\": {\n \"created\": \"6040299\"\n },\n \"provided_name\": \"books\"\n }\n }\n },\n \"prueba\": {\n \"aliases\": {},\n \"mappings\": {},\n \"settings\": {\n \"index\": {\n \"creation_date\": \"1542217420653\",\n \"number_of_shards\": \"5\",\n \"number_of_replicas\": \"1\",\n \"uuid\": \"HdtW7qEZTP-2Wx78ICygEA\",\n \"version\": {\n \"created\": \"6040299\"\n },\n \"provided_name\": \"prueba\"\n }\n }\n }\n}\n\n\nShaping JSON with jq\n\n\n jq manual\n JSON on the command line with jq\n YouTube vídeo JSON: Like a Boss. Bob Tiernay explores the fascinating world of jq, “the JSON Processor”. Starting with a motivation, he then covers the language, provides helpful tips, showcases a real world example, cautions some things to avoid and finishes with a discussion of the ecosystem.\n jq recipes\n\n\n1\n2\n3\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ jq -V\njq-1.5\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ jq --help\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\njq - commandline JSON processor [version 1.5]\nUsage: jq [options] <jq filter> [file...]\n\n\tjq is a tool for processing JSON inputs, applying the\n\tgiven filter to its JSON text inputs and producing the\n\tfilter's results as JSON on standard output.\n\tThe simplest filter is ., which is the identity filter,\n\tcopying jq's input to its output unmodified (except for\n\tformatting).\n\tFor more advanced filters see the jq(1) manpage (\"man jq\")\n\tand/or https://stedolan.github.io/jq\n\n\tSome of the options include:\n\t -c\t\tcompact instead of pretty-printed output;\n\t -n\t\tuse `null` as the single input value;\n\t -e\t\tset the exit status code based on the output;\n\t -s\t\tread (slurp) all inputs into an array; apply filter to it;\n\t -r\t\toutput raw strings, not JSON texts;\n\t -R\t\tread raw strings, not JSON texts;\n\t -C\t\tcolorize JSON;\n\t -M\t\tmonochrome (don't colorize JSON);\n\t -S\t\tsort keys of objects on output;\n\t --tab\tuse tabs for indentation;\n\t --arg a v\tset variable $a to value <v>;\n\t --argjson a v\tset variable $a to JSON value <v>;\n\t --slurpfile a f\tset variable $a to an array of JSON texts read from <f>;\n\tSee the manpage for more options.\n\n\nSee also the man pages:\n\n1\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ man jq\n\n\n1\n2\n3\n4\n5\n6\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu li -j | jq '.books | keys'\n[\n \"aliases\",\n \"mappings\",\n \"settings\"\n]\n\n\n1\n2\n3\n4\n5\n6\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _stats | jq keys\n[\n \"_all\",\n \"_shards\",\n \"indices\"\n]\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _stats | jq -r 'path(..)| map(tostring) |join(\".\")' | head -n 20\n\n_shards\n_shards.total\n_shards.successful\n_shards.failed\n_all\n_all.primaries\n_all.primaries.docs\n_all.primaries.docs.count\n_all.primaries.docs.deleted\n_all.primaries.store\n_all.primaries.store.size_in_bytes\n_all.primaries.indexing\n_all.primaries.indexing.index_total\n_all.primaries.indexing.index_time_in_millis\n_all.primaries.indexing.index_current\n_all.primaries.indexing.index_failed\n_all.primaries.indexing.delete_total\n_all.primaries.indexing.delete_time_in_millis\n_all.primaries.indexing.delete_current\n\n\n1\n2\n3\n4\n5\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _stats | jq '._all.primaries | { count: .docs.count, size: .store.size_in_bytes}'\n{\n \"count\": 58161,\n \"size\": 24424474\n}\n\n\n1\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ < ../../transforming-data-and-testing-continuously-chapter-5/data/bulk_result.json jq .items[0,1,2]\n\n\nInserting Elasticsearch Documents in Bulk\n\nRecall that in ​chapter Processing Data Files Sequentially​, we developed an LDJ data file containing interleaved commands and documents for Elasticsearch’s bulk API:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/local/src/CA/sol-nodejs-the-right-way(master)]$ head transforming-data-and-testing-continuously-chapter-5/data/bulk_pg.ldj\n{\"index\":{\"_id\":\"pg1\"}}\n{\"id\":1,\"title\":\"The Declaration of Independence of the United States of America\",\"authors\":[\"Jefferson, Thomas\"],\"subjects\":[\"United States -- History -- Revolution, 1775-1783 -- Sources\",\"United States. Declaration of Independence\"]}\n{\"index\":{\"_id\":\"pg10\"}}\n{\"id\":10,\"title\":\"The King James Version of the Bible\",\"authors\":[],\"subjects\":[\"Bible\"]}\n{\"index\":{\"_id\":\"pg100\"}}\n{\"id\":100,\"title\":\"The Complete Works of William Shakespeare\",\"authors\":[\"Shakespeare, William\"],\"subjects\":[\"English drama -- Early modern and Elizabethan, 1500-1600\"]}\n{\"index\":{\"_id\":\"pg1000\"}}\n{\"id\":1000,\"title\":\"La Divina Commedia di Dante: Complete\",\"authors\":[\"Dante Alighieri\"],\"subjects\":[]}\n{\"index\":{\"_id\":\"pg10000\"}}\n{\"id\":10000,\"title\":\"The Magna Carta\",\"authors\":[\"Anonymous\"],\"subjects\":[\"Constitutional history -- England -- Sources\",\"Magna Carta\"]}\n\n\n\n Code for command bulk <file>\n\n\nUnlike the get and url commands that took an optional parameter, the bulk command’s <file> parameter is required:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu bulk -h\nUsage: bulk [options] <file>\n\nread and perform bulk operations from the specified file\n\nOptions:\n -h, --help output usage information\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu bulk\nerror: missing required argument `file'\n\n\nInside the action callback, the first thing we do is use fs.stat to asynchronously check on the provided file. This asserts that the file exists and can be reached by the user running the process.\n\nUsing the size information from the stat call, we can specify the HTTP header content-length.\n\nThis is important because we’ll be streaming the file content to the server rather than handing all the content at once.\n\nUsing request.post, we initialize an HTTP POST request to Elasticsearch, capturing the returned object in a variable called req.\n\n1\n const req = request.post(options);\n\n\nThis object can be used as a writable stream (stream.Writable) for sending content,\n\nWe open a read stream to the file using fs.createReadStream and pipe that into the request object.\n\n1\n2\nconst stream = fs.createReadStream(file);\nstream.pipe(req);\n\nand also as a readable stream (stream.Readable) for receiving the server’s response.\n1\n req.pipe(process.stdout);\n\nThe task c6-build-books in the gulpfile.js performs the bulk insertion:\n\n1\n2\n3\n4\n5\ngulp.task(\"c6-build-books\", shell.task(\n `commanding-databases-chapter-6/esclu/esclu bulk `+\n `transforming-data-and-testing-continuously-chapter-5/data/bulk_pg.ldj `+\n `-i books -t book > transforming-data-and-testing-continuously-chapter-5/data/bulk_result.json`\n));\n\n\n1\n2\n3\n4\n5\n6\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ jq keys ../../transforming-data-and-testing-continuously-chapter-5/data/bulk_result.json\n[\n \"errors\",\n \"items\",\n \"took\"\n]\n\n\n1\n2\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ jq '.items | length ' ../../transforming-data-and-testing-continuously-chapter-5/data/bulk_result.json\n58161\n\n\nImplementing an Elasticsearch Query Command\n\nFirst we’ll take a look around using the existing get command, and then we’ll implement a specific command just for querying.\n\nFinding the Schema of a JSON FILE with jq\n\nLet us write a jq module with a function schemas:\n\n1\n2\n [~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ cat ~/.jq\ndef schemas: path(..) | map(tostring) | join(\".\");\n\n\nIt is saved in ~/.jq\n\nAnd use it:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _search | jq -r 'schemas' | head -n 20\n\ntook\ntimed_out\n_shards\n_shards.total\n_shards.successful\n_shards.skipped\n_shards.failed\nhits\nhits.total\nhits.max_score\nhits.hits\nhits.hits.0\nhits.hits.0._index\nhits.hits.0._type\nhits.hits.0._id\nhits.hits.0._score\nhits.hits.0._source\nhits.hits.0._source.id\nhits.hits.0._source.title\n\n\nThe result of a Search\n\n\n We see a took field, which indicates how long the request took to execute in milliseconds.\n The results of the query are in the hits object, which contains three fields:\n \n hits.total\n hits.max_score\n \n The max_score field indicates the score value of the highest-scoring match.\n Lucene (and thus Elasticsearch) uses the Boolean model to find matching documents, and\n a formula called the practical scoring function to calculate relevance.\n This formula borrows concepts from\n \n term frequency/inverse document frequency and\n the vector space model but\n \n \n adds more-modern features like\n \n a coordination factor,\n field length\n normalization, and\n term or query clause boosting.\n \n \n See scoring theory\n \n \n hits.hits\n \n The hits key points to an array of individual results.\n \n \n \n \n\n\nBy default the _search API will return only the top 10 results\n\nNote that by default the _search API will return only the top 10 results. This can be increased by specifying the size URL parameter.\n\nSearching for all books\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _search | jq '[.hits.hits[]._source][0,1]'\n{\n \"id\": 100,\n \"title\": \"The Complete Works of William Shakespeare\",\n \"authors\": [\n \"Shakespeare, William\"\n ],\n \"subjects\": [\n \"English drama -- Early modern and Elizabethan, 1500-1600\"\n ]\n}\n{\n \"id\": 1000,\n \"title\": \"La Divina Commedia di Dante: Complete\",\n \"authors\": [\n \"Dante Alighieri\"\n ],\n \"subjects\": []\n}\n\n\nQueries with q\n\nThrough the _search API, if you pass a query parameter, q,\nElasticsearch will use its value to find documents.\n\nSay we were interested in books by Mark Twain. We could search for documents whose authors array includes the substring Twain using the query expression q=\"authors:Twain\", like this:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n[~/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _search?q=\"authors:Twain\" | jq '.hits.hits[0]'\n{\n \"_index\": \"books\",\n \"_type\": \"book\",\n \"_id\": \"pg1837\",\n \"_score\": 6.9273376,\n \"_source\": {\n \"id\": 1837,\n \"title\": \"The Prince and the Pauper\",\n \"authors\": [\n \"Twain, Mark\"\n ],\n \"subjects\": [\n \"Edward VI, King of England, 1537-1553 -- Fiction\",\n \"Lookalikes -- Fiction\",\n \"London (England) -- Fiction\",\n \"Historical fiction\",\n \"Impostors and imposture -- Fiction\",\n \"Boys -- Fiction\",\n \"Princes -- Fiction\",\n \"Social classes -- Fiction\",\n \"Poor children -- Fiction\"\n ]\n }\n}\n\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _search?q=\"authors:Twain\" | jq '.hits.hits[] | ._source.title'\n\"The Prince and the Pauper\"\n\"Chapters from My Autobiography\"\n\"The Awful German Language\"\n\"Personal Recollections of Joan of Arc — Volume 1\"\n\"Personal Recollections of Joan of Arc — Volume 2\"\n\"In Defence of Harriet Shelley\"\n\"The Innocents Abroad\"\n\"The Mysterious Stranger, and Other Stories\"\n\"The Curious Republic of Gondour, and Other Whimsical Sketches\"\n\"The Innocents Abroad — Volume 03\"\n\nQuery Syntax Features\n\nElasticsearch’s query string syntax is a DSL with many useful features like\n\n\n wildcards,\n Boolean AND/OR operators,\n negation, and\n even regular expressions.\n\n\nSource Filtering\n\nElasticsearch supports source filtering.\n\nWe could use the source filter expression _source=title. It is a bit like ecma6 selecting only the field title of the corresponding object.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n[~/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get _search?q=\"authors:Twain&_source=title\" | jq '.hits.hits[0]'\n{\n \"_index\": \"books\",\n \"_type\": \"book\",\n \"_id\": \"pg1837\",\n \"_score\": 6.9273376,\n \"_source\": {\n \"title\": \"The Prince and the Pauper\"\n }\n}\n\nNow the _source objects contain only the title key.\n\nImplementing an Elasticsearch Query Command: esclu q authors:Twain\n\n\n The command will be called query, with the alias q for short.\n It will take any number of optional query parts, so the user won’t have to wrap the query in quotes.\n It can be specified an optional source filter expression to limit the output documents.\n\n\nExample:\n\n1\n​ \t​$ ​​./esclu​​ ​​q​​ ​​authors:Twain​​ ​​AND​​ ​​subjects:children​\n\n\n\n Solution\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu q authors:Twain AND subjects:children | jq .hits.hits[0,1]\n{\n \"_index\": \"books\",\n \"_type\": \"book\",\n \"_id\": \"pg7195\",\n \"_score\": 9.074243,\n \"_source\": {\n \"id\": 7195,\n \"title\": \"The Adventures of Tom Sawyer, Part 3.\",\n \"authors\": [\n \"Twain, Mark\"\n ],\n \"subjects\": [\n \"Humorous stories\",\n \"Child witnesses -- Fiction\",\n \"Boys -- Fiction\",\n \"Sawyer, Tom (Fictitious character) -- Fiction\",\n \"Male friendship -- Fiction\",\n \"Mississippi River Valley -- Fiction\",\n \"Bildungsromans\",\n \"Adventure stories\",\n \"Missouri -- Fiction\",\n \"Runaway children -- Fiction\"\n ]\n }\n}\n{\n \"_index\": \"books\",\n \"_type\": \"book\",\n \"_id\": \"pg1837\",\n \"_score\": 8.96923,\n \"_source\": {\n \"id\": 1837,\n \"title\": \"The Prince and the Pauper\",\n \"authors\": [\n \"Twain, Mark\"\n ],\n \"subjects\": [\n \"Edward VI, King of England, 1537-1553 -- Fiction\",\n \"Lookalikes -- Fiction\",\n \"London (England) -- Fiction\",\n \"Historical fiction\",\n \"Impostors and imposture -- Fiction\",\n \"Boys -- Fiction\",\n \"Princes -- Fiction\",\n \"Social classes -- Fiction\",\n \"Poor children -- Fiction\"\n ]\n }\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu q authors:Shakespeare AND subjects:drama -f title,authors,subjects | jq '.hits.hits | first, last | ._source'\n{\n \"subjects\": [\n \"Spirits -- Drama\",\n \"Tragicomedy\",\n \"Political refugees -- Drama\",\n \"Magicians -- Drama\",\n \"Shipwreck victims -- Drama\",\n \"Islands -- Drama\",\n \"Fathers and daughters -- Drama\"\n ],\n \"title\": \"The Tempest\",\n \"authors\": [\n \"Shakespeare, William\"\n ]\n}\n{\n \"subjects\": [\n \"Tragedies\",\n \"Denmark -- Drama\",\n \"Hamlet (Legendary character) -- Drama\",\n \"Princes -- Drama\",\n \"Revenge -- Drama\",\n \"Kings and rulers -- Succession -- Drama\",\n \"Fathers -- Death -- Drama\",\n \"Murder victims' families -- Drama\"\n ],\n \"title\": \"Hamlet\",\n \"authors\": [\n \"Shakespeare, William\"\n ]\n}\n\n\nChallenge: Deleting an Index\n\nAny database you work with will offer at least the following four CRUD operations:\n\n Create,\n Read,\n Update, and\n Delete\n\n\nRESTful datastores like Elasticsearch use a different HTTP method (or verb) for each operation:\n\n You use POST to create,\n GET to read,\n PUT to update, and\n DELETE to delete\n\n\nImplement a new command called delete-index,\nwhich checks for an index specified with the --index\nflag and issues an HTTP DELETE request to remove it.\n\nChallenge: Adding a Single Document\n\nAdd a new command called put, which inserts a new document for indexing (or overwrites the existing document if there’s a collision).\n\nWith the get command, you can already retrieve a book by its _id.\nFor example, here’s how to look up The Art of War by its ID:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu get pg132 --index books --type book | jq .\n{\n \"_index\": \"books\",\n \"_type\": \"book\",\n \"_id\": \"pg132\",\n \"_version\": 1,\n \"found\": true,\n \"_source\": {\n \"id\": 132,\n \"title\": \"The Art of War\",\n \"authors\": [\n \"Sunzi, active 6th century B.C.\",\n \"Giles, Lionel\"\n ],\n \"subjects\": [\n \"Military art and science -- Early works to 1800\",\n \"War -- Early works to 1800\"\n ]\n }\n}\n\n\nFor example, say we save the document part of the above response to a file, like so:\n\n1\n$ ./esclu get pg132 --index books --type book | jq '._source' > ../data/art_of_war.json\n\n\nIdeally, we should be able to reinsert the document from the file using the following command:\n1\n$ ./esclu put ../data/art_of_war.json -i books -t book --id pg132\n\n\nTo make this work, you’ll need to do the following:\n\n\n Add a new, optional, --id flag.\n Update the fullUrl function to append the ID in the returned URL.\n Add a new command called put that takes a single required parameter file\n Inside the action callback of your new command, assert that an ID was specified, or fail loudly.\n Stream the contents of the file to Elasticsearch through the request object and stream the results to standard output.\n\n\nReferences\n\n\n La práctica p10-t3-commanding-databases/\n\n\nCommander\n\n\n Commander examples\n\n\nYargs\n\n\n https://www.npmjs.com/package/yargs\n https://www.npmjs.com/package/superagent\n\n\njq\n\n\n jq manual\n JSON on the command line with jq\n jq simplified grammar extracted from the files parser.y and lexer.l in the jq sources\n https://stedolan.github.io/jq/\n https://stedolan.github.io/jq/manual/v1.5/#Builtinoperatorsandfunctions\n https://stedolan.github.io/jq/manual/v1.5/#Basicfilters\n https://stedolan.github.io/jq/manual/v1.5/\n\n\nElasticsearch\n\n\n A Practical Introduction to Elasticsearch By Ismael Hasan Romero\n Node Js Elastic Search Tutorial Example\n Build a Search Engine with Node.js and Elasticsearch\nSeptember 27, 2016, By Behrooz Kamali SitePoint\n Elasticsearch & Node.js Getting Started\n http://lucene.apache.org/\n https://www.elastic.co/downloads/past-releases/elasticsearch-5-2-2\n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/system-config.html\n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/query-dsl-query-string-query.html#query-string-syntax\n https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html\n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/docs-index_.html\n Elasticsearch Essentials. Bharvi Dixit 2016\n\n\nChrome Plugin ElasticSearch Head\n\n\n \n \n YouTube video: How To Use Sense And Head ElasticSearch Chrome Extensions\n\n\nKibana\n\n\n Install Kibana on macOS with Homebrew\n Kibana 7 Quick Start Guide. Anurag Srivastava 2019 Libro en PuntoQ\n\n\nJava\n\n\n http://docs.oracle.com/javase/8/docs/technotes/guides/install/install_overview.html\n\n\nHTTP Nodejs\n\n\n https://nodejs.org/api/http.html\n\n\nfetch y node-fetch\n\n\n \n https://www.npmjs.com/package/node-fetch\n \n \n https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch\n \n\n\nStreams en Node.js\n\n\n https://nodejs.org/api/stream.html\n\n", "url": "/clases/2019/12/18/leccion.html" }, { "title": "Clase del Lunes 13/01/2020", "excerpt": "Clase del Lunes 13/01/2020\n\n", "content": "Clase del Lunes 13/01/2020\n\nFinal de Curso\n\n\n Descripción del calendario\n Entiendo que las clases se acaban el 17/01/2019\n Los exámenes aparece del 20/01 al 01/02. Los de la Web ULL no han actualizado el enlace, pero es este:\n \n Exámenes de la Convocatoria de Enero\n Enero:\n \n 24/1/2020\n 16:00\n 2.2\n 31/1/2020\n 16:00\n 2.2\n \n \n Junio\n \n 3/7/2020\n 16:00\n 2.2\n \n \n Septiembre\n \n 4/9/2020\n 16:00\n 2.2\n \n \n \n \n Cierre de actas: Viernes 7 de Febrero de 2020\n Hemos añadido una práctica nueva y el Trabajo Fin de Asignatura\n \n p11-t3-restful\n p12-tfa-user-experience\n \n \n Pueden encontrar las soluciones a las prácticas del autor del libro en este repo ULL-MII-SYTWS-1920/book-solution-nodejs-the-right-way. Debería tener permisos de acceso\n Para cada convocatoria, las prácticas deberían estar entregadas en su mayoría 5 días antes antes de los cierres de actas, que son estos días:\n \n Viernes 14 de Febrero 2020\n Viernes 27 de Marzo 2020\n Jueves 25 de Junio 2020\n Miércoles 22 de Julio 2020\n Jueves 25 de Septiembre 2020\n \n \n\n\n\n\n\n \n \n \n \n \n \n \n \n\n\nDescripción de la Práctica Developing RESTful Web Services\n\nDescripción de la Práctica p11-t3-restful\n\nAdvantages of Express\nExpress is modeled after Ruby Sinatra http://www.sinatrarb.com/\n\nweb-services/server.js\n\n1\n2\n3\n4\n5\n6\n7\n'use strict';\nconst http = require('http');\nconst server = http.createServer((req, res) => {\n res.writeHead(200, {'Content-Type': 'text/plain'});\n res.end('Hello World!\\n');\n});\nserver.listen(60700, () => console.log('Server listening in port 60700'))\n\n\nA typical web server would take care of lots of little jobs that this code doesn’t touch.\n\nHere are some examples:\n\n\n Routing based on URL paths\n Managing sessions via cookies\n Parsing incoming requests (such as form data or JSON)\n Rejecting malformed requests\n\n\nThe Express http://expressjs.com/framework helps with these and myriad other tasks.\n\nServing APIs with Express\n\n1\n2\n3\n4\n5\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7(master)]$ npm i express morgan\n+ morgan@1.9.1\n+ express@4.16.4\nadded 48 packages from 35 contributors and audited 475 packages in 8.46s\nfound 0 vulnerabilities\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n[~/.../web-services/b4(master)]$ jq .dependencies ~/sol-nodejs-the-right-way/package.json\n{\n \"chai\": \"^4.2.0\",\n \"cheerio\": \"^1.0.0-rc.2\",\n \"commander\": \"^2.19.0\",\n \"express\": \"^4.16.4\",\n \"morgan\": \"^1.9.1\",\n \"nconf\": \"^0.10.0\",\n \"node-dir\": \"^0.1.17\",\n \"node-red\": \"^0.19.5\",\n \"nodemon\": \"^1.18.7\",\n \"request\": \"^2.88.0\",\n \"request-promise\": \"^4.2.2\",\n \"zeromq\": \"^5.0.0\",\n \"zerorpc\": \"^0.9.8\"\n}\n\n\nCode of hello/server.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n'use strict';\nconst express = require('express');\nconst morgan = require('morgan');\n\nconst app = express();\n\napp.use(morgan('dev'));\n\n// In addition to get(), Express has put(), post(), and delete()\n// methods to register handlers for HTTP PUT, POST, and DELETE requests,\n// respectively\napp.get('/hello/:name', (req, res) => {\n res.status(200).json({hello: req.params.name});\n});\n\napp.listen(60701, ()=> console.log(\"Listening on 60701\"));\n\n\n\nStarting the Client:\n\n1\n2\n3\ngulp.task(\"c7-express-client\", shell.task(\n `curl -s localhost:60701/hello/ivan | jq`\n));\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6(master)]$ gulp c7-express-client\n[12:33:33] Working directory changed to ~/local/src/CA/sol-nodejs-the-right-way\n[12:33:33] Using gulpfile ~/local/src/CA/sol-nodejs-the-right-way/gulpfile.js\n[12:33:33] Starting 'c7-express-client'...\n{\n \"hello\": \"ivan\"\n}\n[12:33:33] Finished 'c7-express-client' after 51 ms\n\n\nOur Goal in this Chapter: Writing Modular Express Services\n\nWe’re going to build a RESTful web service with Express for creating and managing book bundles. Here’s an example of a book bundle:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n​ \t{\n​ \t ​\"name\"​: ​\"light reading\"​,\n​ \t ​\"books\"​: [{\n​ \t ​\"id\"​: ​\"pg132\"​,\n​ \t ​\"title\"​: ​\"The Art of War\"​\n​ \t },{\n​ \t ​\"id\"​: ​\"pg2680\"​,\n​ \t ​\"title\"​: ​\"Meditations\"​,\n​ \t },{\n​ \t ​\"id\"​: ​\"pg6456\"​,\n​ \t ​\"title\"​: ​\"Public Opinion\"​\n​ \t }]\n​ \t}\n\n\n\n The fields in name do not have to be unique.\n The app will be called Better Book Bundle Builder (or B4 for short)\n To the B4 application, the books index is read-only (we will not add, delete, or overwrite any documents in it).\n The b4 index will store user data, including the book bundles that users make.\n\n\nTo create the b4 index,\n\n make sure Elasticsearch is running,\n then open a terminal to the esclu directory\n Use esclu to create the b4 index:\n\n\n1\n2\n3\n4\n5\n6\n7\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu create-index -i b4\n{\"acknowledged\":true,\"shards_acknowledged\":true,\"index\":\"b4\"}\n[~/local/src/CA/sol-nodejs-the-right-way/commanding-databases-chapter-6/esclu(master)]$ ./esclu li\nhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.size\nyellow open b4 Wt45klL2TA-p-VvYRWegoA 5 1 0 0 1.1kb 1.1kb\nyellow open accounts 9TNc0k0LQ1e4y97yFX8_vg 5 1 2 0 10.4kb 10.4kb\nyellow open books wP3DgQPZQZq0qBtH_dd0LA 5 1 58159 3 23.2mb 23.2mb\n\n\nOur REST service is going to use ES as a service. This is the way it will work:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n+-------------------+ +------------------+ +------------------+\n| | | | | |\n| | | | | |\n| | request | OUR | request | |\n| CLIENT | +--------------> | b4 | +--------------> | ELASTICSEARCH |\n| | | REST | | ENGINE |\n| | <---------------+ | web service | <---------------+ | |\n| | response | | response | |\n| | | | | |\n+-------------------+ +------------------+ +------------------+\n\n\nFor example if the client request for info about a book, the b4 REST web service will\nprepare the apropriate request for Elasticsearch, get the answer from ES and after some\nfiltering pass it back to the client\n\nHow nconf manages configuration settings\n\nThe nconf module manages configuration settings through a customizable hierarchy of\n\n\n config files,\n environment variables, and\n command-line arguments.\n\n\nThe order in which you load a source of configuration determines its precedence.\n\nSee the repo learning-nconf\nfor a simple example of use.\n\nSee the tutorial Using nconf to configure a Node.js application\n\nThe order in which you load a source of configuration determines its precedence. Earlier values stick, meaning that later values will not overwrite them.\n\nCode of hello-nconf.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\nvar fs = require('fs'),\n nconf = require('nconf');\n\n// The order in which you attach the configuration sources determines their priority in the hierarchy.\n// Setup nconf to use (in-order):\n// 1. Command-line arguments\n// 2. Environment variables\n// 3. A file located at 'path/to/config.json'\n//\nnconf.argv() // Loads process.argv using yargs. If options is supplied it is passed along to yargs.\n .env('__') // Loads process.env into the hierarchy\n .file({ file: './config.json' });\n\n// See \"node hello-nconf.js --conf='./config-2.json'\"\nnconf.get('conf') && nconf.file(nconf.get('conf'));\n\n//\n// Set a few variables on `nconf`.\n//\nnconf.set('database:host', '127.0.0.1');\nnconf.set('database:port', 4000);\n\nconsole.log('foo: ' + nconf.get('foo'));\nconsole.log('NODE_ENV: ' + nconf.get('NODE_ENV'));\n\n//\n// Get the entire database object from nconf. This will output\n// { host: '127.0.0.1', port: 5984 }\n//\nconsole.log('database: ' + JSON.stringify(nconf.get('database')));\n\n// It is important to note that setting keys in the File engine will not be persisted\n// to disk until a call to .save() is made\n// Save the configuration object to disk\n//\nnconf.save(function (err) {\n fs.readFile('./config.json', function (err, data) {\n console.dir(JSON.parse(data.toString()))\n });\n});\n\n\n\nThe double underscore string passed to env means that two underscores should be used to denote object hierarchy when reading from environment variables. This is because many shell programs do not allow colon characters in variable names.\n\n1\n2\n3\n nconf.argv() // Loads process.argv using yargs. If options is supplied it is passed along to yargs.\n .env('__') // Loads process.env into the hierarchy\n .file({ file: './config.json' });\n\n\nEjecución:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n[~/local/src/javascript/learning/learning-nconf(master)]$ cat config.json\n{\n \"foo\": \"chuchu\",\n \"NODE_ENV\": \"test\",\n \"database\": {\n \"host\": \"titi.tutu.tata.es\",\n \"port\": 1234\n }\n}\n[~/local/src/javascript/learning/learning-nconf(master)]$ node hello-nconf.js\nfoo: chuchu\nNODE_ENV: test\ndatabase: {\"host\":\"127.0.0.1\",\"port\":4000}\n{ foo: 'chuchu',\n NODE_ENV: 'test',\n database: { host: '127.0.0.1', port: 4000 } }\n\n\nAnother execution:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n[~/local/src/javascript/learning/learning-nconf(master)]$ cat config.json\n{\n \"foo\": \"chuchu\",\n \"NODE_ENV\": \"test\",\n \"database\": {\n \"host\": \"127.0.0.1\",\n \"port\": 4000\n }\n}[~/local/src/javascript/learning/learning-nconf(master)]$ database__host=chuchu.deioc.ull.edu.es node hello-nconf.js --foo bar\nfoo: bar\nNODE_ENV: test\ndatabase: {\"host\":\"chuchu.deioc.ull.edu.es\",\"port\":4000}\n{ foo: 'chuchu',\n NODE_ENV: 'test',\n database: { host: '127.0.0.1', port: 4000 } }\n\n\nAn yet another execution using the --conf argument in the command line to change the config file:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n[~/local/src/javascript/learning/learning-nconf(master)]$ cat config.json\n{\n \"foo\": \"chuchu\",\n \"NODE_ENV\": \"test\",\n \"database\": {\n \"host\": \"127.0.0.1\",\n \"port\": 4000\n }\n}[~/local/src/javascript/learning/learning-nconf(master)]$ cat config-2.json\n{\n \"foo\": \"zas!\",\n \"NODE_ENV\": \"testing\",\n \"database\": {\n \"host\": \"pito.pito.gorgorito\",\n \"port\": 1234\n }\n}\n[~/local/src/javascript/learning/learning-nconf(master)]$ node hello-nconf.js --conf='./config-2.json'\nfoo: zas!\nNODE_ENV: testing\ndatabase: {\"host\":\"127.0.0.1\",\"port\":4000}\n{ foo: 'chuchu',\n NODE_ENV: 'test',\n database: { host: '127.0.0.1', port: 4000 } }\n\n\nSee the tutorial Using nconf to configure a Node.js application\n\nKeeping Services Running with nodemon\n\nnodemon runs a Node.js program and then automatically restarts it whenever the source code changes or if the process terminates.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7(master)]$ npm i nodemon\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7(master)]$ sed -ne '/dep/,/}/p' ../package.json\n \"dependencies\": {\n \"chai\": \"^4.2.0\",\n \"cheerio\": \"^1.0.0-rc.2\",\n \"express\": \"^4.16.4\",\n \"morgan\": \"^1.9.1\",\n \"nconf\": \"^0.10.0\",\n \"node-dir\": \"^0.1.17\",\n \"nodemon\": \"^1.18.7\",\n \"zeromq\": \"^5.0.0\",\n \"zerorpc\": \"^0.9.8\"\n }\n\n\nSeparating Server Code into Modules\n\nTo start, create a directory called b4 to house the B4 project. to optimize storage we use the package.json at the root project level:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services(master)]$ mkdir b4\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services(master)]$ cd b4\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm i nconf\n+ nconf@0.10.0\nadded 13 packages from 17 contributors and audited 511 packages in 4.154s\nfound 0 vulnerabilities\n\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ sed -ne '/dep/,/}/p' ~/sol-nodejs-the-right-way/package.json\n \"dependencies\": {\n \"chai\": \"^4.2.0\",\n \"cheerio\": \"^1.0.0-rc.2\",\n \"express\": \"^4.16.4\",\n \"morgan\": \"^1.9.1\",\n \"nconf\": \"^0.10.0\",\n \"node-dir\": \"^0.1.17\",\n \"zeromq\": \"^5.0.0\",\n \"zerorpc\": \"^0.9.8\"\n }\n\n\nThis is our configuration file:\n\nContents of web-services/b4/config.json\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n{\n \"port\": 60702,\n \"es\": {\n \"host\": \"localhost\",\n \"port\": 9200,\n \"books_index\": \"books\",\n \"bundles_index\": \"b4\"\n }\n}\n\n\nContents of web-services/b4/server.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n'use strict';\n\nconst express = require('express');\nconst morgan = require('morgan');\nconst nconf = require('nconf');\n // b4 web-services chapter-7\nconst pkg = require('../../../package.json');\n\nnconf.argv().env('__');\nnconf.defaults({conf: `${__dirname}/config.json`});\nnconf.file(nconf.get('conf'));\n\nconst app = express();\napp.use(morgan('dev'));\n\napp.get('/api/version', (req, res) => {\n res.status(200).send(pkg.version);\n});\n\nrequire('./lib/search.js')(app, nconf.get('es'));\nrequire('./lib/bundle.js')(app, nconf.get('es'));\napp.listen(nconf.get('port'), () => console.log('Listening on port '+nconf.get('port')));\n\n\nRun the server:\n\n1\n2\n3\n4\n5\n6\n7\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm run b4-server\n\n> nodejs-8-the-right-way@1.0.0 b4-server /Users/casiano/local/src/CA/sol-nodejs-the-right-way\n> node developing-restful-web-services-chapter-7/web-services/b4/server.js\n\nListening on port 60702\nGET /api/version 200 3.857 ms - 5\n\n\nRun a client:\n1\n2\n[~/local/src/CA/sol-nodejs-the-right-way(master)]$ curl -s localhost:60702/api/version\n1.0.0\n\nor use gulp:\n\n1\n2\n3\n4\n5\n6\n7\n8\ngulp.task(\"c7-b4-version\", shell.task(\n `curl -s localhost:60702/api/version`\n));\n\n[~/local/src/CA/sol-nodejs-the-right-way(master)]$ gulp c7-b4-version\n[10:20:46] Using gulpfile ~/local/src/CA/sol-nodejs-the-right-way/gulpfile.js\n[10:20:46] Starting 'c7-b4-version'...\n1.0.0[10:20:46] Finished 'c7-b4-version' after 63 ms\n\n\nAdding Search APIs\n\nFirst we’ll add APIs for searching the books index, and then we’ll add APIs for creating and manipulating book bundles.\n\nAdd empty files search.js and bundle.jsinside the lib folder:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/.../web-services/b4(master)]$ tree\n.\n├── config.json\n├── esclu -> ../../../commanding-databases-chapter-6/esclu/esclu\n├── lib\n│   ├── bundle.js\n│   └── search.js\n├── package-lock.json\n└── server.js\n\n1 directory, 6 files\n\n\nNext, open visual code and enter the following skeleton code for the search APIs.\n\nweb-services/b4/lib/search.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n/**\n * Provides API endpoints for searching the books index.\n */\n'use strict';\nconst request = require('request');\nconst rp = require('request-promise');\n\nmodule.exports = (app, es) => {\n const url = `http://${es.host}:${es.port}/${es.books_index}/book/_search`;\n}; \n\n\nSave this file as lib/search.js.\n\n\n The app parameter will be the Express application object, and\n es will contain the configuration parameters relevant to Elasticsearch, as provided through nconf\n\n\nThe code in the server file web-services/b4/server.js:\n\n1\nrequire('./lib/search.js')(app, nconf.get('es'));\n\n\nloads lib/search.js and immediately invokes the imported function by passing the app object and the Elastic- search configuration.\n\nUsing Requests with Express\n\nLet us start by giving support to requests as this one:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[../web-services/b4(master)]$ curl -s localhost:60702/api/search/books/authors/Shakespeare | jq .[].title\n\"Venus and Adonis\"\n\"The Second Part of King Henry the Sixth\"\n\"King Richard the Second\"\n\"The Tragedy of Romeo and Juliet\"\n\"A Midsummer Night's Dream\"\n\"Much Ado about Nothing\"\n\"The Tragedy of Julius Caesar\"\n\"As You Like It\"\n\"The Tragedy of Othello, Moor of Venice\"\n\"The Tragedy of Macbeth\"\n\n\nTo achieve it:\n\n\n We construct a request body — an object that will be serialized as JSON and sent to Elasticsearch.\n In the second part, we’ll fire off the request to Elasticsearch, handle the eventual response, and forward the results to the upstream requester that hit the API:\n\n\nweb-services/b4/lib/search.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\napp.get('/api/search/books/:field/:query', (req, res) => {\n const esReqBody = {\n size: 10, // limits the number of documents that will be sent back\n query: { // describes what kind of objects we want to find\n match: {\n [req.params.field]: req.params.query\n }\n }\n };\n ...\n\n\n\n The Elasticsearch request body that we’re constructing conforms to Elastic-search’s Request Body Search API. It includes:\n \n a size parameter that limits the number of documents that will be sent back, and\n a query object describing what kinds of documents we want to find.\n \n \n When a JavaScript object literal key is surrounded with brackets, like [req.params.field] is here, this is called a computed property name\n The expression inside the brackets is evaluated at runtime, and the result is used as the key.\n In this case, since the expression in brackets is req.params.field, the key used in the match object will be whatever the :field param of the incoming request contained.\n See this code:\n 1\n2\n3\n4\n5\n6\n7\n8\n$ node\n> a = \"hello\"\n'hello'\n> b = 4\n4\n> x = {[a]: b}\n{ hello: 4 }\n>\n \n \n\n\nWith the request body ready to go, add this code underneath to issue the request to Elasticsearch and handle the response:\n\nweb-services/b4/lib/search.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\napp.get('/api/search/books/:field/:query', (req, res) => {\n ...\n const options = {url, json: true, body: esReqBody };\n\n request.get(options, (err, esRes, esResBody) => {\n if (err) {\n res.status(502).json({\n error: 'bad_gateway',\n reason: err.code\n });\n }\n if (esRes.statusCode !== 200) {\n res.status(esRes.statusCode).json(esResBody);\n return;\n }\n res.status(200).json(esResBody.hits.hits.map(({_source}) => _source));\n });\n });\n}\n\n\n\n In the first error-handling block, we deal with the case where the connection couldn’t be made at all.\n \n If the err object is not null, this means that the connection to Elasticsearch failed before a response could be retrieved.\n Typically this would be because the Elasticsearch cluster is unreachable — maybe it’s down, or the hostname has been misconfigured.\n The correct HTTP code to send back to the caller is 502 Bad Gateway.\n \n \n In the second error-handling block, we’ve received a response from Elastic- search, but it came with some HTTP status code other than 200 OK\n \n This could be for any of a variety of reasons, such as a 404 Not Found if, say, the books index has not been created\n Or during development, while you’re experimenting to get the right request body for Elasticsearch, you may receive a 400 Bad Request. In any of these cases, we just pass the response more or less straight through to the caller with the same status code and response body.\n \n \n Finally, if there were no errors, we extract just the _source objects (the underlying documents) from the Elasticsearch response, and report these to the caller as JSON.\n \n The resBody.hits.hits.map(({_source}) => _source) this is how Elasticsearch response is structured. See the response of ES to the Kibana client for the query of documents matching as author Twain:\n \n \n \n\n\nweb-services/b4/lib/search.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n/**\n * Provides API endpoints for searching the book index\n*/\n'use strict';\nconst request = require('request');\nconst rp = require('request-promise');\n\nmodule.exports = (app, es) => {\n const url = `http://${es.host}:${es.port}/${es.books_index}/book/_search`;\n /**\n * Search for books matching a particular field value\n * Example: /api/search/books/authors/Twain\n */\n app.get('/api/search/books/:field/:query', (req, res) => {\n const esReqBody = {\n size: 10, // limits the number of documents that will be sent back\n query: { // describes what kind of objects we want to find\n match: {\n [req.params.field]: req.params.query\n }\n }\n };\n const options = {url, json: true, body: esReqBody };\n\n request.get(options, (err, esRes, esResBody) => {\n if (err) {\n res.status(502).json({\n error: 'bad_gateway',\n reason: err.code\n });\n }\n if (esRes.statusCode !== 200) {\n res.status(esRes.statusCode).json(esResBody);\n return;\n }\n res.status(200).json(esResBody.hits.hits.map(({_source}) => _source));\n });\n });\n\n /**\n * Collect suggested terms for a given field based on a given query\n * Example: /api/suggest/authors/lipman\n */\n app.get('/api/suggest/:field/:query', (req, res) => {\n const esReqBody = {\n size: 0, // We don’t want any matching documents returned, just the suggestions\n suggest: {\n suggestions: { // Elasticsearch’s Suggest API allows you to request multiple\n // kinds of suggestions in the same request,\n // but here we’re submitting only one. \n text: req.params.query,\n term: {\n field: req.params.field,\n suggest_mode: 'always'\n }\n }\n }\n };\n const options = { url, json: true, body: esReqBody };\n const promise = rp(options);\n /*\n // Version from section: \"Using a Promise with request\", pages 162-166\n const promise = new Promise((resolve, reject) => {\n request.get(options, (err, esRes, esResBody) => {\n if (err) {\n reject({error: err});\n return;\n }\n if (esRes.statusCode !== 200) {\n reject({error: esResBody});\n return;\n }\n resolve(esResBody);\n });\n });\n */\n promise\n .then(esResBody =>\n res.status(200).json(esResBody.suggest.suggestions)\n )\n .catch(\n ({error}) => res.status(error.status || 502).json(error)\n );\n });\n};\n\n\n\n Elasticsearch Match Query\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\napp.get('/api/search/books/:field/:query', (req, res) => {\nconst esReqBody = {\n size: 10, // limits the number of documents that will be sent back\n query: { // describes what kind of objects we want to find\n match: {\n [req.params.field]: req.params.query\n }\n }\n};\nconst options = {url, json: true, body: esReqBody };\n\nrequest.get(options, (err, esRes, esResBody) => {\n if (err) {\n res.status(502).json({\n error: 'bad_gateway',\n reason: err.code\n });\n }\n if (esRes.statusCode !== 200) {\n res.status(esRes.statusCode).json(esResBody);\n return;\n }\n res.status(200).json(esResBody.hits.hits.map(({_source}) => _source));\n});\n});\n \n \n Status 502: Puerta de enlace no válida\n Elasticsearch errors\n\n\nweb-services/b4/server.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n'use strict';\n\nconst express = require('express');\nconst morgan = require('morgan');\nconst nconf = require('nconf');\n // b4 web-services chapter-7\nconst pkg = require('../../../package.json');\n\nnconf.argv().env('__');\nnconf.defaults({conf: `${__dirname}/config.json`});\nnconf.file(nconf.get('conf'));\n\nconst app = express();\napp.use(morgan('dev'));\n\napp.get('/api/version', (req, res) => {\n res.status(200).send(pkg.version);\n});\n\nrequire('./lib/search.js')(app, nconf.get('es'));\nrequire('./lib/bundle.js')(app, nconf.get('es'));\napp.listen(nconf.get('port'), () => console.log('Listening on port '+nconf.get('port')));\n\n\nweb-services/b4/config.json\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n{\n \"port\": 60702,\n \"es\": {\n \"host\": \"localhost\",\n \"port\": 9200,\n \"books_index\": \"books\",\n \"bundles_index\": \"b4\"\n }\n}\n\n\nExecutions:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ grep b4-server ../../../package.json\n \"test-now\": \"npm run b4-server\",\n \"b4-server\": \"node developing-restful-web-services-chapter-7/web-services/b4/server.js\",\n \"b4-server-nodemon\": \"nodemon developing-restful-web-services-chapter-7/web-services/b4/server.js\",\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm run b4-server\n\n> nodejs-8-the-right-way@1.0.0 b4-server /Users/casiano/local/src/CA/sol-nodejs-the-right-way\n> node developing-restful-web-services-chapter-7/web-services/b4/server.js\n\nListening on port 60702\n\n\n1\n2\n3\n4\n5\n6\n7\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ sed -ne '/c7-b4-get/,/));/p' ../../../gulpfile.js\ngulp.task(\"c7-b4-get-shakespeare\", shell.task(\n `curl -s localhost:60702/api/search/books/authors/Shakespeare | jq .[].title`\n));\ngulp.task(\"c7-b4-get-sawyer\", shell.task(\n `curl -s localhost:60702/api/search/books/title/sawyer | jq .[].title`\n));\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/search/books/authors/Shakespeare | jq .[].title\n\"Venus and Adonis\"\n\"The Second Part of King Henry the Sixth\"\n\"King Richard the Second\"\n\"The Tragedy of Romeo and Juliet\"\n\"A Midsummer Night's Dream\"\n\"Much Ado about Nothing\"\n\"The Tragedy of Julius Caesar\"\n\"As You Like It\"\n\"The Tragedy of Othello, Moor of Venice\"\n\"The Tragedy of Macbeth\"\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/search/books/title/sawyer | jq .[].title\n\"Tom Sawyer Abroad\"\n\"Tom Sawyer, Detective\"\n\"Tom Sawyer Abroad\"\n\"Tom Sawyer, Detective\"\n\"The Adventures of Tom Sawyer\"\n\"Tom Sawyer: Koulupojan historia\"\n\"Tom Sawyer ilmailija\\nHuckleberry Finn'in jatko\"\n\"The Adventures of Tom Sawyer, Part 3.\"\n\"De Lotgevallen van Tom Sawyer\"\n\"The Adventures of Tom Sawyer\"\n\n\nSimplifying Code Flows with Promises\n\nFulfilling Promises\n\n\n Apuntes del profesor en Async JS\n Node.js Events: Error Events\n \n When an error occurs within an EventEmitter instance, the typical action is for an error event to be emitted. These are treated as special cases within Node.js.\n If an EventEmitter does not have at least one listener registered for the error event, and an error event is emitted, the error is thrown, a stack trace is printed, and the Node.js process exits.\n \n \n The Promise Class at developer.mozilla.org\n\n\nUsing a Promise with Request\n\n\n Code of the Promise object for making the /api/suggest request\n \n Final code for the route /api/suggest/:field/:query in developing-restful-web-services-chapter-7/web-services/b4/lib/search.js\n \n \n Elasticsearch suggest\n \n The Elasticsearch term suggester suggests terms based on edit distance. The provided suggest text is analyzed before terms are suggested. The suggested terms are provided per analyzed suggest text token. The term suggester doesn’t take the query into account that is part of request.\n Elasticsearch Suggesters: The suggest feature suggests similar looking terms based on a provided text by using a suggester\n \n \n\n\nExample of request to the Elasticsearch suggest API with curl\n\nCode in gulpfile for task c7-es-suggest:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\nlet trimnl = (s) => s.replace(/\\s+/g,\"\");\nlet request = trimnl(`\n {\n \t\"size\": 0,\n \t\"suggest\": {\n \t\t\"suggestions\": {\n \t\t\t\"text\": \"lipman\",\n \t\t\t\"term\": {\n \t\t\t\t\"field\": \"authors\",\n \t\t\t\t\"suggest_mode\": \"always\"\n \t\t\t}\n \t\t}\n \t}\n }\n`);\n\ngulp.task('c7-es-suggest', shell.task(\n `curl -s -H 'Content-Type: application/json' -d '${request}' -X GET localhost:9200/books/book/_search | jq .suggest.suggestions`\n));\n\n\nRespuesta del servidor es:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ gulp c7-es-suggest\n[14:48:59] Working directory changed to ~/local/src/CA/sol-nodejs-the-right-way\n[14:49:00] Using gulpfile ~/local/src/CA/sol-nodejs-the-right-way/gulpfile.js\n[14:49:00] Starting 'c7-es-suggest'...\n[\n {\n \"text\": \"lipman\",\n \"offset\": 0,\n \"length\": 6,\n \"options\": [\n {\n \"text\": \"lilian\",\n \"score\": 0.6666666,\n \"freq\": 30\n },\n {\n \"text\": \"lanman\",\n \"score\": 0.6666666,\n \"freq\": 7\n },\n {\n \"text\": \"lippmann\",\n \"score\": 0.6666666,\n \"freq\": 6\n },\n {\n \"text\": \"lampman\",\n \"score\": 0.6666666,\n \"freq\": 3\n },\n {\n \"text\": \"lehman\",\n \"score\": 0.6666666,\n \"freq\": 3\n }\n ]\n }\n]\n[14:49:00] Finished 'c7-es-suggest' after 66 ms\n\n\nExample of request to the Elasticsearch suggest API with postman\n\n\n\nCode for the Route ‘/api/suggest/:field/:query’\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n/**\n * Collect suggested terms for a given field based on a given query\n * Example: /api/suggest/authors/lipman\n*/\napp.get('/api/suggest/:field/:query', (req, res) => {\n const esReqBody = {\n size: 0,\n suggest: {\n suggestions: {\n text: req.params.query,\n term: {\n field: req.params.field,\n suggest_mode: 'always'\n }\n }\n }\n };\n const options = { url, json: true, body: esReqBody };\n const promise = new Promise((resolve, reject) => {\n request.get(options, (err, esRes, esResBody) => {\n if (err) {\n reject({error: err});\n return;\n }\n if (esRes.statusCode !== 200) {\n reject({error: esResBody});\n return;\n }\n resolve(esResBody);\n });\n });\n promise\n .then(esResBody =>\n res.status(200).json(esResBody.suggest.suggestions)\n )\n .catch(\n ({error}) => res.status(error.status || 502).json(error)\n );\n});\n\n\nWhen making a request with curl we get:\n\n1\n2\n3\n4\n5\n6\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/suggest/authors/lipman | jq .[].options[].text\n\"lilian\"\n\"lanman\"\n\"lippmann\"\n\"lampman\"\n\"lehman\"\n\n\nReplacing request with request-promise\n\n\n request-promise GitHub\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ cat -n lib/search.js\n .........\n 5\tconst request = require('request');\n 6\tconst rp = require('request-promise');\n 7\n 8\tmodule.exports = (app, es) => {\n 9\t const url = `http://${es.host}:${es.port}/${es.books_index}/book/_search`;\n 10\t /**\n 11\t * Search for books matching a particular field value\n 12\t * Example: /api/search/books/authors/Twain\n 13\t */\n 14\t app.get('/api/search/books/:field/:query', (req, res) => {\n ..........\n 38\t });\n 39\n 40\t /**\n 41\t * Collect suggested terms for a given field based on a given query\n 42\t * Example: /api/suggest/authors/lipman\n 43\t */\n 44\t app.get('/api/suggest/:field/:query', (req, res) => {\n 45\t const esReqBody = {\n 46\t size: 0,\n 47\t suggest: {\n 48\t suggestions: {\n 49\t text: req.params.query,\n 50\t term: {\n 51\t field: req.params.field,\n 52\t suggest_mode: 'always'\n 53\t }\n 54\t }\n 55\t }\n 56\t };\n 57\t const options = { url, json: true, body: esReqBody };\n 58\t const promise = rp(options);\n 59\t /*\n 60\t // Version from section: \"Using a Promise with request\", pages 162-166\n 61\t const promise = new Promise((resolve, reject) => {\n 62\t request.get(options, (err, esRes, esResBody) => {\n 63\t if (err) {\n 64\t reject({error: err});\n 65\t return;\n 66\t }\n 67\t if (esRes.statusCode !== 200) {\n 68\t reject({error: esResBody});\n 69\t return;\n 70\t }\n 71\t resolve(esResBody);\n 72\t });\n 73\t });\n 74\t */\n 75\t promise\n 76\t .then(esResBody =>\n 77\t res.status(200).json(esResBody.suggest.suggestions)\n 78\t )\n 79\t .catch(\n 80\t ({error}) => res.status(error.status || 502).json(error)\n 81\t );\n 82\t });\n 83\t};\n\n\nManipulating Documents RESTfully\n\n\n In this part, we’ll be creating APIs for manipulating book bundles.\n A book bundle has a name and maintains a collection of related books.\n\n\nHere’s an example of a book bundle:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n​ {\n​ ​\"name\"​: ​\"light reading\"​,\n​ ​\"books\"​: [\n {\n ​ ​\"id\"​: ​\"pg132\"​,\n ​ ​\"title\"​: ​\"The Art of War\"​\n ​ },\n {\n ​\"id\"​: ​\"pg2680\"​,\n ​ ​\"title\"​: ​\"Meditations\"​,\n ​ },\n {\n ​ ​\"id\"​: ​\"pg6456\"​,\n ​ ​\"title\"​: ​\"Public Opinion\"​\n ​ }\n ]\n​ }\n\nCreating these APIs will be programmatically more intensive than creating the search APIs because\nthey require more back-and-forth between your Node.js service and the underlying datastore.\n\nFor example, consider an API to update the name of a bundle. Our Node.js code will need to do the following:\n\n\n Retrieve the bundle from Elasticsearch.\n Update the name field on the object in memory.\n Put the updated object back into Elasticsearch.\n\n\nIn addition to handling these asynchronously and in order, you’ll have to deal with various failure modes.\n\n What if Elasticsearch is down?\n What if the bundle doesn’t exist?\n What if the bundle changed between the time Node.js downloaded it and the time it reuploaded it?\n What if Elasticsearch fails to update for some other reason?\n\n\nThere are a lot of ways a sequence of asynchronous events could fail midstride, and it’s important to think about what kind of response you should provide to users of your API:\n\n What HTTP status code is closest to explaining the situation?\n What kind of error message should you present?\n\n\nFichero lib/bundle.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n/**\n * Provide API endpoints for working with book bundles_index\n */\n'use strict';\n\nconst rp = require('request-promise');\nmodule.exports = (app, es) => {\n const url = `http://${es.host}:${es.port}/${es.bundles_index}/bundle`;\n\n /**\n * Create a new bundle with the specified names\n * Example: curl -X POST http://<host>:<port>/api/bundle?name=<name>\n */\n app.post('/api/bundle', (req, res) => {\n const bundle = {\n name: req.query.name || '',\n books: []\n\n };\n\n rp.post({url, body: bundle, json: true})\n .then(esResBody => res.status(201).json(esResBody))\n .catch(({error}) => res.status(error.status || 502).json(error));\n });\n};\n\n\nAñadimos la dependencia de lib/bundle.js en server.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ git diff server.js\ndiff --git a/developing-restful-web-services-chapter-7/web-services/b4/server.js b/developing-restful-web-services-chapter-7/web-services/b4/server.js\nindex 82ca3f1..c17bc87 100644\n--- a/developing-restful-web-services-chapter-7/web-services/b4/server.js\n+++ b/developing-restful-web-services-chapter-7/web-services/b4/server.js\n@@ -18,4 +18,5 @@ app.get('/api/version', (req, res) => {\n });\n\n require('./lib/search.js')(app, nconf.get('es'));\n+require('./lib/bundle.js')(app, nconf.get('es'));\n app.listen(nconf.get('port'), () => console.log('Listening on port '+nconf.get('port')));\n\n\nCreate a bundle using curl:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s -X POST localhost:60702/api/bundle/?name=light%20reading | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 1,\n \"result\": \"created\",\n \"_shards\": {\n \"total\": 2,\n \"successful\": 1,\n \"failed\": 0\n },\n \"_seq_no\": 0,\n \"_primary_term\": 1\n}\n\n\n\n Note the _id field.\n This is automatically generated by Elasticsearch for the new bundle document that was just created.\n Copy this string, as you’ll need it for the remaining examples in this chapter.\n It may help to put it in an environment variable for easy retrieval.\n\n\n1\n2\n3\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ BUNDLE_ID=zLkMWmcB1uX03maR3vEQ\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ echo $BUNDLE_ID\nzLkMWmcB1uX03maR3vEQ\n\n\nUsing curl, we can hit Elasticsearch directly to check on this bundle document.\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:9200/b4/bundle/$BUNDLE_ID | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 1,\n \"found\": true,\n \"_source\": {\n \"name\": \"light reading\",\n \"books\": []\n }\n}\n\n\nEmulating Synchronous Style with async and await\n\nWe’ll add an API to perform exactly lookups for the bundles without having to go to Elasticsearch directly.\n\n\n \n Capítulo Async JS en los apuntes\n \n How does async/await work with TypeScript and ECMAScript 2017? - Firecasts YouTube (menos de 8 minutos)\n async await explicado en menos de 15 minutos (y muy bien) Vídeo en YouTube por Ricardo Macario\n async-await explicado en menos de cuatro minutos Vídeo “Javascript asíncrono con Async Await” de Carlos Villuendas\n\n\nAn async function can be intentionally suspended midexecution to wait on the resolution of a Promise\n\nProviding an Async Handler Function to Express\n\nEn web-services/b4/bundle.js añadimos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\napp.get('/api/bundle/:id', async (req, res) => {\n const options = {\n url: `${url}/${req.params.id}`,\n json: true\n };\n\n try {\n const esResBody = await rp(options);\n res.status(200).json(esResBody);\n } catch (esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n});\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ echo $BUNDLE_ID\nzLkMWmcB1uX03maR3vEQ\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/bundle/$BUNDLE_ID | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 1,\n \"found\": true,\n \"_source\": {\n \"name\": \"light reading\",\n \"books\": []\n }\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/bundle/no-such-bundle | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"no-such-bundle\",\n \"found\": false\n}\n\n\n1\n2\n3\n4\n5\n[~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm run b4-server\nListening on port 60702\nPOST /api/bundle/?name=light%20reading 201 107.544 ms - 171\nGET /api/bundle/zLkMWmcB1uX03maR3vEQ 200 23.765 ms - 133\nGET /api/bundle/no-such-bundle 404 39.392 ms - 69\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n// BAD IMPLEMENTATION! async Express handler without a try/catch block\napp.get('/api/err-bundle/:id', async (req, res) => {\n const options = {\n url: `${url}/${req.params.id}`,\n json: true\n };\n\n const esResBody = await rp(options);\n res.status(200).json(esResBody);\n});\n\n\n1\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/err-bundle/no-such-bundle\n\nThe curl seems to never terminate. It hangs after sending the request waiting for a response that will never arrive.\n\nNotice the warning messages in the server terminal:\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n~/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm run b4-server\n\n> nodejs-8-the-right-way@1.0.0 b4-server /Users/casiano/local/src/CA/sol-nodejs-the-right-way\n> node developing-restful-web-services-chapter-7/web-services/b4/server.js\n\nListening on port 60702\n(node:73832) UnhandledPromiseRejectionWarning: StatusCodeError: 404 - {\"_index\":\"b4\",\"_type\":\"bundle\",\"_id\":\"no-such-bundle\",\"found\":false}\n at new StatusCodeError\n .........\n(node:73832) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)\n(node:73832) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.\nGET /api/err-bundle/no-such-bundle - - ms - -\n\n\nIt turns out that indeed the await clause triggers the rejection object to be thrown, but since it’s not caught inside the async function, it bubbles up to a Promise returned by the async function itself.\n\nThat Promise is rejected, but since its rejection wasn’t handled, we get warnings.\n\nSetting the Bundle Name with PUT\n\nFile web-services/b4/lib/bundle.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n/**\n * Set the :id bundle's name to the provide :name\n * curl -X PUT http://<host>:<port>/api/bundle/<id>/name/<name>\n */\n app.put('/api/bundle/:id/name/:name', async (req, res) => {\n const bundleUrl = `${url}/${req.params.id}`;\n\n try {\n const response = await rp.get({url: bundleUrl, json: true});\n const bundle = response._source;\n bundle.name = req.params.name;\n const esResBody = await rp.put({url: bundleUrl, body: bundle, json: true});\n res.status(200).json(esResBody);\n } catch(esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n });\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s -X PUT localhost:60702/api/bundle/$BUNDLE_ID/name/foo | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 2,\n \"result\": \"updated\",\n \"_shards\": {\n \"total\": 2,\n \"successful\": 1,\n \"failed\": 0\n },\n \"_seq_no\": 1,\n \"_primary_term\": 1\n}\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ curl -s localhost:60702/api/bundle/$BUNDLE_ID | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 2,\n \"found\": true,\n \"_source\": {\n \"name\": \"foo\",\n \"books\": []\n }\n}\n\nPutting a Book into a Bundle\n\nIn this section, we’ll add an API endpoint for putting a book into a bundle.\n\n\n Code of web-services/b4/lib/bundle.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n /**\n * Put a book into a bundle by its id\n * curl -X PUT http://<host>:<port>/api/bundle/<id>/book/<pgid>\n */\n app.put('/api/bundle/:id/book/:pgid', async (req, res) => {\n debugger;\n const bundleUrl = `${url}/${req.params.id}`;\n const bookUrl = `http://${es.host}:${es.port}/${es.books_index}/book/${req.params.pgid}`;\n try {\n // Request the bundle and book in parallel\n const [bundleRes, bookRes] = await Promise.all([\n rp.get({url: bundleUrl, json: true}),\n rp.get({url: bookUrl, json: true})\n ]);\n // Extract bundle and book information from responses\n const { _source: bundle, _version: version } = bundleRes;\n const { _source: book } = bookRes;\n\n const idx = bundle.books.findIndex(book => book.id === req.params.pgid);\n if (idx === -1) {\n bundle.books.push({\n id: req.params.pgid,\n title: book.title\n });\n }\n\n // Save the updated bundle\n const esResBody = await rp.put({\n url: bundleUrl,\n qs: { version }, // qs stands for \"query string\". We pass the version number\n /* When ES receives the request it checks that its internal version number\n for this document matches the qs param. If they don't match it means the document\n changed somehow and ES will send back a 409 conflict HTTP status code causing\n the await to throw an exception */\n body: bundle,\n json: true\n });\n\n res.status(200).json(esResBody);\n\n } catch(esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n });\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n[~/sol-nodejs-the-right-way(master)]$ curl -s -X PUT localhost:60702/api/bundle/$BUNDLE_ID/book/pg132 | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 4,\n \"result\": \"updated\",\n \"_shards\": {\n \"total\": 2,\n \"successful\": 1,\n \"failed\": 0\n },\n \"_seq_no\": 3,\n \"_primary_term\": 2\n}\n[~/sol-nodejs-the-right-way(master)]$ curl -s localhost:60702/api/bundle/$BUNDLE_ID | jq .\n{\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"zLkMWmcB1uX03maR3vEQ\",\n \"_version\": 4,\n \"found\": true,\n \"_source\": {\n \"name\": \"lectura ligera\",\n \"books\": [\n {\n \"id\": \"pg132\",\n \"title\": \"The Art of War\"\n }\n ]\n }\n}\n\n\nWrapping Up\n\nDeleting a Bundle Entirely\n\n\n Add an API to delete a bundle entirely. Fill the gaps:\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n/**\n * Delete a bundle entirely.\n * curl -X DELETE http://<host>:<port>/api/bundle/<id>\n */\n app.delete('/api/bundle/:id', async (req, res) => {\n const bundleUrl = `${url}/${req.params.id}`;\n try {\n ..\n } catch (esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n });\n\n\nRemoving a Book from a Bundle\n\nInside the try block you’ll need to do a few things:\n\n\n Use await with rp to retrieve the bundle object from Elasticsearch.\n Find the index of the book within the bundle.books list.\n Remove the book from the list\n PUT the updated bundle object back into the Elasticsearch index\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n/**\n * Remove a book from a bundle.\n * curl -X DELETE http://<host>:<port>/api/bundle/<id>/book/<pgid>\n */\n app.delete('/api/bundle/:id/book/:pgid', async (req, res) => {\n const bundleUrl = `${url}/${req.params.id}`;\n\n try {\n ...\n } catch (esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n });\n\n\nPeer-dependencies\n\n\n Peer Dependencies\nby Domenic Denicola\n\n\n1\n2\n3\n4\n[~/local/src/CA/sol-nodejs-the-right-way/developing-restful-web-services-chapter-7/web-services/b4(master)]$ npm install request-promise\n+ request-promise@4.2.2\nadded 4 packages from 2 contributors and audited 2821 packages in 7.391s\nfound 0 vulnerabilities\n\n\nGulpfile tasks\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n/********************* CHAPTER 7 *********************/\n\ngulp.task(\"c7-http-server\", shell.task(\n `node developing-restful-web-services-chapter-7/web-services/server.js`\n));\n\ngulp.task(\"c7-http-client\", shell.task(\n `curl localhost:60700`\n));\n\ngulp.task(\"c7-express-server\", shell.task(\n `node developing-restful-web-services-chapter-7/web-services/hello/server.js`\n));\n\ngulp.task(\"c7-express-client-verbose\", shell.task(\n `curl -i localhost:60701/hello/ivan`\n));\n\ngulp.task(\"c7-express-client\", shell.task(\n `curl -s localhost:60701/hello/ivan | jq`\n));\n\n// Server listening in port 60702\ngulp.task(\"c7-b4-server\", shell.task(\n `node developing-restful-web-services-chapter-7/web-services/b4/server.js`\n));\n\ngulp.task(\"c7-b4-server-debug\", shell.task(\n `node --inspect-brk developing-restful-web-services-chapter-7/web-services/b4/server.js`\n));\n\ngulp.task(\"c7-b4-server-nodemon\", shell.task(\n `nodemon developing-restful-web-services-chapter-7/web-services/b4/server.js`\n));\n\ngulp.task(\"c7-get-shakespeare\", shell.task(\n `curl -s localhost:60702/api/search/books/authors/Shakespeare | jq .[].title`\n));\n\ngulp.task(\"c7-get-sawyer\", shell.task(\n `curl -s localhost:60702/api/search/books/title/sawyer | jq .[].title`\n));\n\ngulp.task(\"c7-suggest\", shell.task(\n //`curl -s localhost:60702/api/suggest/authors/twayn | jq '.[].options[].text'`\n `curl -s localhost:60702/api/suggest/authors/twayn | jq '.'`\n));\n\ngulp.task(\"c7-create-b4-index\", shell.task(\n `commanding-databases-chapter-6/esclu/esclu create-index -i b4`\n));\n\n// Communicate directly to es to create the bundle\ngulp.task(\"c7-es-create-a-bundle\", shell.task(\n `curl -H 'Content-Type: application/json' -X POST localhost:9200/b4/bundle -d '{\"name\":\"nutrition\",\"books\":[]}'`\n // CKPgeWcB2Cwi_q-mx5lC\n));\n\ngulp.task(\"c7-esclu-list\", shell.task(` echo \"\n ./esclu li\n ./esclu get _search | jq .\n ./esclu get '_search' | jq '.hits.hits[]._source' | head -n 20\n ./esclu get '_search/?q=authors:Twain' | jq '.' | head -n 30\n ./esclu get '_search?q=authors:Twain&_source=title' | jq '.' | head -n 30\n ./esclu get '_search?q=authors:Twain&_source=title' | jq '.hits.hits[]._source.title'\n ./esclu q authors:Twain AND subjects:children\n ./esclu q | jq '.' | head -n 30\n ./esclu q -f title,authors | jq '.' | head -n 30\n ./esclu q -f title,authors | jq '.hits.hits[]._source' | head -n 30\n ./esclu q authors:Shakespeare AND subjects:Drama -f title | jq '.hits.hits[]._source.title'\n ./esclu get pg132 --index books --type book | jq '.'\n ./esclu get pg132 -i books -t book | jq '._source' > ../data/art_of_war.json\n ./esclu put ../data/art_of_war.json -i books -t book --id pg132 # Warning put\n \"`\n));\n\n// Get the bundle created by the former task\ngulp.task('c7-request-es-bundle-by-id', shell.task(\n `BUNDLE_ID=CKPgeWcB2Cwi_q-mx5lC && curl -s localhost:9200/b4/bundle/$BUNDLE_ID | jq .`\n));\n\ngulp.task('c7-create-a-bundle', shell.task(\n `curl -s -X POST localhost:60702/api/bundle/?name=light%20reading | jq .`\n));\n\ngulp.task('c7-bundle-id', shell.task(\n `BUNDLE_ID=zLkMWmcB1uX03maR3vEQ && echo $BUNDLE_ID`\n));\n\ngulp.task('c7-bundle-another-id', shell.task(\n `BUNDLE_ID=WpBEamcBVH6YJQy3-NQF && echo $BUNDLE_ID`\n));\n\ngulp.task('c7-request-bundle-by-id', shell.task(\n `BUNDLE_ID=zLkMWmcB1uX03maR3vEQ && curl -s localhost:9200/b4/bundle/$BUNDLE_ID | jq .`\n));\n\ngulp.task('c7-change-bundle-name', shell.task(\n `BUNDLE_ID=zLkMWmcB1uX03maR3vEQ && curl -s -X PUT localhost:60702/api/bundle/$BUNDLE_ID/name/lectura%20ligera | jq .`\n));\n\nconst header = '\"Content-Type: application/json\"';\nlet trimnl = (s) => s.replace(/\\s+/g, \"\");\n\n/*\n We are adding now to the index named accounts\n a document of type person\n having the id 1;\n since the index does not exist yet, Elasticsearch will automatically create it.\n*/\nlet request = trimnl(`\n {\n \"size\": 0,\n \"suggest\": {\n \"suggestions\": {\n \"text\": \"twayn\",\n \"term\": {\n \"field\": \"authors\",\n \"suggest_mode\": \"always\"\n }\n }\n }\n }\n`);\n\n/*\nconsole.log(request);\ncurl -X GET \"localhost:9200/twitter/_search\" -H 'Content-Type: application/json' -d'\n{\n \"query\" : {\n \"term\" : { \"user\" : \"kimchy\" }\n }\n}\n'\n*/\n\n\ngulp.task('c7-es-suggest', shell.task(\n `curl -s -H 'Content-Type: application/json' -d '${request}' -X GET localhost:9200/books/book/_search | jq .suggest.suggestions`\n));\n\ngulp.task('c7-change-bundle-name-foo', shell.task(\n `BUNDLE_ID=zLkMWmcB1uX03maR3vEQ && curl -s -X PUT localhost:60702/api/bundle/$BUNDLE_ID/name/foo | jq .`\n));\n\ngulp.task('c7-insert-book-into-bundle', shell.task(\n `BUNDLE_ID=zLkMWmcB1uX03maR3vEQ && curl -s -X PUT localhost:60702/api/bundle/$BUNDLE_ID/book/pg132 | jq .`\n));\n\ngulp.task(\"c7-b4-version\", shell.task(\n `curl -s localhost:60702/api/version`\n));\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n~/sol-nodejs-the-right-way(master)]$ gulp -T | grep c7\n[12:58:56] ├── c7-http-server\n[12:58:56] ├── c7-http-client\n[12:58:56] ├── c7-express-server\n[12:58:56] ├── c7-express-client-verbose\n[12:58:56] ├── c7-express-client\n[12:58:56] ├── c7-b4-server\n[12:58:56] ├── c7-b4-server-debug\n[12:58:56] ├── c7-b4-server-nodemon\n[12:58:56] ├── c7-get-shakespeare\n[12:58:56] ├── c7-get-sawyer\n[12:58:56] ├── c7-suggest-lipman\n[12:58:56] ├── c7-create-b4-index\n[12:58:56] ├── c7-create-a-bundle\n[12:58:56] ├── c7-bundle-id\n[12:58:56] ├── c7-bundle-another-id\n[12:58:56] ├── c7-request-bundle-by-id\n[12:58:56] ├── c7-change-bundle-name\n[12:58:56] ├── c7-change-bundle-name-foo\n[12:58:56] ├── c7-insert-book-into-bundle\n[12:58:56] └── c7-b4-version\n\n\nStarting the Server:\n\n1\n2\n3\ngulp.task(\"c7-express-server\", shell.task(\n `node developing-restful-web-services-chapter-7/web-services/hello/server.js`\n));\n\n\n1\n2\n3\n4\n5\n6\n7\n[~/sol-nodejs-the-right-way(master)]$ gulp c7-express-server\n[12:31:01] Using gulpfile ~/local/src/CA/sol-nodejs-the-right-way/gulpfile.js\n[12:31:01] Starting 'c7-express-server'...\nListening on 60701\nGET / 404 5.228 ms - 139\nGET /hello/ivan 200 6.316 ms - 16\nGET /hello/ivan 200 0.637 ms - 16\n\n\nReferences\n\n\n http://nodejs.org/api/http.html\n http://expressjs.com/\n http://www.sinatrarb.com/\n https://www.npmjs.com/package/nconf\n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-request-body.html \n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-suggesters.html\n Elasticsearch Suggesters: The suggest feature suggests similar looking terms based on a provided text by using a suggester\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n Apuntes del profesor en Async JS\n\n\n", "url": "/clases/2020/01/13/leccion.html" }, { "title": "Clase del Lunes 05/10/2020", "excerpt": "Clase del Lunes 05/10/2020\n\n", "content": "Clase del Lunes 05/10/2020\n\n\n Meet de la clase\n URL de los apuntes\n Adaptación a la Docencia y Evaluación No Presencial\n Presentación de la Asignatura SYTWS\n Prácticas\n \n pb: Práctica pb-gh-campus-expert\n p0: Práctica p01-t1-iaas\n p2: Práctica p2-t1-vscode\n \n \n\n\n", "url": "/clases/2020/10/05/leccion.html" }, { "title": "Clase del Lunes 19/10/2020", "excerpt": "Clase del Lunes 19/10/2020\n\n", "content": "Clase del Lunes 19/10/2020\n\n\n Meet de la clase\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n Prácticas\n \n pb: Práctica pb-gh-campus-expert\n p0: Práctica p01-t1-iaas\n p2: Práctica p2-t1-vscode\n p2: Práctica p2-t1-c3-filesystem\n \n \n The JS Event Loop\n \n Unas Preguntas\n Unas Figuras\n \n \n\n\n", "url": "/clases/2020/10/19/leccion.html" }, { "title": "Clase de Prácticas del Miércoles 21/10/2020", "excerpt": "Clase de Prácticas del Miércoles 21/10/2020 (Presencial)\n\n", "content": "Clase de Prácticas del Miércoles 21/10/2020 (Presencial)\n\nPracticando\n\nNos vemos en la Sala 1.3. Trae tu portátil si es posible.\n\nVeremos en que estado tiene cada uno las tareas asignadas:\n\n\n pb: Práctica pb-gh-campus-expert\n p0: Práctica p01-t1-iaas\n p2: Práctica p2-t1-vscode\n p2: Práctica p2-t1-c3-filesystem\n\n\ne intentaremos avanzar en ellas.\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/10/21/leccion.html" }, { "title": "Clase del Lunes 26/10/2020", "excerpt": "Clase del Lunes 26/10/2020\n\n", "content": "Clase del Lunes 26/10/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nControl Version\n\n\n Meta\n GitHub CLI\n\n\nIntroducción a la Asincronía\n\n\n The JS Event Loop\n \n Unas Preguntas\n \n \n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/10/26/leccion.html" }, { "title": "Clase del Lunes 02/11/2020", "excerpt": "Clase del Lunes 02/11/2020\n\n", "content": "Clase del Lunes 02/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nIntroducción a la Asincronía\n\n\n The JS Event Loop\n \n Unas Preguntas\n Unas Figuras\n The Event Loop en el libro The Modern JavaScript Tutorial\n The section Concurrency model and the event loop at https://developer.mozilla.org/\n Repasando las Preguntas a la luz del Bucle de Eventos\n \n Ejemplo: La Pila\n Orden de Ejecución\n Ejemplo: JS is single threaded\n \n \n \n \n Splitting CPU Hungry Tasks\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/02/leccion.html" }, { "title": "Clase del Lunes 09/11/2020", "excerpt": "Clase del Lunes 09/11/2020\n\n", "content": "Clase del Lunes 09/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nIntroducción a la Asincronía\n\n\n Race Condition\n Splitting CPU Hungry Tasks\n \n Web Workers\n \n The Async module\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/09/leccion.html" }, { "title": "Clase del Miércoles 11/11/2020", "excerpt": "Clase del Miércoles 11/11/2020\n\n", "content": "Clase del Miércoles 11/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nIntroducción a la Asincronía\n\nRepasaremos el estado de las prácticas y haremos algunos ejercicios como:\n\n\n The Async module\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/11/leccion.html" }, { "title": "Clase del Lunes 16/11/2020", "excerpt": "Clase del Lunes 16/11/2020\n\n", "content": "Clase del Lunes 16/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nIntroducción a la Asincronía\n\nUsaremos exhaustivamente en este capítulo el libro https://javascript.info/.\n\nPor si quieren tener el libro en local les facilito unas instrucciones de como hacerlo en este repo:\n\n\n ULL-MII-SYTWS/javascript-info-meta\n\n\nES2015 Modules with WebPack: The Async Module\n\n\n La práctica p8-t2-async-webpack-esmodule\n \n The Async module provides Async as a collection of purely ES2015 modules, in an alternative async-es package on npm.\n\n 1\n $ npm install async-es\n \n\n 1\n2\n import waterfall from 'async-es/waterfall';\n import async from 'async-es';\n \n\n \n Seguiremos el tutorial Webpack: Getting Started\n \n Link to https://unpkg.com/: is a fast, global content delivery network for everything on npm.\n \n \n See a solution here: Using the Async ES2015 module in the Browser with webpack (private branch)\n \n Public branch\n\n 1\n2\n3\n4\n5\n6\n7\n ➜ load-script-seq git:(private) ✗ pwd\n /Users/casianorodriguezleon/campus-virtual/2021/learning/asyncjs-learning/load-script-seq\n ➜ load-script-seq git:(private) ✗ git remote -v\n origin\tgit@github.com:ULL-ESIT-PL/async-js-series-webpack.git (fetch)\n origin\tgit@github.com:ULL-ESIT-PL/async-js-series-webpack.git (push)\n private\tgit@github.com:ULL-ESIT-PL/async-js-series-webpack-private.git (fetch)\n private\tgit@github.com:ULL-ESIT-PL/async-js-series-webpack-private.git (push)\n \n \n \n \n\n\nPromises\n\n\n Promises: Basics: https://javascript.info/promise-basics\n \n load-script con promesas\n Chuck Norris jokes example (UAI 2015):\n \n index.html\n script.js\n \n \n \n \n Order: Promises vs Callbacks\n Example: Unhandled Promise Rejection (uai2015)\n\n\nWeb Wokers\n\n\n Web Workers\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/16/leccion.html" }, { "title": "Clase del Lunes 23/11/2020", "excerpt": "Clase del Lunes 23/11/2020\n\n", "content": "Clase del Lunes 23/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nRecordando\n\nEl libro https://javascript.info/ en local\n\nEstamos estudiando el capítulo Promises, async/await del libro The Modern JavaScript Tutorial: https://javascript.info/.\n\nPor si quieren tener el libro en local les facilito unas instrucciones de como hacerlo en este repo:\n\n\n ULL-MII-SYTWS/javascript-info-meta\n \n En el mac-air:\n\n 1\n2\n [~/.../javascript/javascript-info-book(master)]$ pwd\n /Users/casiano/local/books/javascript/javascript-info-book\n \n \n\n\nLa Práctica p8-t2-async-webpack-esmodule: ES2015 Modules with WebPack\n\nPara la práctica p8-t2-async-webpack-esmodule recuerden que tienen que estudiar el tutorial Getting Started y aplicar lo aprendido en el tutorial a la práctica anterior p8-t2-async-serialize de manera que\n\n Cargamos el módulo async.js usando la sintáxis ES2015.\n Aislamos nuestra solución en un módulo ES2015 que sea usado por index.js\n\n\n\nEntregan esta práctica en el mismo repo de la asignación de la práctica anterior p8-t2-async-serialize en una rama p8-t2-async-webpack-esmodule\n\nPromises\n\n\n Promises: Basics: https://javascript.info/promise-basics\n \n load-script con promesas\n Chuck Norris jokes example (UAI 2015):\n \n index.html\n script.js\n \n \n \n \n Order: Promises vs Callbacks\n Example: Unhandled Promise Rejection (uai2015)\n\n\nWeb Wokers\n\n\n Web Workers\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/23/leccion.html" }, { "title": "Clase del Lunes 30/11/2020", "excerpt": "Clase del Lunes 30/11/2020\n\n", "content": "Clase del Lunes 30/11/2020\n\nLas Prácticas\n\n\n Meet de la clase\n Prácticas\n\n\nRecordando\n\nEl libro https://javascript.info/ en local\n\nEstamos estudiando el capítulo Promises, async/await del libro The Modern JavaScript Tutorial: https://javascript.info/.\n\nPor si quieren tener el libro en local les facilito unas instrucciones de como hacerlo en este repo:\n\n\n ULL-MII-SYTWS/javascript-info-meta\n \n En el mac-air:\n\n 1\n2\n [~/.../javascript/javascript-info-book(master)]$ pwd\n /Users/casiano/local/books/javascript/javascript-info-book\n \n \n\n\nLa Práctica p8-t2-async-webpack-esmodule: ES2015 Modules with WebPack\n\nPara la práctica p8-t2-async-webpack-esmodule recuerden que tienen que estudiar el tutorial Getting Started y aplicar lo aprendido en el tutorial a la práctica anterior p8-t2-async-serialize de manera que\n\n Cargamos el módulo async.js usando la sintáxis ES2015.\n Aislamos nuestra solución en un módulo ES2015 que sea usado por index.js\n\n\n\nEntregan esta práctica en el mismo repo de la asignación de la práctica anterior p8-t2-async-serialize en una rama p8-t2-async-webpack-esmodule\n\nPromises\n\n\n Promises: Chaining\n \n Promise Error Handling en los apuntes\n \n \n Promises: Chaining\n \n Exercises: Exceptions and Promises\n \n \n Promise API\n \n Building Promise.all\n \n \n Order: Promises vs Callbacks\n Example: Unhandled Promise Rejection (uai2015)\n\n\nWeb Wokers\n\n\n Web Workers\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/11/30/leccion.html" }, { "title": "Clase del Miércoles 02/12/2020", "excerpt": "Clase del Miércoles 02/12/2020\n\n", "content": "Clase del Miércoles 02/12/2020\n\n\n Meet de la clase\n\n\nLas Prácticas\n\n\n Prácticas\n\n\nRecordando\n\nPromises\n\n\n Promise API\n Order: Promises vs Callbacks\n Example: Unhandled Promise Rejection (uai2015)\n\n\nLabs\n\n\n p9-t2-promise-readfile\n p10-t2-promise-all\n \n See path: tema2-async/event-loop/exercises/promises/promise-all\n \n \n p10-t2-promise-allsettled\n \n See path: tema2-async/event-loop/exercises/promises/promise-allsettled\n \n \n p11-t2-callback-2-promise\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/12/02/leccion.html" }, { "title": "Clase del Lunes 14/12/2020", "excerpt": "Clase del Lunes 14/12/2020\n\n", "content": "Clase del Lunes 14/12/2020\n\n\n Meet de la clase\n\n\nLas Prácticas\n\n\n Prácticas\n\n\nThe Microtask Queue and Async Await\n\n\n Microtask Queue\n \n See also Order: Promises vs Callbacks\n \n \n Unhandled Promise Rejection Revisited\n Async/Await\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2020/12/14/leccion.html" }, { "title": "Clase del Lunes 11/01/2021", "excerpt": "Clase del Lunes 11/01/2021\n\n", "content": "Clase del Lunes 11/01/2021\n\n\n Meet de la clase\n Pizarra\n Chat de la clase\n\n\nLas Prácticas que quedan\n\n\n Prácticas\n\n\nA día de hoy les quedan por aceptar las tareas de la p14 a la p18.\n\n\n Descripción de la Práctica p14-t2-async-await\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p15-t2-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p16-t2-async-await-is-generators-and-promises\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p17-t2-async-iteration-and-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p18-t2-first-come-first-served-for-await\n Enlace a los repos de los alumnos\n\n\nConsideraremos la última como Trabajo Fin de Asignatura\n\nPlanificación del Final de la Asignatura\n\nNos quedan dos clases esta semana y una clase la próxima semána. La entrega de actas es el Viernes 12 de Febrero\n\n\n\nintenten tener el mayor número de prácticas que puedan para el Jueves 11 de Febrero a las 13:00. Nos queda desde hoy un mes de trabajo.\n\nTutorías de Evaluación\n\nEl horario de tutorías es L, M, X de 8:30 a 10:30 y puedes usar el sistema de solicitud de citas para consultar dudas entregar prácticas, etc.\n\n\n Reserva de Tutoría (Enlace al calendario de solicitud de citas. Haz clic en una hora disponible. Si no hay ninguna, prueba en un intervalo de tiempo diferente. Para cancelar una hora ya reservada, sal de la página de registro y elimina el evento de tu propio calendario.).\nA la hora acordada inicias un chat usando Google Chat para arrancar la videoconferencia\n\n\nSi no te va bien ese horario me envías un email o inicia un chat para acordar cuando nos viene bien a los dos. No dudes en contactarme en cualquier momento. Estoy a tu disposición.\n\nIterators, Generators and Async Generators\n\n\n Iterables\n Generators\n \n Repo ULL-MII-SYTWS-2021/learning-generators\n campus-virtual/2021/learning/asyncjs-learning/learning-generators\n \n \n Async iteration and generators\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2021/01/11/leccion.html" }, { "title": "Clase del Miércoles 13/01/2021", "excerpt": "Clase del Miércoles 13/01/2021 (Prácticas)\n\n", "content": "Clase del Miércoles 13/01/2021 (Prácticas)\n\n\n Meet de la clase\n Pizarra\n Chat de la clase\n\n\nLas Prácticas\n\n\n Prácticas\n\n\nHoy avanzaremos lo que podamos en estas prácticas:\n\n\n Descripción de la Práctica p14-t2-async-await\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p15-t2-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p16-t2-async-await-is-generators-and-promises\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p17-t2-async-iteration-and-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p18-t2-first-come-first-served-for-await\n Enlace a los repos de los alumnos\n\n\nConsideraremos la última como Trabajo Fin de Asignatura\n\nPlanificación del Final de la Asignatura\n\nHoy Miércoles tendremos clase. Nos queda una clase mas la próxima semána. La entrega de actas es el Viernes 12 de Febrero\n\n\n\nintenten tener el mayor número de prácticas que puedan para el Jueves 11 de Febrero a las 13:00.\n\nTutorías de Evaluación\n\nEl horario de tutorías es L, M, X de 8:30 a 10:30 y puedes usar el sistema de solicitud de citas para consultar dudas entregar prácticas, etc.\n\n\n Reserva de Tutoría (Enlace al calendario de solicitud de citas. Haz clic en una hora disponible. Si no hay ninguna, prueba en un intervalo de tiempo diferente. Para cancelar una hora ya reservada, sal de la página de registro y elimina el evento de tu propio calendario.).\nA la hora acordada inicias un chat usando Google Chat para arrancar la videoconferencia\n\n\nSi no te va bien ese horario me envías un email o inicia un chat para acordar cuando nos viene bien a los dos. No dudes en contactarme en cualquier momento. Estoy a tu disposición.\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2021/01/13/leccion.html" }, { "title": "Clase del Lunes 18/01/2021", "excerpt": "Clase del Lunes 18/01/2021\n\n", "content": "Clase del Lunes 18/01/2021\n\n\n Meet de la clase\n Pizarra\n Chat de la clase\n\n\nLas Prácticas que quedan\n\n\n Prácticas\n\n\nPlanificación del Final de la Asignatura\n\nLa entrega de actas es el Viernes 12 de Febrero\n\n\n\nintenten tener el mayor número de prácticas que puedan para el Jueves 11 de Febrero a las 13:00.\n\nTutorías de Evaluación\n\nEl horario de tutorías es L, M, X de 8:30 a 10:30 y puedes usar el sistema de solicitud de citas para consultar dudas entregar prácticas, etc.\n\n\n Reserva de Tutoría (Enlace al calendario de solicitud de citas. Haz clic en una hora disponible. Si no hay ninguna, prueba en un intervalo de tiempo diferente. Para cancelar una hora ya reservada, sal de la página de registro y elimina el evento de tu propio calendario.).\nA la hora acordada inicias un chat usando Google Chat para arrancar la videoconferencia\n\n\nSi no te va bien ese horario me envías un email o inicia un chat para acordar cuando nos viene bien a los dos. No dudes en contactarme en cualquier momento. Estoy a tu disposición.\n\nPráctica p18-t2-first-come-first-served-for-await\n\nHoy resolveremos las dudas que tengan sobre esta práctica:\n\n\n p17-t2-async-iteration-and-generators\n\n\ny veremos como realizar esta práctica:\n\n\n p18-t2-first-come-first-served-for-await\n\n\nEnlaces de ayuda\n\n\n Sala de Chat\n Presentación de la Asignatura SYTWS\n Repositorio con apuntes y recursos\n\n", "url": "/clases/2021/01/18/leccion.html" }, { "title": "01p01 T0 Pb Gh Campus Expert", "excerpt": "Práctica Bono: GitHub Campus Expert (pb-gh-campus-expert)\n\nEsta práctica tiene por objetivo mejorar las competencias transversales. \nLa realización es opcional. \nLa puntuación obtenida en esta práctica puede usarse para sustituir la nota mas baja que haya obtenido en el resto de prácticas realizadas en la asignatura.\n\n\n Acepte la asignación\n\n\nEstas son las tareas a realizar:\n\n\n Realice el curso Become a Campus Expert de GitHub. Si está cerrado subscríbase a la lista y siga el curso cuando se abra.\n Solicite su Student Developer Pack\n Opcional: Solicite una GitHub Internship. Si está cerrada subscríbase para recibir las actualizaciones. No es necesario que acepte si es elegido\n\n\nUse el repo asignado para documentar (usando las GitHub Pages) que ha realizado el curso, solicitado el student developer pack y la GitHub Internship. En la tarea, suba el enlace al repo.\n\n", "content": "Práctica Bono: GitHub Campus Expert (pb-gh-campus-expert)\n\nEsta práctica tiene por objetivo mejorar las competencias transversales. \nLa realización es opcional. \nLa puntuación obtenida en esta práctica puede usarse para sustituir la nota mas baja que haya obtenido en el resto de prácticas realizadas en la asignatura.\n\n\n Acepte la asignación\n\n\nEstas son las tareas a realizar:\n\n\n Realice el curso Become a Campus Expert de GitHub. Si está cerrado subscríbase a la lista y siga el curso cuando se abra.\n Solicite su Student Developer Pack\n Opcional: Solicite una GitHub Internship. Si está cerrada subscríbase para recibir las actualizaciones. No es necesario que acepte si es elegido\n\n\nUse el repo asignado para documentar (usando las GitHub Pages) que ha realizado el curso, solicitado el student developer pack y la GitHub Internship. En la tarea, suba el enlace al repo.\n\n", "url": "/practicas/01p01-t0-pb-gh-campus-expert.html" }, { "title": "01p01 T1 Iaas", "excerpt": "Descripción de la Práctica p01-t1-iaas\n\n\n Siguiendo las instrucciones en el repositorio SYTW/iaas-ull-es despliegue un ejemplo como el que aparece en crguezl/express-start en su máquina virtual del servicio iaas.ull.es.\n Puede encontrar un vídeo del profesor introduciendo el iaas.ull.es aquí.\n \n \n El vídeo es de 2018 y varias de las apps usadas han cambiado de versión pero la esencia de la metodología es la misma\n \n \n Añada en el README.md un pequeño tutorial de como usar y desplegar una aplicación web en iaas.ull.es.\n \n Haga capturas de pantalla que muestren que su máquina esta bien configurada y funcionando\n \n \n La IP dinámica de su máquina virtual no debería cambiar si no la apaga. Publique la URL de despliegue en su máquina\n Prepare la máquina para poder trabajar:\n \n Instale linuxbrew\n Instale git si es necesario\n Configura git\n Procure que la rama actual aparezca en el prompt de la terminal.\n \n Ejemplo para una bash. Pon en el fichero ~/.bash_profile o ~/.bashrc estas líneas:\n \n\n 1\n2\n3\n4\n parse_git_branch() {\n git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*\\)/ (\\1)/'\n }\n export PS1=\"\\u@\\h \\[\\033[32m\\]\\w\\[\\033[33m\\]\\$(parse_git_branch)\\[\\033[00m\\] $ \"\n \n\n \n También puede usar git prompt\n Puede añadir algo como esto a su PS1: PS1=\"\\$(git branch 2>/dev/null | sed -n 's/* \\(.*\\)/\\1 /p')$ \"\n Recuerde que si su prompt es muy largo siempre puede acortarlo con PROMPT_DIRTRIM=1\n \n \n git aliases\n Instale GitHub CLI y aprenda a usarla\n \n manual\n \n \n Instale meta\n \n meta is a tool for managing multi-project systems and libraries. It answers the conundrum of choosing between a mono repo or many repos by saying “both”, with a meta repo!\n meta is powered by plugins that wrap common commands, letting you execute them against some or all of the repos in your solution at once. meta is built on loop, and as such inherits loops ability to easily target a particular set of directories for executing a common command (eg meta git status --include-only dir1,dir2. See loop for more available options).\n \n \n Instale nvm\n Instale nodeJS usando nvm\n jshint y jshint on vim o JSLint o equivalente\n \n Instale NERDTree para vim\n \n \n Instale Express.js\n \n Express Web Framework (Node.js/JavaScript) (Mozilla)\n \n \n Instale rbenv o chruby o rvm o similar y alguna versión moderna de Ruby\n \n \n Hágase miembro de la comunidad Google+ SYTWS (Asegúrate de estar identificado con tu cuenta de Gmail de la ULL)\n\n\nSoftware Obsoleto.\n\n\n Como instalar X11 en las máquinas de iaas.ull.es Vídeo en Youtube. Esto es opcional.\n hub. Obsoleto. No lo instale. Se usa GitHub cli\n ghi Obsoleto. No lo instale.\n Instale ctags\n ag o ack\n etc.\n\n\nGitHub Classroom: Outside Colaborators and members\n\n\n Una vez acepte la tarea en GitHub Classroom, pasará a ser outside collaborator de la organización de la asignatura,\n En algun momento, el profesor le hará una invitación a ser miembro de pleno derecho de la organización\n \n Acepte la invitacion del profesor a pertenecer a la organización Github de la asignatura visitando la página de la organización\n También recibirá un email con la invitación. Puede aceptar haciendo click en el correspondiente enlace\n \n \n\n\nFormulario\n\nRellene el formulario solicitado con la relación aluXX-GitHub si no lo ha hecho ya\n\n", "content": "Descripción de la Práctica p01-t1-iaas\n\n\n Siguiendo las instrucciones en el repositorio SYTW/iaas-ull-es despliegue un ejemplo como el que aparece en crguezl/express-start en su máquina virtual del servicio iaas.ull.es.\n Puede encontrar un vídeo del profesor introduciendo el iaas.ull.es aquí.\n \n \n El vídeo es de 2018 y varias de las apps usadas han cambiado de versión pero la esencia de la metodología es la misma\n \n \n Añada en el README.md un pequeño tutorial de como usar y desplegar una aplicación web en iaas.ull.es.\n \n Haga capturas de pantalla que muestren que su máquina esta bien configurada y funcionando\n \n \n La IP dinámica de su máquina virtual no debería cambiar si no la apaga. Publique la URL de despliegue en su máquina\n Prepare la máquina para poder trabajar:\n \n Instale linuxbrew\n Instale git si es necesario\n Configura git\n Procure que la rama actual aparezca en el prompt de la terminal.\n \n Ejemplo para una bash. Pon en el fichero ~/.bash_profile o ~/.bashrc estas líneas:\n \n\n 1\n2\n3\n4\n parse_git_branch() {\n git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \\(.*\\)/ (\\1)/'\n }\n export PS1=\"\\u@\\h \\[\\033[32m\\]\\w\\[\\033[33m\\]\\$(parse_git_branch)\\[\\033[00m\\] $ \"\n \n\n \n También puede usar git prompt\n Puede añadir algo como esto a su PS1: PS1=\"\\$(git branch 2>/dev/null | sed -n 's/* \\(.*\\)/\\1 /p')$ \"\n Recuerde que si su prompt es muy largo siempre puede acortarlo con PROMPT_DIRTRIM=1\n \n \n git aliases\n Instale GitHub CLI y aprenda a usarla\n \n manual\n \n \n Instale meta\n \n meta is a tool for managing multi-project systems and libraries. It answers the conundrum of choosing between a mono repo or many repos by saying “both”, with a meta repo!\n meta is powered by plugins that wrap common commands, letting you execute them against some or all of the repos in your solution at once. meta is built on loop, and as such inherits loops ability to easily target a particular set of directories for executing a common command (eg meta git status --include-only dir1,dir2. See loop for more available options).\n \n \n Instale nvm\n Instale nodeJS usando nvm\n jshint y jshint on vim o JSLint o equivalente\n \n Instale NERDTree para vim\n \n \n Instale Express.js\n \n Express Web Framework (Node.js/JavaScript) (Mozilla)\n \n \n Instale rbenv o chruby o rvm o similar y alguna versión moderna de Ruby\n \n \n Hágase miembro de la comunidad Google+ SYTWS (Asegúrate de estar identificado con tu cuenta de Gmail de la ULL)\n\n\nSoftware Obsoleto.\n\n\n Como instalar X11 en las máquinas de iaas.ull.es Vídeo en Youtube. Esto es opcional.\n hub. Obsoleto. No lo instale. Se usa GitHub cli\n ghi Obsoleto. No lo instale.\n Instale ctags\n ag o ack\n etc.\n\n\nGitHub Classroom: Outside Colaborators and members\n\n\n Una vez acepte la tarea en GitHub Classroom, pasará a ser outside collaborator de la organización de la asignatura,\n En algun momento, el profesor le hará una invitación a ser miembro de pleno derecho de la organización\n \n Acepte la invitacion del profesor a pertenecer a la organización Github de la asignatura visitando la página de la organización\n También recibirá un email con la invitación. Puede aceptar haciendo click en el correspondiente enlace\n \n \n\n\nFormulario\n\nRellene el formulario solicitado con la relación aluXX-GitHub si no lo ha hecho ya\n\n", "url": "/practicas/01p01-t1-iaas.html" }, { "title": "02p2 T1 Vscode", "excerpt": "\nDescripción de la Práctica p2-t1-vscode\n\nAcepte la tarea\n\n\n Asignación p2-t1-vscode\n\n\nObjetivos\n\n\n Instale VSCode en su máquina\n Siga los tutoriales de VSCode\n Instale el plugin Remote SSH y aprenda a usarlo con el sistema de archivo de una máquina remota via SSH\n Use Live Share para colaborar con un compañero\n Elabore un informe con la experiencia adquirida\n\n\nTutoriales\n\nGuía de Usuario\n\n \n Basic Editing\n \n \n \n Extension Marketplace\n \n \n \n IntelliSense\n \n \n \n Code Navigation\n \n \n \n Refactoring\n \n \n \n Debugging\n \n \n \n Version Control\n \n \n \n Integrated Terminal\n \n \n \n Multi-root Workspaces\n \n \n \n Tasks\n \n \n \n Snippets\n \n \n \n Emmet\n \n \n \n Command Line\n \n \n \n Accessibility\n \n \n\n\nCollaboration con Visual Studio Share\n\n\n Introducing Visual Studio Live Share\n Vídeo Visual Studio Live Share Demo on VS Code\n\n\nSSH\n\nEditando con VSCode en la máquina iaas.ull.es con Remote SSH\n\nVaya a paquetes:\n\n\n \n\n\nBusque por SSH:\n\n\n \n\n\nUna vez instalado active la command palette Ctrl-Shift-P y escriba SSH:\n\n\n \n\n\nElige REMOTE-SSH: connect to host …\n\n\n \n\n\nAhora escribimos el nombre del host. Por ejemplo sytws. Previamente hemos puesto una entrada en ~/.ssh/config como esta:\n\nHost sytws sytws2021\nHostName 10.6.129.111\nUser usuario\nIdentityFile /Users/casianorodriguezleon/.ssh/claveprivada\nServerAliveInterval 240\n\n\n\n \n\n\nMulti-Root Workspaces\n\n\n Multi-Root Workspaces\n\n\nUsing React in VSCode\n\n\n Using React in VSCode\n\n\nIntegrate with External Tools via Tasks\n\n\n Integrate with External Tools via Tasks\n\n\nWeb Bookmarks\n\n\n MarketPlace: Web Bookmarks a VSCode Extension by Alejandro Gonzalez Alonso\n GitHub Repo: Web Bookmarks a VSCode Extension by Alejandro Gonzalez Alonso\n\n\nLocalización del Fichero de Configuración settings.json\n\nDepending on your platform, the user settings file is located here:\n\n\n Windows %APPDATA%\\Code\\User\\settings.json\n macOS $HOME/Library/ApplicationSupport/Code/User/settings.json\n Linux $HOME/.config/Code/User/settings.json\n The workspace setting file is located under the .vscode folder in your root folder.\n\n\n", "content": "\nDescripción de la Práctica p2-t1-vscode\n\nAcepte la tarea\n\n\n Asignación p2-t1-vscode\n\n\nObjetivos\n\n\n Instale VSCode en su máquina\n Siga los tutoriales de VSCode\n Instale el plugin Remote SSH y aprenda a usarlo con el sistema de archivo de una máquina remota via SSH\n Use Live Share para colaborar con un compañero\n Elabore un informe con la experiencia adquirida\n\n\nTutoriales\n\nGuía de Usuario\n\n \n Basic Editing\n \n \n \n Extension Marketplace\n \n \n \n IntelliSense\n \n \n \n Code Navigation\n \n \n \n Refactoring\n \n \n \n Debugging\n \n \n \n Version Control\n \n \n \n Integrated Terminal\n \n \n \n Multi-root Workspaces\n \n \n \n Tasks\n \n \n \n Snippets\n \n \n \n Emmet\n \n \n \n Command Line\n \n \n \n Accessibility\n \n \n\n\nCollaboration con Visual Studio Share\n\n\n Introducing Visual Studio Live Share\n Vídeo Visual Studio Live Share Demo on VS Code\n\n\nSSH\n\nEditando con VSCode en la máquina iaas.ull.es con Remote SSH\n\nVaya a paquetes:\n\n\n \n\n\nBusque por SSH:\n\n\n \n\n\nUna vez instalado active la command palette Ctrl-Shift-P y escriba SSH:\n\n\n \n\n\nElige REMOTE-SSH: connect to host …\n\n\n \n\n\nAhora escribimos el nombre del host. Por ejemplo sytws. Previamente hemos puesto una entrada en ~/.ssh/config como esta:\n\nHost sytws sytws2021\nHostName 10.6.129.111\nUser usuario\nIdentityFile /Users/casianorodriguezleon/.ssh/claveprivada\nServerAliveInterval 240\n\n\n\n \n\n\nMulti-Root Workspaces\n\n\n Multi-Root Workspaces\n\n\nUsing React in VSCode\n\n\n Using React in VSCode\n\n\nIntegrate with External Tools via Tasks\n\n\n Integrate with External Tools via Tasks\n\n\nWeb Bookmarks\n\n\n MarketPlace: Web Bookmarks a VSCode Extension by Alejandro Gonzalez Alonso\n GitHub Repo: Web Bookmarks a VSCode Extension by Alejandro Gonzalez Alonso\n\n\nLocalización del Fichero de Configuración settings.json\n\nDepending on your platform, the user settings file is located here:\n\n\n Windows %APPDATA%\\Code\\User\\settings.json\n macOS $HOME/Library/ApplicationSupport/Code/User/settings.json\n Linux $HOME/.config/Code/User/settings.json\n The workspace setting file is located under the .vscode folder in your root folder.\n\n\n", "url": "/practicas/02p2-t1-vscode.html" }, { "title": "03p2 T1 C3 File System", "excerpt": "Descripción de la práctica p2-t1-c3-filesystem\n\n\n Aceptemos la asignación de la tarea\n Autentíquese en BULL PuntoQ\n Una vez autenticado obtendrá acceso al libro Node.js 8 the Right Way. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ)\n Lea el Capítulo 2 “Wrangling the File System” de Node.JS The Right Way.\n Consulte el repo de bibliografía para la organización\n Resuelva los problemas en la secciones Fortifying the code y Expanding Functionality del capítulo Wrangling the File System\n Haga su desarrollo usando Visual studio Code. Use git y github desde visual studio code tanto como pueda\n\n\nEste es un ejemplo similar a los ejemplos que encontrará en el capítulo\ncon la diferencia de que usamos la librería commander.js para procesar los argumentos:\n\n1\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ cat watcher-fortifying-code.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n#!/usr/bin/env node\n'use strict';\nconst fs = require(\"fs\");\nconst program = require('commander');\nconst { version, description } = require('./package.json');\n\nprogram\n .version(version)\n .description(description)\n .usage('[options]')\n .option('-f, --file <fileToWatch>', 'set the file or directory to watch', '.')\n\nprogram.parse(process.argv);\n\nconst fileToWatch = program.file;\n\ntry {\n fs.watch(fileToWatch, { recursive: true }, (eventType, fileName) => {\n console.log(`File ${fileName} changed! Event Type: ${eventType}`);\n if (eventType === 'rename' && fileToWatch === fileName) {\n console.error(`No longer watching ${fileToWatch}!`);\n process.exit(1);\n }\n });\n console.log(`Now watching ${fileToWatch} for changes ...`);\n} catch(e) {\n if (e.code === \"ENOENT\") console.error(`No file '${fileToWatch}' found`);\n else console.error(e)\n}\n\n\nVeamos un ejemplo de ejecución cuando no se pasan argumentos:\n\n1\n2\n3\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js \nNow watching . for changes ...\n^C\n\n\nPodemos usar la opción --help:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n$ node watcher-fortifying-code.js --help\nUsage: watcher-fortifying-code [options]\n\nwatch a file or directory for changes\n\nOptions:\n -V, --version output the version number\n -f, --file <fileToWatch> set the file or directory to watch (default: \".\")\n -h, --help output usage information\n\n\nLa opción -V:\n\n1\n2\n$ node watcher-fortifying-code.js -V\n1.0.0\n\n\nEl programa se nutre para la versión de la que está en el fichero package.json:\n\n1\n2\n3\n$ jq .version,.description package.json \n\"1.0.0\"\n\"watch a file or directory for changes\"\n\n\nSi le pasamos la opción -f:\n\n1\n2\n3\n4\n5\n$ node watcher-fortifying-code.js -f target.txt\nNo file 'target.txt' found\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ touch target.txt\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js -f target.txt\nNow watching target.txt for changes ...\n\n\nEjercicio\n\n\n Mejore este ejemplo añadiendo una opción -r --recursive que indica si watch debe hacer una vigilancia recursiva.\n\n\nThe fs.watch API is not 100% consistent across platforms, and is unavailable in some situations.\nThe recursive option is only supported on macOS and Windows.\nPara sistemas Linux es conveniente utilizar un wrapper como node-watch.\n\nEjercicios\n\n\n Resuelva los problemas en la secciones Fortifying the code y Expanding Functionality del capítulo Wrangling the File System\n \n In the file-watching examples, what happens if the target file doesn’t exist?\n What happens if a file being watched gets deleted?\n How would you take the process to spawn from process.argv?\n How would you pass an arbitrary number of additional parameters from process.argv to the spawned process?\n \n node watcher-spawn-cmd.js target.txt ls -l -h\n \n \n Use la librería commander.js\n \n \n\n\nVisual Studio Code y git\n\n\n Haga su desarrollo usando Visual Studio Code. Use git y github desde visual studio code tanto como pueda\n\n\nTablero Kanban\n\n\n Cree un tablero GitHub del tipo Kanban Automatizado. Convierta en incidencias los requisitos y proceda a moverlos entre los paneles conforme progresa.\n \n En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.\n \n En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.\n\n\n\n\nEn el README.md escriba un tutorial sobre lo que ha aprendido. Muestre imágenes o vídeos de su desarrollo con Visual Studio Code.\n\nRecursos\n\nQ & A\n\nA que se refiere la pregunta “Instead, how would you take the process to spawn from process.argv?”\n\nEn el fichero watcher-spawn.js se hace un spawndel comando ls:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n\"use strict\";\nconst\n fs = require('fs'),\n // The child_process module provides the ability to spawn child processes in a manner that is similar, but not identical, to popen\n spawn = require('child_process').spawn,\n filename = process.argv[2];\n\nif (!filename) {\n throw Error(\"A file to watch must be specified!\");\n}\n\nfs.watch(filename, function(eventType, fN) {\n \n let ls = spawn('ls', ['-lh', fN]);\n console.log(ls.pid);\n console.log(eventType, fN);\n \n ls.stdout.pipe(process.stdout);\n});\n\nconsole.log(\"Now watching \" + filename + \" for changes...\");\n\n\nlo que pide la pregunta es escribir una variante del programa anterior \nen la que el comando a ejecutar en vez de ser ls se especifique \nen la línea de comandos:\n\n1\n2\n3\n$ ./watcher-sol.js \nUsage:\n watcher-sol.js <fileName> [command] [args ... ]\n\n\n1\n2\n3\n$ ./watcher-sol.js . 'ls' '-l' \nNow watching . for changes...\n-rw-r--r-- 1 casiano staff 1460 18 oct 08:37 watcher-fortifying-code.js\n\n\n1\n2\n3\n$ ./watcher-sol.js . echo \"File change\"\nNow watching . for changes...\nFile change watcher-fortifying-code.js\n\n\nEl Libro Node.js 8 the Right Way\n\n\n Repo de bibliografía para la organización\n BULL PuntoQ\n Node.js 8 the Right Way en Safari books O’Reilly. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ)\n Node.js 8 the Right Way en Google Books. Faltan páginas\n\n\nThe JS Event Loop\n\n\n El bucle de Eventos de JS explicado Ejemplos\n\n\nVScode\n\n\n Using Version Control in VS Code\n\n\nEl libro EloquentJS. El capítulo 20 es sobre Node.js\n\n\n Eloquent JS 2nd Edition Chapter 20\n Capítulo 20 de Eloquent JavaScript: Node.js\n\n\nEl libro Node.js Beyond the Basics\n\nEste es un libro diferente a la mayoría de los libros sobre Node.Js en cuanto que profundiza en el runtime-system de Node.js y por tanto es relevante en la etapa en la que estamos. Sólo están disponibles la introducción y el capítulo de streams. Elr esto es de pago.\n\n\n Node.js Beyond the Basics\n Node.js Child Processes: Everything you need to know How to use spawn(), exec(), execFile(), and fork()\n\n\nSolución\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (Recurso solo disponible para el profesor)\n\n\n", "content": "Descripción de la práctica p2-t1-c3-filesystem\n\n\n Aceptemos la asignación de la tarea\n Autentíquese en BULL PuntoQ\n Una vez autenticado obtendrá acceso al libro Node.js 8 the Right Way. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ)\n Lea el Capítulo 2 “Wrangling the File System” de Node.JS The Right Way.\n Consulte el repo de bibliografía para la organización\n Resuelva los problemas en la secciones Fortifying the code y Expanding Functionality del capítulo Wrangling the File System\n Haga su desarrollo usando Visual studio Code. Use git y github desde visual studio code tanto como pueda\n\n\nEste es un ejemplo similar a los ejemplos que encontrará en el capítulo\ncon la diferencia de que usamos la librería commander.js para procesar los argumentos:\n\n1\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ cat watcher-fortifying-code.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n#!/usr/bin/env node\n'use strict';\nconst fs = require(\"fs\");\nconst program = require('commander');\nconst { version, description } = require('./package.json');\n\nprogram\n .version(version)\n .description(description)\n .usage('[options]')\n .option('-f, --file <fileToWatch>', 'set the file or directory to watch', '.')\n\nprogram.parse(process.argv);\n\nconst fileToWatch = program.file;\n\ntry {\n fs.watch(fileToWatch, { recursive: true }, (eventType, fileName) => {\n console.log(`File ${fileName} changed! Event Type: ${eventType}`);\n if (eventType === 'rename' && fileToWatch === fileName) {\n console.error(`No longer watching ${fileToWatch}!`);\n process.exit(1);\n }\n });\n console.log(`Now watching ${fileToWatch} for changes ...`);\n} catch(e) {\n if (e.code === \"ENOENT\") console.error(`No file '${fileToWatch}' found`);\n else console.error(e)\n}\n\n\nVeamos un ejemplo de ejecución cuando no se pasan argumentos:\n\n1\n2\n3\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js \nNow watching . for changes ...\n^C\n\n\nPodemos usar la opción --help:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n$ node watcher-fortifying-code.js --help\nUsage: watcher-fortifying-code [options]\n\nwatch a file or directory for changes\n\nOptions:\n -V, --version output the version number\n -f, --file <fileToWatch> set the file or directory to watch (default: \".\")\n -h, --help output usage information\n\n\nLa opción -V:\n\n1\n2\n$ node watcher-fortifying-code.js -V\n1.0.0\n\n\nEl programa se nutre para la versión de la que está en el fichero package.json:\n\n1\n2\n3\n$ jq .version,.description package.json \n\"1.0.0\"\n\"watch a file or directory for changes\"\n\n\nSi le pasamos la opción -f:\n\n1\n2\n3\n4\n5\n$ node watcher-fortifying-code.js -f target.txt\nNo file 'target.txt' found\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ touch target.txt\n[~/.../sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node watcher-fortifying-code.js -f target.txt\nNow watching target.txt for changes ...\n\n\nEjercicio\n\n\n Mejore este ejemplo añadiendo una opción -r --recursive que indica si watch debe hacer una vigilancia recursiva.\n\n\nThe fs.watch API is not 100% consistent across platforms, and is unavailable in some situations.\nThe recursive option is only supported on macOS and Windows.\nPara sistemas Linux es conveniente utilizar un wrapper como node-watch.\n\nEjercicios\n\n\n Resuelva los problemas en la secciones Fortifying the code y Expanding Functionality del capítulo Wrangling the File System\n \n In the file-watching examples, what happens if the target file doesn’t exist?\n What happens if a file being watched gets deleted?\n How would you take the process to spawn from process.argv?\n How would you pass an arbitrary number of additional parameters from process.argv to the spawned process?\n \n node watcher-spawn-cmd.js target.txt ls -l -h\n \n \n Use la librería commander.js\n \n \n\n\nVisual Studio Code y git\n\n\n Haga su desarrollo usando Visual Studio Code. Use git y github desde visual studio code tanto como pueda\n\n\nTablero Kanban\n\n\n Cree un tablero GitHub del tipo Kanban Automatizado. Convierta en incidencias los requisitos y proceda a moverlos entre los paneles conforme progresa.\n \n En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.\n \n En el repo que entrega deberán figurar los ejemplos del libro y los ejercicios resueltos.\n\n\n\n\nEn el README.md escriba un tutorial sobre lo que ha aprendido. Muestre imágenes o vídeos de su desarrollo con Visual Studio Code.\n\nRecursos\n\nQ & A\n\nA que se refiere la pregunta “Instead, how would you take the process to spawn from process.argv?”\n\nEn el fichero watcher-spawn.js se hace un spawndel comando ls:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n\"use strict\";\nconst\n fs = require('fs'),\n // The child_process module provides the ability to spawn child processes in a manner that is similar, but not identical, to popen\n spawn = require('child_process').spawn,\n filename = process.argv[2];\n\nif (!filename) {\n throw Error(\"A file to watch must be specified!\");\n}\n\nfs.watch(filename, function(eventType, fN) {\n \n let ls = spawn('ls', ['-lh', fN]);\n console.log(ls.pid);\n console.log(eventType, fN);\n \n ls.stdout.pipe(process.stdout);\n});\n\nconsole.log(\"Now watching \" + filename + \" for changes...\");\n\n\nlo que pide la pregunta es escribir una variante del programa anterior \nen la que el comando a ejecutar en vez de ser ls se especifique \nen la línea de comandos:\n\n1\n2\n3\n$ ./watcher-sol.js \nUsage:\n watcher-sol.js <fileName> [command] [args ... ]\n\n\n1\n2\n3\n$ ./watcher-sol.js . 'ls' '-l' \nNow watching . for changes...\n-rw-r--r-- 1 casiano staff 1460 18 oct 08:37 watcher-fortifying-code.js\n\n\n1\n2\n3\n$ ./watcher-sol.js . echo \"File change\"\nNow watching . for changes...\nFile change watcher-fortifying-code.js\n\n\nEl Libro Node.js 8 the Right Way\n\n\n Repo de bibliografía para la organización\n BULL PuntoQ\n Node.js 8 the Right Way en Safari books O’Reilly. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ)\n Node.js 8 the Right Way en Google Books. Faltan páginas\n\n\nThe JS Event Loop\n\n\n El bucle de Eventos de JS explicado Ejemplos\n\n\nVScode\n\n\n Using Version Control in VS Code\n\n\nEl libro EloquentJS. El capítulo 20 es sobre Node.js\n\n\n Eloquent JS 2nd Edition Chapter 20\n Capítulo 20 de Eloquent JavaScript: Node.js\n\n\nEl libro Node.js Beyond the Basics\n\nEste es un libro diferente a la mayoría de los libros sobre Node.Js en cuanto que profundiza en el runtime-system de Node.js y por tanto es relevante en la etapa en la que estamos. Sólo están disponibles la introducción y el capítulo de streams. Elr esto es de pago.\n\n\n Node.js Beyond the Basics\n Node.js Child Processes: Everything you need to know How to use spawn(), exec(), execFile(), and fork()\n\n\nSolución\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (Recurso solo disponible para el profesor)\n\n\n", "url": "/practicas/03p2-t1-c3-file-system.html" }, { "title": "05p5 T1 Meta", "excerpt": "Descripción de la Práctica p5-t1-meta\n\nConvierta el repo asignado en un meta repo que contiene todas las prácticas que realice en la asignatura SYTWS.\n\nReferencias\n\n\n Meta en los apuntes\n\n\n", "content": "Descripción de la Práctica p5-t1-meta\n\nConvierta el repo asignado en un meta repo que contiene todas las prácticas que realice en la asignatura SYTWS.\n\nReferencias\n\n\n Meta en los apuntes\n\n\n", "url": "/practicas/05p5-t1-meta.html" }, { "title": "06p6 T1 Gh Cli", "excerpt": "Descripción de la Práctica p6-t1-gh-cli\n\nUsing gh api and gh alias --shell add to gh \nan extension gh create-repo that creates the repo inside the given organization:\n\n1\ngh create-repo prueba-repo ULL-MII-SYTWS-2021\n\n\nYou can use the REST API or GraphQL\n\n", "content": "Descripción de la Práctica p6-t1-gh-cli\n\nUsing gh api and gh alias --shell add to gh \nan extension gh create-repo that creates the repo inside the given organization:\n\n1\ngh create-repo prueba-repo ULL-MII-SYTWS-2021\n\n\nYou can use the REST API or GraphQL\n\n", "url": "/practicas/06p6-t1-gh-cli.html" }, { "title": "07p7 T2 Asyncmap", "excerpt": "Descripción de la Práctica p7-t2-asyncmap\n\nEscriba un programa Node.js que usando fs.readFile lea un conjunto de ficheros pasados en vía de comandos y produzca como salida la concatenación de los mismos en el orden especificado. Evite usar fs.readFileSync:\n\n1\n$ concat -f one.txt -f two.txt -f three.txt -o salida.txt\n\n\nCon commander es posible indicar una opción que se puede repetir\n\n1\n2\n3\n4\n5\n6\n7\nconst program = require('commander');\nfunction collect(value, previous) {\n return previous.concat([value]);\n}\nprogram.option('-c, --collect <value>', 'repeatable value', collect, []);\nprogram.parse(process.argv);\nconsole.log(program.collect)\n\n\n1\n2\n$ node repeatable-option-commander.js -c a -c b -c c\n[ 'a', 'b', 'c' ]\n\n\n\n Lea la sección The Async Module de los apuntes y encuentre una solución usando Async. Considere la posibilidad de excepciones debidas a que alguno de los ficheros no exista\n Encuentre una solución sin hacer uso de Async ¿Cómo lo haría?\n Haciendo abstracción de la solución encontrada en el paso anterior escriba una función asyncMap que funcione como el map del módulo Async:\n\n\n1\n asyncMap(inputs, (item, cb) => fs.readFile(item, cb), (err, contents) => { ... });\n\n\n", "content": "Descripción de la Práctica p7-t2-asyncmap\n\nEscriba un programa Node.js que usando fs.readFile lea un conjunto de ficheros pasados en vía de comandos y produzca como salida la concatenación de los mismos en el orden especificado. Evite usar fs.readFileSync:\n\n1\n$ concat -f one.txt -f two.txt -f three.txt -o salida.txt\n\n\nCon commander es posible indicar una opción que se puede repetir\n\n1\n2\n3\n4\n5\n6\n7\nconst program = require('commander');\nfunction collect(value, previous) {\n return previous.concat([value]);\n}\nprogram.option('-c, --collect <value>', 'repeatable value', collect, []);\nprogram.parse(process.argv);\nconsole.log(program.collect)\n\n\n1\n2\n$ node repeatable-option-commander.js -c a -c b -c c\n[ 'a', 'b', 'c' ]\n\n\n\n Lea la sección The Async Module de los apuntes y encuentre una solución usando Async. Considere la posibilidad de excepciones debidas a que alguno de los ficheros no exista\n Encuentre una solución sin hacer uso de Async ¿Cómo lo haría?\n Haciendo abstracción de la solución encontrada en el paso anterior escriba una función asyncMap que funcione como el map del módulo Async:\n\n\n1\n asyncMap(inputs, (item, cb) => fs.readFile(item, cb), (err, contents) => { ... });\n\n\n", "url": "/practicas/07p7-t2-asyncmap.html" }, { "title": "08p8 T2 Async Serialize", "excerpt": "Descripción de la Práctica p8-t2-async-serialize\n\nSe dispone de una función loadScript que permite la carga de un script:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n\n\nQue puede ser usada para cargar varios scripts. Supongamos que el segundo script usa funciones definidas en el primero. Tenemos que asegurarnos que el segundo script sólo se carga una vez terminada la carga del primero. En este ejemplo de uso cargamos tres scripts script-1.js, script-2.js y script-3.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Document</title>\n </head>\n <body>\n <p id=\"out\"></p>\n <script>\n 'use strict';\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n \n loadScript('script-1.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Cool!, the script '${script.src}' is loaded: \"${hello()}\"`;\n out.innerHTML = message;\n console.log(message);\n\n loadScript('script-2.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Great!, the script '${script.src}' is loaded: \"${world()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n loadScript('script-3.js', (error, script) => {\n if (error) {\n console.error( error );\n } else {\n const message = `Unbelievable!, the script '${script.src}' is loaded: \"${ull()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n // ...continue after all scripts are loaded \n }\n });\n }\n })\n }\n });\n </script> \n </body> \n</html>\n\n\nPuede ver este código en funcionamiento visitando https://ull-esit-pl.github.io/async-js-series-webpack/load-script.html. Si lo hace, recuerde abrir las herramientas de desarrollador para ver los mensajes en la cónsola.\nPuede encontrar mas detalles sobre este ejercicio en el tutorial del profesor en https://github.com/ULL-ESIT-PL/async-js-series-webpack.\n\n\n \n Escriba una función loadScripts\n\n 1\n2\n3\n4\n loadScripts(\n ['script-1.js', 'script-2.js', 'script-3.js'], \n (err, results) => out.innerHTML = results.map(s => s.src).join(\"<br/>\")\n )\n \n\n que carga los scripts especificados en el array en secuencia y llama a la callback pasada como último argumento bien con un error si lo hubo o con el array de resultados (los scripts).\n \n \n Escriba su propia versión de la función series (con la misma interfaz que su equivalente de Async.js) que resuelva el problema de la secuencialización de las callbacks:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n series(\n [\n cb => loadScript('script-1.js', cb),\n cb => loadScript('script-2.js', cb),\n cb => loadScript('script-3.js', cb)\n ],\n (err, results) => p.innerHTML = results.map(s => s.src).join(\"<br/>\")\n );\n \n \n \n Deje su solución al reto #number en un fichero reto-#number.html\n \n\n\nObservaciones\n\nSi hace las pruebas de funcionamiento con scripts de similar tamaño la probabilidad de que su algoritmo produzca una salida que respeta el orden especificado es alta, incluso si su algoritmo es erróneo.\n\nPuede simular que los scripts son de distinto tamaño retrasando la iniciación de las cargas con un setTimeout que espere por un número aleatorio de milisegundos:\n\n1\n2\n3\n [~/.../load-script-seq(private)]$ pwd\n/Users/casiano/local/src/javascript/learning/async/load-script-seq\n[~/.../load-script-seq(private)]$ sed -ne '12,23p' load-scripts.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n const ir = (min, max) => Math.round((Math.random() * (max - min) + min))\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n setTimeout(() => script.src = src, ir(500,2000));\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n\nReferencias\n\n\n Repo ULL-ESIT-PL/async-js-series-webpack\n A pure ESM version of Async\n Webpack: Getting started\n Webpack devserver\n\n\nSoluciones\n\n\n Solución\n \n 1\n2\n [~/.../load-script-seq(private)]$ pwd -P\n /Users/casiano/local/src/javascript/learning/async/load-script-seq\n \n \n /Volumes/2020/sytws/sytws2021/p8-t2-async-serialize-12-03-2020-09-16-48/alu0101040882 Daniel Labena\n\n", "content": "Descripción de la Práctica p8-t2-async-serialize\n\nSe dispone de una función loadScript que permite la carga de un script:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n\n\nQue puede ser usada para cargar varios scripts. Supongamos que el segundo script usa funciones definidas en el primero. Tenemos que asegurarnos que el segundo script sólo se carga una vez terminada la carga del primero. En este ejemplo de uso cargamos tres scripts script-1.js, script-2.js y script-3.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Document</title>\n </head>\n <body>\n <p id=\"out\"></p>\n <script>\n 'use strict';\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n \n loadScript('script-1.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Cool!, the script '${script.src}' is loaded: \"${hello()}\"`;\n out.innerHTML = message;\n console.log(message);\n\n loadScript('script-2.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Great!, the script '${script.src}' is loaded: \"${world()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n loadScript('script-3.js', (error, script) => {\n if (error) {\n console.error( error );\n } else {\n const message = `Unbelievable!, the script '${script.src}' is loaded: \"${ull()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n // ...continue after all scripts are loaded \n }\n });\n }\n })\n }\n });\n </script> \n </body> \n</html>\n\n\nPuede ver este código en funcionamiento visitando https://ull-esit-pl.github.io/async-js-series-webpack/load-script.html. Si lo hace, recuerde abrir las herramientas de desarrollador para ver los mensajes en la cónsola.\nPuede encontrar mas detalles sobre este ejercicio en el tutorial del profesor en https://github.com/ULL-ESIT-PL/async-js-series-webpack.\n\n\n \n Escriba una función loadScripts\n\n 1\n2\n3\n4\n loadScripts(\n ['script-1.js', 'script-2.js', 'script-3.js'], \n (err, results) => out.innerHTML = results.map(s => s.src).join(\"<br/>\")\n )\n \n\n que carga los scripts especificados en el array en secuencia y llama a la callback pasada como último argumento bien con un error si lo hubo o con el array de resultados (los scripts).\n \n \n Escriba su propia versión de la función series (con la misma interfaz que su equivalente de Async.js) que resuelva el problema de la secuencialización de las callbacks:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n series(\n [\n cb => loadScript('script-1.js', cb),\n cb => loadScript('script-2.js', cb),\n cb => loadScript('script-3.js', cb)\n ],\n (err, results) => p.innerHTML = results.map(s => s.src).join(\"<br/>\")\n );\n \n \n \n Deje su solución al reto #number en un fichero reto-#number.html\n \n\n\nObservaciones\n\nSi hace las pruebas de funcionamiento con scripts de similar tamaño la probabilidad de que su algoritmo produzca una salida que respeta el orden especificado es alta, incluso si su algoritmo es erróneo.\n\nPuede simular que los scripts son de distinto tamaño retrasando la iniciación de las cargas con un setTimeout que espere por un número aleatorio de milisegundos:\n\n1\n2\n3\n [~/.../load-script-seq(private)]$ pwd\n/Users/casiano/local/src/javascript/learning/async/load-script-seq\n[~/.../load-script-seq(private)]$ sed -ne '12,23p' load-scripts.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n const ir = (min, max) => Math.round((Math.random() * (max - min) + min))\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n setTimeout(() => script.src = src, ir(500,2000));\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n\nReferencias\n\n\n Repo ULL-ESIT-PL/async-js-series-webpack\n A pure ESM version of Async\n Webpack: Getting started\n Webpack devserver\n\n\nSoluciones\n\n\n Solución\n \n 1\n2\n [~/.../load-script-seq(private)]$ pwd -P\n /Users/casiano/local/src/javascript/learning/async/load-script-seq\n \n \n /Volumes/2020/sytws/sytws2021/p8-t2-async-serialize-12-03-2020-09-16-48/alu0101040882 Daniel Labena\n\n", "url": "/practicas/08p8-t2-async-serialize.html" }, { "title": "09p8 T2 Async Webpack Esmodule", "excerpt": "Descripción de la práctica p8-t2-async-webpack-esmodule\n\n\n Lea el tutorial Getting Started\n\n \n Aplique lo aprendido en el tutorial a la práctica anterior p8-t2-async-serialize para cargar el módulo async.js\n\n 1\n import async from 'async-es';\n \n \n \n Reescriba su solución a la práctica anterior p8-t2-async-serialize en un módulo src/lib/solution.js\n\n 1\n2\n3\n4\n5\n6\n7\n [~/.../async/load-script-seq(private)]$ tree src\n src\n ├── index.js\n └── lib\n └── solution.js\n\n 1 directory, 2 files\n \n que sea usado por index.js\n\n 1\n import { loadScript, loadScripts, mySeries } from \"./lib/solution.js\";\n \n \n Webpack enables use of loaders to preprocess files.\n \n En Webpack cuando estamos aplicando una serie de loaders o de transformaciones a nuestro código, el código generado dista mucho del original: El debugging se convierte en un problema. Para facilitar la depuración es conveniente configurar /webpack.config.js con la opción devtool puesta a eval-cheap-module-source-map\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n + devtool: 'eval-cheap-module-source-map',\n + module: {\n + rules: [\n + {\n + test: /\\.js$/,\n + enforce: 'pre',\n + use: ['source-map-loader'],\n + },\n + ],\n + },\n };\n \n Un source map es una correspondencia que se realiza entre el código original y el código transformado.\n\n Véase source-map-loader\n \n Entregue esta práctica en el mismo repo de la asignación de la práctica anterior p8-t2-async-serialize en una rama p8-t2-async-webpack-esmodule\n\n\nReferencias\n\n\n Repo ULL-ESIT-PL/async-js-series-webpack\n A pure ESM version of Async\n Webpack: Getting started\n Webpack devserver\n Webpack: When To Use And Why\n\n\nSoluciones\n\n\n Solución\n \n 1\n2\n [~/.../load-script-seq(private)]$ pwd -P\n /Users/casiano/local/src/javascript/learning/async/load-script-seq\n \n \n /Volumes/2020/sytws/sytws2021/p8-t2-async-serialize-12-03-2020-09-16-48/alu0101040882 Daniel Labena\n\n", "content": "Descripción de la práctica p8-t2-async-webpack-esmodule\n\n\n Lea el tutorial Getting Started\n\n \n Aplique lo aprendido en el tutorial a la práctica anterior p8-t2-async-serialize para cargar el módulo async.js\n\n 1\n import async from 'async-es';\n \n \n \n Reescriba su solución a la práctica anterior p8-t2-async-serialize en un módulo src/lib/solution.js\n\n 1\n2\n3\n4\n5\n6\n7\n [~/.../async/load-script-seq(private)]$ tree src\n src\n ├── index.js\n └── lib\n └── solution.js\n\n 1 directory, 2 files\n \n que sea usado por index.js\n\n 1\n import { loadScript, loadScripts, mySeries } from \"./lib/solution.js\";\n \n \n Webpack enables use of loaders to preprocess files.\n \n En Webpack cuando estamos aplicando una serie de loaders o de transformaciones a nuestro código, el código generado dista mucho del original: El debugging se convierte en un problema. Para facilitar la depuración es conveniente configurar /webpack.config.js con la opción devtool puesta a eval-cheap-module-source-map\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n + devtool: 'eval-cheap-module-source-map',\n + module: {\n + rules: [\n + {\n + test: /\\.js$/,\n + enforce: 'pre',\n + use: ['source-map-loader'],\n + },\n + ],\n + },\n };\n \n Un source map es una correspondencia que se realiza entre el código original y el código transformado.\n\n Véase source-map-loader\n \n Entregue esta práctica en el mismo repo de la asignación de la práctica anterior p8-t2-async-serialize en una rama p8-t2-async-webpack-esmodule\n\n\nReferencias\n\n\n Repo ULL-ESIT-PL/async-js-series-webpack\n A pure ESM version of Async\n Webpack: Getting started\n Webpack devserver\n Webpack: When To Use And Why\n\n\nSoluciones\n\n\n Solución\n \n 1\n2\n [~/.../load-script-seq(private)]$ pwd -P\n /Users/casiano/local/src/javascript/learning/async/load-script-seq\n \n \n /Volumes/2020/sytws/sytws2021/p8-t2-async-serialize-12-03-2020-09-16-48/alu0101040882 Daniel Labena\n\n", "url": "/practicas/09p8-t2-async-webpack-esmodule.html" }, { "title": "09p9 T2 Promise Readfile", "excerpt": "Descripción de la Práctica p9-t2-promise-readfile\n\nEscriba un programa index.js que contenga una versión con promesas readFilePromise de la función fs.readFile que pueda ser usada así:\n\n1\n2\n3\nreadFilePromise(programName, 'utf8')\n .then(data => console.log('Data:\\n'+data))\n .catch(error => console.log('Error:\\n'+error));\n\n\nSee\n\ntema2-async/practicas/p9-t2-promise-readfile/solution\n", "content": "Descripción de la Práctica p9-t2-promise-readfile\n\nEscriba un programa index.js que contenga una versión con promesas readFilePromise de la función fs.readFile que pueda ser usada así:\n\n1\n2\n3\nreadFilePromise(programName, 'utf8')\n .then(data => console.log('Data:\\n'+data))\n .catch(error => console.log('Error:\\n'+error));\n\n\nSee\n\ntema2-async/practicas/p9-t2-promise-readfile/solution\n", "url": "/practicas/09p9-t2-promise-readfile.html" }, { "title": "10p10 T2 Promise All", "excerpt": "Descripción de la Práctica p10-t2-promise-all\n\nGiven an array of promises, Promise.all returns a promise that waits for all of the promises in the array to finish. \nIt then succeeds, yielding an array of result values. \nIf a promise in the array fails, the promise returned by all fails too, with the failure reason from the failing promise.\n\nImplement something like this yourself as a regular function called Promise_all.\n\nRemember that after a promise has succeeded or failed, \nit can’t succeed or fail again, and further calls to the functions that resolve it are ignored. \nThis can simplify the way you handle failure of your promise.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.all</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n function Promise_all(promises) {\n // Fill the code\n }\n\n // Test code.\n Promise_all([]).then(array => {\n console.log('This should be []:', array);\n });\n\n function soon(val) {\n return new Promise(resolve => {\n setTimeout(() => resolve(val), Math.random() * 500);\n });\n }\n\n Promise_all([soon(1), soon(2), soon(3)]).then(array => {\n console.log('This should be [1, 2, 3]:', array);\n });\n\n Promise_all([soon(5), soon(2), soon(\"a\")]).then(array => {\n console.log('This should be [5, 2, \"a\"]:', array);\n });\n\n Promise_all([soon(1), Promise.reject('X'), soon(3)])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (error === 'X') {\n console.log('Rejection correctly managed!')\n } else\n console.log('Unexpected failure:', error);\n });\n\n Promise_all([\n soon(1),\n new Promise(() => { throw (new Error('Muerto!')) }),\n soon(3)\n ])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (/Muerto!/.test(error.message))\n console.log('Exception correctly managed!:');\n }); \n </script>\n</body>\n</html>\n\n\nHints\n\nThe function passed to the Promise constructor will have to call then on each of the promises in the given array. \nWhen one of them succeeds, two things need to happen. \nThe resulting value needs to be stored in the correct position of a result array, and \nwe must check whether this was the last pending promise and finish our own promise if it was.\n\nThe latter can be done with a counter that is initialized to the length of the input array and from which we subtract 1 every time a promise succeeds. \nWhen it reaches 0, we are done. \nMake sure you take into account the situation where the input array is empty (and thus no promise will ever resolve).\n\nHandling failure requires some thought but turns out to be extremely simple. Just pass the reject function of the wrapping promise to each of the promises in the array as a catch handler or as a second argument to then so that a failure in one of them triggers the rejection of the whole wrapper promise.\n\nSee\n\n\n tema2-async/practicas/p10-t2-promise-all/\n This lab is duplicated at Reto 1: Building Promise.all\n\n\n", "content": "Descripción de la Práctica p10-t2-promise-all\n\nGiven an array of promises, Promise.all returns a promise that waits for all of the promises in the array to finish. \nIt then succeeds, yielding an array of result values. \nIf a promise in the array fails, the promise returned by all fails too, with the failure reason from the failing promise.\n\nImplement something like this yourself as a regular function called Promise_all.\n\nRemember that after a promise has succeeded or failed, \nit can’t succeed or fail again, and further calls to the functions that resolve it are ignored. \nThis can simplify the way you handle failure of your promise.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.all</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n function Promise_all(promises) {\n // Fill the code\n }\n\n // Test code.\n Promise_all([]).then(array => {\n console.log('This should be []:', array);\n });\n\n function soon(val) {\n return new Promise(resolve => {\n setTimeout(() => resolve(val), Math.random() * 500);\n });\n }\n\n Promise_all([soon(1), soon(2), soon(3)]).then(array => {\n console.log('This should be [1, 2, 3]:', array);\n });\n\n Promise_all([soon(5), soon(2), soon(\"a\")]).then(array => {\n console.log('This should be [5, 2, \"a\"]:', array);\n });\n\n Promise_all([soon(1), Promise.reject('X'), soon(3)])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (error === 'X') {\n console.log('Rejection correctly managed!')\n } else\n console.log('Unexpected failure:', error);\n });\n\n Promise_all([\n soon(1),\n new Promise(() => { throw (new Error('Muerto!')) }),\n soon(3)\n ])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (/Muerto!/.test(error.message))\n console.log('Exception correctly managed!:');\n }); \n </script>\n</body>\n</html>\n\n\nHints\n\nThe function passed to the Promise constructor will have to call then on each of the promises in the given array. \nWhen one of them succeeds, two things need to happen. \nThe resulting value needs to be stored in the correct position of a result array, and \nwe must check whether this was the last pending promise and finish our own promise if it was.\n\nThe latter can be done with a counter that is initialized to the length of the input array and from which we subtract 1 every time a promise succeeds. \nWhen it reaches 0, we are done. \nMake sure you take into account the situation where the input array is empty (and thus no promise will ever resolve).\n\nHandling failure requires some thought but turns out to be extremely simple. Just pass the reject function of the wrapping promise to each of the promises in the array as a catch handler or as a second argument to then so that a failure in one of them triggers the rejection of the whole wrapper promise.\n\nSee\n\n\n tema2-async/practicas/p10-t2-promise-all/\n This lab is duplicated at Reto 1: Building Promise.all\n\n\n", "url": "/practicas/10p10-t2-promise-all.html" }, { "title": "13p12 T2 Promise Allsettled", "excerpt": "Descripción de la Práctica p10-t2-promise-allsettled\n\nPromise.all rejects as a whole if any promise rejects. That’s good for all or nothing cases, when we need all results successful to proceed:\n\n1\n2\n3\n4\n5\nPromise.all([\n fetch('/template.html'),\n fetch('/style.css'),\n fetch('/data.json')\n]).then(render); // render method needs results of all fetches\n\n\nPromise.allSettled just waits for all promises to settle, regardless of the result. The resulting array has:\n\n\n {status:\"fulfilled\", value:result} for successful responses,\n {status:\"rejected\", reason:error} for errors.\n\n\nFor example, we’d like to fetch the information about multiple users. Even if one request fails, we’re still interested in the others.\n\nLet’s use Promise.allSettled:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\nlet urls = [\n 'https://api.github.com/users/iliakan',\n 'https://api.github.com/users/remy',\n 'https://no-such-url'\n];\n\nPromise.allSettled(urls.map(url => fetch(url)))\n .then(results => { // (*)\n results.forEach((result, num) => {\n if (result.status == \"fulfilled\") {\n alert(`${urls[num]}: ${result.value.status}`);\n }\n if (result.status == \"rejected\") {\n alert(`${urls[num]}: ${result.reason}`);\n }\n });\n });\n\n\nThe results in the line (*) above will be:\n\n1\n2\n3\n4\n5\n[\n {status: 'fulfilled', value: ...response...},\n {status: 'fulfilled', value: ...response...},\n {status: 'rejected', reason: ...error object...}\n]\n\n\nSo for each promise we get its status and value/error.\n\nWrite a function PromiseAllSettled that works as Promise.allSettled\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.allSettled</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n // ...\n const PromiseAllSettled = function (promises) {\n // ...\n };\n\n let urls = [\n 'https://api.github.com/users/iliakan',\n 'https://api.github.com/users/remy',\n 'https://no-such-url'\n ];\n\n PromiseAllSettled(urls.map(url => fetch(url)))\n .then(results => { // (*)\n results.forEach((result, num) => {\n if (result.status == \"fulfilled\") {\n console.log(`${urls[num]}: ${result.value.status}`);\n }\n if (result.status == \"rejected\") {\n console.log(`Uhm! \"${urls[num]}\" not reachable:\\n${result.reason}`);\n }\n });\n });\n </script>\n</body>\n\n</html>\n\nSee\n\ntema2-async/event-loop/exercises/promises/promise-allsettled/\n", "content": "Descripción de la Práctica p10-t2-promise-allsettled\n\nPromise.all rejects as a whole if any promise rejects. That’s good for all or nothing cases, when we need all results successful to proceed:\n\n1\n2\n3\n4\n5\nPromise.all([\n fetch('/template.html'),\n fetch('/style.css'),\n fetch('/data.json')\n]).then(render); // render method needs results of all fetches\n\n\nPromise.allSettled just waits for all promises to settle, regardless of the result. The resulting array has:\n\n\n {status:\"fulfilled\", value:result} for successful responses,\n {status:\"rejected\", reason:error} for errors.\n\n\nFor example, we’d like to fetch the information about multiple users. Even if one request fails, we’re still interested in the others.\n\nLet’s use Promise.allSettled:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\nlet urls = [\n 'https://api.github.com/users/iliakan',\n 'https://api.github.com/users/remy',\n 'https://no-such-url'\n];\n\nPromise.allSettled(urls.map(url => fetch(url)))\n .then(results => { // (*)\n results.forEach((result, num) => {\n if (result.status == \"fulfilled\") {\n alert(`${urls[num]}: ${result.value.status}`);\n }\n if (result.status == \"rejected\") {\n alert(`${urls[num]}: ${result.reason}`);\n }\n });\n });\n\n\nThe results in the line (*) above will be:\n\n1\n2\n3\n4\n5\n[\n {status: 'fulfilled', value: ...response...},\n {status: 'fulfilled', value: ...response...},\n {status: 'rejected', reason: ...error object...}\n]\n\n\nSo for each promise we get its status and value/error.\n\nWrite a function PromiseAllSettled that works as Promise.allSettled\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.allSettled</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n // ...\n const PromiseAllSettled = function (promises) {\n // ...\n };\n\n let urls = [\n 'https://api.github.com/users/iliakan',\n 'https://api.github.com/users/remy',\n 'https://no-such-url'\n ];\n\n PromiseAllSettled(urls.map(url => fetch(url)))\n .then(results => { // (*)\n results.forEach((result, num) => {\n if (result.status == \"fulfilled\") {\n console.log(`${urls[num]}: ${result.value.status}`);\n }\n if (result.status == \"rejected\") {\n console.log(`Uhm! \"${urls[num]}\" not reachable:\\n${result.reason}`);\n }\n });\n });\n </script>\n</body>\n\n</html>\n\nSee\n\ntema2-async/event-loop/exercises/promises/promise-allsettled/\n", "url": "/practicas/13p12-t2-promise-allsettled.html" }, { "title": "P11 T2 Callback 2 Promise", "excerpt": "Descripción de la Práctica p11-t2-callback-2-promise\n\nPromisification it’s the conversion of a function that accepts a callback into a function returning a promise.\n\nWrite a function promisify(f) that receives a function fthat accepts a callback\n1\nf( ...args, callback)\n\nand returns a function that returns the equivalent Promise object\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promisify</title>\n</head>\n\n<body>\n <script>\n function promisify(f) {\n // Fill the code\n };\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n let loadScriptPromise = promisify(loadScript);\n\n loadScriptPromise(\n \"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\"\n ).then(\n r => alert(\"script loaded\")\n ).catch(alert);\n </script>\n</body>\n\n</html>\n\n\nHint: El operador spread ...\n\nPara resolver este problema debe saber un poco del operador spread ...\n\nEste operador permite convertir un número variable de argumentos de una función en un array que puede ser accedido dentro de la misma:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n [~/.../promises/exception-inside-promise(master)]$ node\n Welcome to Node.js v12.10.0.\n Type \".help\" for more information.\n > ff = (...args) => console.log(args)\n [Function: ff]\n > ff(1,\"hello\", {x:4})\n [ 1, 'hello', { x: 4 } ]\n undefined\n > ff()\n []\n undefined\n\n\nPero también permite la operación inversa: convertir un array en una lista de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> arr = [1,2,3]\n[ 1, 2, 3 ]\n> gg = (x,y,z) => console.log(`x = ${x}, y = ${y}, z = ${z}`)\n[Function: gg]\n> gg(arr)\nx = 1,2,3, y = undefined, z = undefined\nundefined\n> gg(...arr)\nx = 1, y = 2, z = 3\nundefined\n\n\nHint: El Método call\n\nEl método call de los objetos Función llama a una función con un primer argumento que es el this y el resto de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> z = {x:4}\n{ x: 4 }\n> function ff(w) { console.log(this.x+w); }\nundefined\n> ff(2)\nNaN\nundefined\n> ff.call(z, 3)\n7\nundefined\n\n\nSee\n\ntema2-async/event-loop/exercises/promises/promisify/\n", "content": "Descripción de la Práctica p11-t2-callback-2-promise\n\nPromisification it’s the conversion of a function that accepts a callback into a function returning a promise.\n\nWrite a function promisify(f) that receives a function fthat accepts a callback\n1\nf( ...args, callback)\n\nand returns a function that returns the equivalent Promise object\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promisify</title>\n</head>\n\n<body>\n <script>\n function promisify(f) {\n // Fill the code\n };\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n let loadScriptPromise = promisify(loadScript);\n\n loadScriptPromise(\n \"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\"\n ).then(\n r => alert(\"script loaded\")\n ).catch(alert);\n </script>\n</body>\n\n</html>\n\n\nHint: El operador spread ...\n\nPara resolver este problema debe saber un poco del operador spread ...\n\nEste operador permite convertir un número variable de argumentos de una función en un array que puede ser accedido dentro de la misma:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n [~/.../promises/exception-inside-promise(master)]$ node\n Welcome to Node.js v12.10.0.\n Type \".help\" for more information.\n > ff = (...args) => console.log(args)\n [Function: ff]\n > ff(1,\"hello\", {x:4})\n [ 1, 'hello', { x: 4 } ]\n undefined\n > ff()\n []\n undefined\n\n\nPero también permite la operación inversa: convertir un array en una lista de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> arr = [1,2,3]\n[ 1, 2, 3 ]\n> gg = (x,y,z) => console.log(`x = ${x}, y = ${y}, z = ${z}`)\n[Function: gg]\n> gg(arr)\nx = 1,2,3, y = undefined, z = undefined\nundefined\n> gg(...arr)\nx = 1, y = 2, z = 3\nundefined\n\n\nHint: El Método call\n\nEl método call de los objetos Función llama a una función con un primer argumento que es el this y el resto de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> z = {x:4}\n{ x: 4 }\n> function ff(w) { console.log(this.x+w); }\nundefined\n> ff(2)\nNaN\nundefined\n> ff.call(z, 3)\n7\nundefined\n\n\nSee\n\ntema2-async/event-loop/exercises/promises/promisify/\n", "url": "/practicas/p11-t2-callback-2-promise.html" }, { "title": "P14 T2 Async Await", "excerpt": "Descripción de la Práctica p14-t2-async-await\n\nRead chapter Async/Await and make a report using the GitHub Classroom assigned repo. Solve the exercises.\n\nExercise 1: MicroTask and MacroTask Queues\n\nAnswer this question before running the program.\n\nWhat is the output of this program?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nsetTimeout(function () {\n console.log('macrotask 1');\n}, 0);\n\nPromise.resolve().then(function () {\n console.log('microtask 1');\n setTimeout(function () {\n console.log('macrotask 2');\n Promise.resolve().then(\n () => console.log('Nested microtask 3')\n )\n }, 0);\n}).then(function () {\n console.log('microtask 2');\n});\n\n\nExplain the changes in the stack, the running environment, the macrotask queue and the microtask queue. Make pictures of the way the callbacks and handlers go and leave the queues. Take screenshots of them and upload them to the assignment repo\n\n\n Code at: campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/microtask-queue/promise-job-queue-2.js\n\n\nExercise 2: MicroTask and MacroTask Queues\n\nThe following example is taken from a stackoverflow question\n\n\n setTimeout / Promise.resolve: Macrotask vs Microtask\n\n\nDon’t look at the debate yet.\nAlso, try to answer this question before running the code.\n\nWhat is the output of this program?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n// See https://stackoverflow.com/questions/51793906/settimeout-promise-resolve-macrotask-vs-microtask\nfor (let i = 0; i < 2; i++) {\n\tsetTimeout(() => {\n\t\tconsole.log(\"Timeout \", i);\n\t\tPromise.resolve().then(() => {\n\t\t\tconsole.log(\"Promise 1 \", i);\n\t\t}).then(() => {\n\t\t\tconsole.log(\"Promise 2 \", i);\n\t\t});\n\t})\n}\n\n\nExplain the changes in the stack, the running environment, the macrotask queue and the microtask queue. Make pictures of the way the callbacks and handlers go and leave the queues. Take screenshots of them and upload them to the assignment repo\n\n\n Solution at: tema2-async/event-loop/exercises/promises/async-await/stackoverflow-promise-resolve-and-queues.js\n\n\nRewrite a fetch using async/await instead of promises\n\nRewrite this example code from the Javascript.info book using async/await instead of .then/catch:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nfunction loadJson(url) {\n return fetch(url)\n .then(response => {\n if (response.status == 200) {\n return response.json();\n } else {\n throw new Error(response.status);\n }\n });\n}\n\nloadJson('no-such-user.json').catch(console.log); // Error: 404\n\n\n\n Solution at campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await/solution-2-rewrite-loadjson-using-async-await.html\n\n\nSimplify a more complex example with async/await\n\nBelow you can find another exercise from the book javascript.info.\n\nRewrite it using async/await instead of .then/catch and get rid of the recursion in favour of a loop in demoGithubUser: with async/await.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\nclass HttpError extends Error {\n constructor(response) {\n super(`${response.status} for ${response.url}`);\n this.name = 'HttpError';\n this.response = response;\n }\n}\n\nfunction loadJson(url) {\n return fetch(url)\n .then(response => {\n if (response.status == 200) {\n return response.json();\n } else {\n throw new HttpError(response);\n }\n });\n}\n\n// Ask for a user name until github returns a valid user\nfunction demoGithubUser() {\n let name = prompt(\"Enter a name?\", \"iliakan\");\n\n return loadJson(`https://api.github.com/users/${name}`)\n .then(user => {\n alert(`Full name: ${user.name}.`);\n return user;\n })\n .catch(err => {\n if (err instanceof HttpError && err.response.status == 404) {\n alert(\"No such user, please reenter.\");\n return demoGithubUser();\n } else {\n throw err;\n }\n });\n}\n\ndemoGithubUser();\n\n\n\n See Section Custom errors, extending Error. It is worth to read the full chapter Error Handling\n See The Error Class at MDN: The constructor\n \n The GitHub API doc for the end-point to get the public info for an user is here GitHub API REST Docs: Get a User. Here are several examples of how to get the info:\n\n 1\ngh api /users/crguezl | jq .name\n \n\n or with curl\n\n 1\n2\n3\n curl \\\n-H \"Accept: application/vnd.github.v3+json\" \\\nhttps://api.github.com/users/crguezl\n \n\n or using the @octokit/coremodule:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nconst { Octokit } = require(\"@octokit/core\");\n\nconst octokit = new Octokit({ \n // auth: `personal-access-token123` \n});\n\nasync function getUsername(name) {\n return await octokit.request('GET /users/{username}', {\n username: name\n })\n}\n\ngetUsername('crguezl').then(r => console.log(r.data.name));\n \n\n when we run it:\n\n 1\n2\n3\n4\n5\n6\n➜ hello-octokit git:(master) pwd\n/Users/casianorodriguezleon/campus-virtual/2021/learning/octokit-learning/hello-octokit\n➜ hello-octokit git:(master) node --version \nv14.4.0\n➜ hello-octokit git:(master) node octokit-example.js\nCasiano Rodriguez-Leon\n \n \n Solution at /campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await/solution-more-complex-example.html\n\n\nCall async from non-async\n\nHere is another exercise from the JavaScript.Info book. As the book says, it is a task that solves a quite common for developers new to async/await.\n\nWe have a “regular” function called f. How can you call the async function wait() and use its result inside of f?\n\nGive at least two solutions.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\nasync function wait() {\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n return 10;\n}\n\nfunction f() {\n // ...what should you write here?\n // we need to call async wait() and wait to get 10\n // remember, we can't use \"await\"\n}\n\n\n\n Solution at tema2-async/event-loop/exercises/promises/async-await/solution-call-async-from-nonasync.html\n\n\nSee\n\n\n JavaScript.Info book: Bigger example: fetch\n Custom errors, extending Error\n For the solutions:\n \n campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/microtask-queue\n campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await\n \n \n\n\n", "content": "Descripción de la Práctica p14-t2-async-await\n\nRead chapter Async/Await and make a report using the GitHub Classroom assigned repo. Solve the exercises.\n\nExercise 1: MicroTask and MacroTask Queues\n\nAnswer this question before running the program.\n\nWhat is the output of this program?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nsetTimeout(function () {\n console.log('macrotask 1');\n}, 0);\n\nPromise.resolve().then(function () {\n console.log('microtask 1');\n setTimeout(function () {\n console.log('macrotask 2');\n Promise.resolve().then(\n () => console.log('Nested microtask 3')\n )\n }, 0);\n}).then(function () {\n console.log('microtask 2');\n});\n\n\nExplain the changes in the stack, the running environment, the macrotask queue and the microtask queue. Make pictures of the way the callbacks and handlers go and leave the queues. Take screenshots of them and upload them to the assignment repo\n\n\n Code at: campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/microtask-queue/promise-job-queue-2.js\n\n\nExercise 2: MicroTask and MacroTask Queues\n\nThe following example is taken from a stackoverflow question\n\n\n setTimeout / Promise.resolve: Macrotask vs Microtask\n\n\nDon’t look at the debate yet.\nAlso, try to answer this question before running the code.\n\nWhat is the output of this program?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n// See https://stackoverflow.com/questions/51793906/settimeout-promise-resolve-macrotask-vs-microtask\nfor (let i = 0; i < 2; i++) {\n\tsetTimeout(() => {\n\t\tconsole.log(\"Timeout \", i);\n\t\tPromise.resolve().then(() => {\n\t\t\tconsole.log(\"Promise 1 \", i);\n\t\t}).then(() => {\n\t\t\tconsole.log(\"Promise 2 \", i);\n\t\t});\n\t})\n}\n\n\nExplain the changes in the stack, the running environment, the macrotask queue and the microtask queue. Make pictures of the way the callbacks and handlers go and leave the queues. Take screenshots of them and upload them to the assignment repo\n\n\n Solution at: tema2-async/event-loop/exercises/promises/async-await/stackoverflow-promise-resolve-and-queues.js\n\n\nRewrite a fetch using async/await instead of promises\n\nRewrite this example code from the Javascript.info book using async/await instead of .then/catch:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nfunction loadJson(url) {\n return fetch(url)\n .then(response => {\n if (response.status == 200) {\n return response.json();\n } else {\n throw new Error(response.status);\n }\n });\n}\n\nloadJson('no-such-user.json').catch(console.log); // Error: 404\n\n\n\n Solution at campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await/solution-2-rewrite-loadjson-using-async-await.html\n\n\nSimplify a more complex example with async/await\n\nBelow you can find another exercise from the book javascript.info.\n\nRewrite it using async/await instead of .then/catch and get rid of the recursion in favour of a loop in demoGithubUser: with async/await.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\nclass HttpError extends Error {\n constructor(response) {\n super(`${response.status} for ${response.url}`);\n this.name = 'HttpError';\n this.response = response;\n }\n}\n\nfunction loadJson(url) {\n return fetch(url)\n .then(response => {\n if (response.status == 200) {\n return response.json();\n } else {\n throw new HttpError(response);\n }\n });\n}\n\n// Ask for a user name until github returns a valid user\nfunction demoGithubUser() {\n let name = prompt(\"Enter a name?\", \"iliakan\");\n\n return loadJson(`https://api.github.com/users/${name}`)\n .then(user => {\n alert(`Full name: ${user.name}.`);\n return user;\n })\n .catch(err => {\n if (err instanceof HttpError && err.response.status == 404) {\n alert(\"No such user, please reenter.\");\n return demoGithubUser();\n } else {\n throw err;\n }\n });\n}\n\ndemoGithubUser();\n\n\n\n See Section Custom errors, extending Error. It is worth to read the full chapter Error Handling\n See The Error Class at MDN: The constructor\n \n The GitHub API doc for the end-point to get the public info for an user is here GitHub API REST Docs: Get a User. Here are several examples of how to get the info:\n\n 1\ngh api /users/crguezl | jq .name\n \n\n or with curl\n\n 1\n2\n3\n curl \\\n-H \"Accept: application/vnd.github.v3+json\" \\\nhttps://api.github.com/users/crguezl\n \n\n or using the @octokit/coremodule:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nconst { Octokit } = require(\"@octokit/core\");\n\nconst octokit = new Octokit({ \n // auth: `personal-access-token123` \n});\n\nasync function getUsername(name) {\n return await octokit.request('GET /users/{username}', {\n username: name\n })\n}\n\ngetUsername('crguezl').then(r => console.log(r.data.name));\n \n\n when we run it:\n\n 1\n2\n3\n4\n5\n6\n➜ hello-octokit git:(master) pwd\n/Users/casianorodriguezleon/campus-virtual/2021/learning/octokit-learning/hello-octokit\n➜ hello-octokit git:(master) node --version \nv14.4.0\n➜ hello-octokit git:(master) node octokit-example.js\nCasiano Rodriguez-Leon\n \n \n Solution at /campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await/solution-more-complex-example.html\n\n\nCall async from non-async\n\nHere is another exercise from the JavaScript.Info book. As the book says, it is a task that solves a quite common for developers new to async/await.\n\nWe have a “regular” function called f. How can you call the async function wait() and use its result inside of f?\n\nGive at least two solutions.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\nasync function wait() {\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n return 10;\n}\n\nfunction f() {\n // ...what should you write here?\n // we need to call async wait() and wait to get 10\n // remember, we can't use \"await\"\n}\n\n\n\n Solution at tema2-async/event-loop/exercises/promises/async-await/solution-call-async-from-nonasync.html\n\n\nSee\n\n\n JavaScript.Info book: Bigger example: fetch\n Custom errors, extending Error\n For the solutions:\n \n campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/microtask-queue\n campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/promises/async-await\n \n \n\n\n", "url": "/practicas/p14-t2-async-await.html" }, { "title": "P15 T2 Generators", "excerpt": "Descripción de la Práctica p15-t2-generators\n\nDescription\n\nRead the chapter Generators of JavaScript.info reproducing the examples and exercises. Submit a report. Here is an example of how to organize your report:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n➜ learning-generators git:(master) tree \n.\n├── 00-symbol-iterator # For lesson https://javascript.info/iterable\n│ └── hello-symbol-iterator.js\n├── 01-generator-functions # Section \"Generator Functions\"\n│ └── hello-generators.js\n├── 02-generators-are-iterable\n│ ├── hello-generators-2.js\n│ └── spread.js\n├── 03-using-generators-for-iterables\n│ ├── README.md\n│ ├── eloquent-js-6-2-group-with-generators.js\n│ ├── iterator-revisited.js\n│ ├── main-eloquent-js-6-2-group-with-generators.js\n│ └── package.json\n├── 04-generator-composition\n│ └── hello-composition.js\n├── 05-yield-is-a-two-way-street\n│ └── hello-entry-argument.js\n├── 06-yield-is-a-two-way-street\n│ └── hello-entry-argument.js\n├── 07-generator-throw\n│ └── hello-throw.js\n├── 08-tasks-pseudo-random-generator\n│ ├── README.md\n│ ├── package.json\n│ └── solution.js\n├── README.md\n└── package.json\n\n\nSurely you are going to have a look at the chapter Iterables. You can add the examples and exercises of the Iterables chapter at the beginning of the report.\n\nExercise Groups in the book EloquentJS Chapter 6\n\n\n Study and solve the exercise Groups in the book EloquentJS Chapter 6\n Study an solve the Iterable groups extension of the exercise Groups in EloquentJS Chapter 6 making the Group class from the previous exercise iterable\n \n Write the solution as an ES6 module so that can be imported with this syntax:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n #!/usr/bin/env node \n import { Group } from './eloquent-js-6-2-group-with-generators.js';\n\n let group = Group.from([10, 20]);\n console.log(group.has(10));\n // → true\n console.log(group.has(30));\n // → false\n group.add(10);\n group.delete(10);\n console.log(group.has(10));\n // → false\n\n for (let value of Group.from(['a', 'b', 'c'])) {\n console.log(value);\n }\n // → a\n // → b\n // → c\n \n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n \n \n Here is a template for the class Group:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n class Group {\n constructor() {\n // ... your code \n }\n add(elt) {\n // ... your code\n }\n delete(elt) {\n // ... your code \n }\n has(elt) {\n // ... your code\n }\n static from(iterable) {\n // Takes an iterable object as argument and\n // creates a group that contains all the values\n // produced by iterating over it.\n }\n *[Symbol.iterator] () {\n // ... Your code\n }\n }\n\n export { Group };\n \n \n \n Simplify the solution to making the Group class iterable using a generator instead of a plain iterator as suggested in Chapter 11 of the book Eloquent JS\n\n \n Writing iterators is often much easier when you use generator functions. The iterator for the Group class can be written with this generator:\n \n\n 1\n2\n3\n4\n5\n Group.prototype[Symbol.iterator] = function*() {\n for (let i = 0; i < this.members.length; i++) {\n yield this.members[i];\n }\n };\n \n \n\n\nLeave your solution to this exercise inside the folder corresponding to section 03-using-generators-for-iterables\n\nSee\n\n\n ULL-MII-SYTWS-2021/learning-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-generators\n \n \n Chapter Iterables\n Chapter Generators of JavaScript.info\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "content": "Descripción de la Práctica p15-t2-generators\n\nDescription\n\nRead the chapter Generators of JavaScript.info reproducing the examples and exercises. Submit a report. Here is an example of how to organize your report:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n➜ learning-generators git:(master) tree \n.\n├── 00-symbol-iterator # For lesson https://javascript.info/iterable\n│ └── hello-symbol-iterator.js\n├── 01-generator-functions # Section \"Generator Functions\"\n│ └── hello-generators.js\n├── 02-generators-are-iterable\n│ ├── hello-generators-2.js\n│ └── spread.js\n├── 03-using-generators-for-iterables\n│ ├── README.md\n│ ├── eloquent-js-6-2-group-with-generators.js\n│ ├── iterator-revisited.js\n│ ├── main-eloquent-js-6-2-group-with-generators.js\n│ └── package.json\n├── 04-generator-composition\n│ └── hello-composition.js\n├── 05-yield-is-a-two-way-street\n│ └── hello-entry-argument.js\n├── 06-yield-is-a-two-way-street\n│ └── hello-entry-argument.js\n├── 07-generator-throw\n│ └── hello-throw.js\n├── 08-tasks-pseudo-random-generator\n│ ├── README.md\n│ ├── package.json\n│ └── solution.js\n├── README.md\n└── package.json\n\n\nSurely you are going to have a look at the chapter Iterables. You can add the examples and exercises of the Iterables chapter at the beginning of the report.\n\nExercise Groups in the book EloquentJS Chapter 6\n\n\n Study and solve the exercise Groups in the book EloquentJS Chapter 6\n Study an solve the Iterable groups extension of the exercise Groups in EloquentJS Chapter 6 making the Group class from the previous exercise iterable\n \n Write the solution as an ES6 module so that can be imported with this syntax:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n #!/usr/bin/env node \n import { Group } from './eloquent-js-6-2-group-with-generators.js';\n\n let group = Group.from([10, 20]);\n console.log(group.has(10));\n // → true\n console.log(group.has(30));\n // → false\n group.add(10);\n group.delete(10);\n console.log(group.has(10));\n // → false\n\n for (let value of Group.from(['a', 'b', 'c'])) {\n console.log(value);\n }\n // → a\n // → b\n // → c\n \n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n \n \n Here is a template for the class Group:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n class Group {\n constructor() {\n // ... your code \n }\n add(elt) {\n // ... your code\n }\n delete(elt) {\n // ... your code \n }\n has(elt) {\n // ... your code\n }\n static from(iterable) {\n // Takes an iterable object as argument and\n // creates a group that contains all the values\n // produced by iterating over it.\n }\n *[Symbol.iterator] () {\n // ... Your code\n }\n }\n\n export { Group };\n \n \n \n Simplify the solution to making the Group class iterable using a generator instead of a plain iterator as suggested in Chapter 11 of the book Eloquent JS\n\n \n Writing iterators is often much easier when you use generator functions. The iterator for the Group class can be written with this generator:\n \n\n 1\n2\n3\n4\n5\n Group.prototype[Symbol.iterator] = function*() {\n for (let i = 0; i < this.members.length; i++) {\n yield this.members[i];\n }\n };\n \n \n\n\nLeave your solution to this exercise inside the folder corresponding to section 03-using-generators-for-iterables\n\nSee\n\n\n ULL-MII-SYTWS-2021/learning-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-generators\n \n \n Chapter Iterables\n Chapter Generators of JavaScript.info\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "url": "/practicas/p15-t2-generators.html" }, { "title": "P16 T2 Async Await Is Generators And Promises", "excerpt": "Descripción de la Práctica p16-t2-async-await-is-generators-and-promises\n\nGoal: Async-Await ≈ Generators + Promises\n\nImagine we are given a piece of code like the one below that uses async functions, how can we rewrite it using only promises and generator functions?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\nfunction doTask1() {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(1), 100)\n })\n}\n\nfunction doTask2(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+2), 100)\n })\n}\n\nfunction doTask3(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+3), 100)\n })\n}\n\nasync function init() {\n const res1 = await doTask1();\n console.log(res1);\n \n const res2 = await doTask2(res1);\n console.log(res2);\n\n const res3 = await doTask3(res2);\n console.log(res3);\n\n return res3;\n}\n\ninit(); // 1\\n3\\n6\n\n\nIt performs three asynchronous tasks, one after the other where each task depends on the completion of the previous task. Finally, it returns the result of the last task.\n\nHow can we rewrite it using generators?\n\nRemember Generators\n\nRemember:\n\n\n When a generator function is called, its body is not executed right away.\n Instead it returns an iterator-object which adheres to the iterator protocol i.e. it has a next method.\n The only way to execute the body of the generator is by calling the next method on its iterator-object.\n Every time the next method is called, its body is executed until the next yield expression.\n The result of next() is always an object with two properties:\n \n value: the yielded value.\n done: true if the function code has finished, otherwise false\n \n \n This next method also accepts an argument.\n Calling it with an argument\n \n Makes the argumentthe value of the current yield expression and\n Resumes the execution till the next yield expression\n \n \n\n\nFirst Idea: Generators can yield Promises\n\nBy now you would be wondering, how do the generator functions help to achieve our goal?\n\nWe need to model an asynchronous flow where we have to wait for certain tasks to finish before proceeding ahead. How can we do that?\n\nWell, the most important insight here is that the generator-functions can yield promises too.\n\n\n A generator function can yield a promise (for example an async task), and\n its iterator can be controlled to halt for this promise to resolve (or reject), and then\n recursively proceed with the resolved (or rejected) value to ask for the next iteration.\n\n\nRewriting the Async Function as a Generator\n\nThis pattern of weaving a an iterator with yielded promises allows us to model our requirement like this:\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nfunction doTask1(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg), 100)\n })\n}\n\nfunction doTask2(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+2), 100)\n })\n}\n\nfunction doTask3(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+3), 100)\n })\n}\n\nfunction* init(arg) {\n const res1 = yield doTask1(arg);\n console.log(res1);\n \n const res2 = yield doTask2(res1);\n console.log(res2);\n\n const res3 = yield doTask3(res2);\n console.log(res3);\n\n return res3;\n}\n\n\nNotice how this generator function resembles our async function!\n\nIf you change yield for await is the same code!\n\nA Function Controlling the Execution of the Generator\n\nBut this is only half the story. Now we need a way to execute its body.\n\nWe need a function waiter that can control the iterator of this generator function to “wait for the fulfillment of the promise yielded on each iteration”. It has to:\n\n\n Halt every time a promise is yielded and\n Proceeds once the promise resolves (or rejects).\n\n\nWrite the Function Controlling the Execution of the Generator\n\nWrite a function waiter(generator, arg) that creates and iterator by calling generator(arg) and returns a function that traverses the iterator but proceeding with an iteration only when the promise returned by the previous call to iterator.next() has been fulfilled. It will be used like this:\n\n1\n2\n3\n4\n5\n6\nfunction waiter(genFun, arg) {\n // ... your code here\n}\n\nconst doIt = waiter(init, 3);\ndoIt();\n\n\nSo that, when we run it with the generator above, we obtain:\n\n1\n2\n3\n4\n➜ learning-async-iteration-and-generators git:(main) ✗ node 07-async-await-equal-generators-plus-promises/example.js \n3\n5\n8\n\n\nIt sounds complicated, but takes only a few lines to implement.\n\nHeres is a solution\n\nSee\n\n\n Async-Await ≈ Generators + Promises at https://hackernoon.com/ Cha on July 26th 2017\n Solution to this problem\n Repo ULL-MII-SYTWS-2021/async-await-equal-generators-plus-promises (private)\n\n\n", "content": "Descripción de la Práctica p16-t2-async-await-is-generators-and-promises\n\nGoal: Async-Await ≈ Generators + Promises\n\nImagine we are given a piece of code like the one below that uses async functions, how can we rewrite it using only promises and generator functions?\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\nfunction doTask1() {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(1), 100)\n })\n}\n\nfunction doTask2(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+2), 100)\n })\n}\n\nfunction doTask3(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+3), 100)\n })\n}\n\nasync function init() {\n const res1 = await doTask1();\n console.log(res1);\n \n const res2 = await doTask2(res1);\n console.log(res2);\n\n const res3 = await doTask3(res2);\n console.log(res3);\n\n return res3;\n}\n\ninit(); // 1\\n3\\n6\n\n\nIt performs three asynchronous tasks, one after the other where each task depends on the completion of the previous task. Finally, it returns the result of the last task.\n\nHow can we rewrite it using generators?\n\nRemember Generators\n\nRemember:\n\n\n When a generator function is called, its body is not executed right away.\n Instead it returns an iterator-object which adheres to the iterator protocol i.e. it has a next method.\n The only way to execute the body of the generator is by calling the next method on its iterator-object.\n Every time the next method is called, its body is executed until the next yield expression.\n The result of next() is always an object with two properties:\n \n value: the yielded value.\n done: true if the function code has finished, otherwise false\n \n \n This next method also accepts an argument.\n Calling it with an argument\n \n Makes the argumentthe value of the current yield expression and\n Resumes the execution till the next yield expression\n \n \n\n\nFirst Idea: Generators can yield Promises\n\nBy now you would be wondering, how do the generator functions help to achieve our goal?\n\nWe need to model an asynchronous flow where we have to wait for certain tasks to finish before proceeding ahead. How can we do that?\n\nWell, the most important insight here is that the generator-functions can yield promises too.\n\n\n A generator function can yield a promise (for example an async task), and\n its iterator can be controlled to halt for this promise to resolve (or reject), and then\n recursively proceed with the resolved (or rejected) value to ask for the next iteration.\n\n\nRewriting the Async Function as a Generator\n\nThis pattern of weaving a an iterator with yielded promises allows us to model our requirement like this:\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nfunction doTask1(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg), 100)\n })\n}\n\nfunction doTask2(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+2), 100)\n })\n}\n\nfunction doTask3(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+3), 100)\n })\n}\n\nfunction* init(arg) {\n const res1 = yield doTask1(arg);\n console.log(res1);\n \n const res2 = yield doTask2(res1);\n console.log(res2);\n\n const res3 = yield doTask3(res2);\n console.log(res3);\n\n return res3;\n}\n\n\nNotice how this generator function resembles our async function!\n\nIf you change yield for await is the same code!\n\nA Function Controlling the Execution of the Generator\n\nBut this is only half the story. Now we need a way to execute its body.\n\nWe need a function waiter that can control the iterator of this generator function to “wait for the fulfillment of the promise yielded on each iteration”. It has to:\n\n\n Halt every time a promise is yielded and\n Proceeds once the promise resolves (or rejects).\n\n\nWrite the Function Controlling the Execution of the Generator\n\nWrite a function waiter(generator, arg) that creates and iterator by calling generator(arg) and returns a function that traverses the iterator but proceeding with an iteration only when the promise returned by the previous call to iterator.next() has been fulfilled. It will be used like this:\n\n1\n2\n3\n4\n5\n6\nfunction waiter(genFun, arg) {\n // ... your code here\n}\n\nconst doIt = waiter(init, 3);\ndoIt();\n\n\nSo that, when we run it with the generator above, we obtain:\n\n1\n2\n3\n4\n➜ learning-async-iteration-and-generators git:(main) ✗ node 07-async-await-equal-generators-plus-promises/example.js \n3\n5\n8\n\n\nIt sounds complicated, but takes only a few lines to implement.\n\nHeres is a solution\n\nSee\n\n\n Async-Await ≈ Generators + Promises at https://hackernoon.com/ Cha on July 26th 2017\n Solution to this problem\n Repo ULL-MII-SYTWS-2021/async-await-equal-generators-plus-promises (private)\n\n\n", "url": "/practicas/p16-t2-async-await-is-generators-and-promises.html" }, { "title": "P17 T2 Async Iteration And Generators", "excerpt": "Descripción de la Práctica p17-t2-async-iteration-and-generators\n\nDescription\n\nRead the chapter Async iteration and generators of JavaScript.info reproducing the examples and exercises. Submit a report. Here is an example of how to organize your report:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n➜ learning-async-iteration-and-generators git:(main) tree -I node_modules\n.\n├── 01-recall-iterators\n│ ├── README.md\n│ └── hello-simple-iterator.js\n├── 02-async-iterables\n│ ├── README.md\n│ ├── hello-async-iterables-2.js\n│ └── hello-async-iterables.js\n├── 03-recall-generators\n│ └── README.md\n├── 04-async-generators-finally\n│ ├── README.md\n│ ├── for-await-with-sync.js\n│ ├── hello-async-generator-2.js\n│ ├── hello-async-generator-3.js\n│ ├── hello-async-generator.js\n│ └── hello-async-iterable-range.js\n├── 05-real-life-example-paginated-data\n│ ├── README.md\n│ ├── get-link-example.js\n│ ├── package-lock.json\n│ ├── package.json\n│ └── real-life-example.js\n├── 06-all-vs-for-await-performance\n│ ├── README.md\n│ └── all-vs-for-await-performance.js\n├── README.md\n└── package.json\n\n\nCompare the Performance of Promise.all and for-await-of\n\nAdd a section and the corresponding code to compare the performance of \nfor-await-of with Promise.all when given an array of promises.\nConsider both cases: when a rejection or an error occurs and when all the promises are fulfilled\n\nSee\n\n\n ULL-MII-SYTWS-2021/learning-async-iteration-and-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-async-iteration-and-generators\n \n \n Chapter Async iteration and generators\n Chapter Iterables\n Chapter Generators of JavaScript.info\n\n\nES6 Modules in Node.JS\n\n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "content": "Descripción de la Práctica p17-t2-async-iteration-and-generators\n\nDescription\n\nRead the chapter Async iteration and generators of JavaScript.info reproducing the examples and exercises. Submit a report. Here is an example of how to organize your report:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n➜ learning-async-iteration-and-generators git:(main) tree -I node_modules\n.\n├── 01-recall-iterators\n│ ├── README.md\n│ └── hello-simple-iterator.js\n├── 02-async-iterables\n│ ├── README.md\n│ ├── hello-async-iterables-2.js\n│ └── hello-async-iterables.js\n├── 03-recall-generators\n│ └── README.md\n├── 04-async-generators-finally\n│ ├── README.md\n│ ├── for-await-with-sync.js\n│ ├── hello-async-generator-2.js\n│ ├── hello-async-generator-3.js\n│ ├── hello-async-generator.js\n│ └── hello-async-iterable-range.js\n├── 05-real-life-example-paginated-data\n│ ├── README.md\n│ ├── get-link-example.js\n│ ├── package-lock.json\n│ ├── package.json\n│ └── real-life-example.js\n├── 06-all-vs-for-await-performance\n│ ├── README.md\n│ └── all-vs-for-await-performance.js\n├── README.md\n└── package.json\n\n\nCompare the Performance of Promise.all and for-await-of\n\nAdd a section and the corresponding code to compare the performance of \nfor-await-of with Promise.all when given an array of promises.\nConsider both cases: when a rejection or an error occurs and when all the promises are fulfilled\n\nSee\n\n\n ULL-MII-SYTWS-2021/learning-async-iteration-and-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-async-iteration-and-generators\n \n \n Chapter Async iteration and generators\n Chapter Iterables\n Chapter Generators of JavaScript.info\n\n\nES6 Modules in Node.JS\n\n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "url": "/practicas/p17-t2-async-iteration-and-generators.html" }, { "title": "P18 T2 First Come First Served For Await", "excerpt": "Descripción de la Práctica p18-t2-first-come-first-served-for-await.md\n\nIf you use for-await-of on an array of promises, you iterate over it in the specified order, doesn’t matter if the next promise in the given array is resolved before the previous one:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\nconst sleep = time => new Promise(resolve => setTimeout(resolve, time));\n\n(async function () {\n const arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => 'c'),\n 'z',\n ];\n\n for await (const item of arr) {\n console.log(item);\n }\n}());\n\n\nOutput:\n\n1\n2\n3\n4\n5\n6\n7\n➜ firstcomefirstserved git:(main) node examples/for-await-simple.js \na\nx\nb\ny\nc\nz\n\n\nBut sometimes you want to process the results as soon as the promises yield them.\n\nWrite a Node.JS module frstcmfrstsvd that exports an async generator that can be used with for-await-of and provides the results in a first come first served order:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n\nimport firstComeFirstServed from 'frstcmfrstsvd';\n\n// See https://stackoverflow.com/questions/40920179/should-i-refrain-from-handling-promise-rejection-asynchronously\nprocess.on('rejectionHandled', () => { });\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection');\n});\n\nconst sleep = time => new Promise(resolve => setTimeout(resolve, time));\n\nconst arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => 'c'),\n 'z',\n];\n\nconsole.log(firstComeFirstServed);\n\n(async () => {\n for await (let item of firstComeFirstServed(arr)) {\n console.log(\"item = \",item);\n }\n})()\n\n\nOutput:\n\n1\n2\n3\n4\n5\n6\n7\n8\n➜ firstcomefirstserved git:(main) node examples/hello-frstcmfrstsvd.mjs \n[AsyncGeneratorFunction: frstcmfrstsvd]\nitem = { value: 'x', index: 1, status: 'fulfilled' }\nitem = { value: 'y', index: 3, status: 'fulfilled' }\nitem = { value: 'z', index: 5, status: 'fulfilled' }\nitem = { value: 'b', index: 2, status: 'fulfilled' }\nitem = { value: 'a', index: 0, status: 'fulfilled' }\nitem = { value: 'c', index: 4, status: 'fulfilled' }\n\n\nError Management Example\n\nHere is an example of how has to behave when there are rejections:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n\nimport frstcmfrstsvd from 'frstcmfrstsvd';\n\n// See https://stackoverflow.com/questions/40920179/should-i-refrain-from-handling-promise-rejection-asynchronously\nprocess.on('rejectionHandled', () => { });\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection');\n});\n\nconst sleep = time => \n new Promise(resolve => setTimeout(resolve, time));\n\nconst arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => { throw `Ohhh:\\n` }),\n 'z',\n];\n\n(async () => {\n try {\n for await (let item of frstcmfrstsvd(arr)) {\n console.log(\"item = \",item);\n }\n } catch(e) {\n console.log('Catched!:\\n', e);\n }\n\n})()\n\n\nGives as output:\n\n1\n2\n3\n4\n5\n6\n7\n➜ firstcomefirstserved git:(main) ✗ node examples/reject-frstcmfrstsvd.mjs \nitem = { value: 'x', index: 1, status: 'fulfilled' }\nitem = { value: 'y', index: 3, status: 'fulfilled' }\nitem = { value: 'z', index: 5, status: 'fulfilled' }\nitem = { value: 'b', index: 2, status: 'fulfilled' }\nitem = { value: 'a', index: 0, status: 'fulfilled' }\nitem = { reason: 'Ohhh:\\n', index: 4, status: 'rejected' }\n\n\nCompare the Performance of your solution with the performance of allSettled\n\nWrite a program to compare the performance of your solution with the performance of Promise.allSettled.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n ➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 320.399ms\nallsettled: 329.469ms\n➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 323.915ms\nallsettled: 331.516ms\n➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 324.116ms\nallsettled: 331.935ms\n\n\nSee\n\n\n Here is a solution. Don’t look at it unless you are blocked\n ULL-MII-SYTWS-2021/learning-async-iteration-and-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-async-iteration-and-generators\n \n \n Chapter Async iteration and generators\n Chapter Iterables\n Chapter Generators of JavaScript.info\n\n\nES6 Modules in Node.JS\n\n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "content": "Descripción de la Práctica p18-t2-first-come-first-served-for-await.md\n\nIf you use for-await-of on an array of promises, you iterate over it in the specified order, doesn’t matter if the next promise in the given array is resolved before the previous one:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\nconst sleep = time => new Promise(resolve => setTimeout(resolve, time));\n\n(async function () {\n const arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => 'c'),\n 'z',\n ];\n\n for await (const item of arr) {\n console.log(item);\n }\n}());\n\n\nOutput:\n\n1\n2\n3\n4\n5\n6\n7\n➜ firstcomefirstserved git:(main) node examples/for-await-simple.js \na\nx\nb\ny\nc\nz\n\n\nBut sometimes you want to process the results as soon as the promises yield them.\n\nWrite a Node.JS module frstcmfrstsvd that exports an async generator that can be used with for-await-of and provides the results in a first come first served order:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n\nimport firstComeFirstServed from 'frstcmfrstsvd';\n\n// See https://stackoverflow.com/questions/40920179/should-i-refrain-from-handling-promise-rejection-asynchronously\nprocess.on('rejectionHandled', () => { });\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection');\n});\n\nconst sleep = time => new Promise(resolve => setTimeout(resolve, time));\n\nconst arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => 'c'),\n 'z',\n];\n\nconsole.log(firstComeFirstServed);\n\n(async () => {\n for await (let item of firstComeFirstServed(arr)) {\n console.log(\"item = \",item);\n }\n})()\n\n\nOutput:\n\n1\n2\n3\n4\n5\n6\n7\n8\n➜ firstcomefirstserved git:(main) node examples/hello-frstcmfrstsvd.mjs \n[AsyncGeneratorFunction: frstcmfrstsvd]\nitem = { value: 'x', index: 1, status: 'fulfilled' }\nitem = { value: 'y', index: 3, status: 'fulfilled' }\nitem = { value: 'z', index: 5, status: 'fulfilled' }\nitem = { value: 'b', index: 2, status: 'fulfilled' }\nitem = { value: 'a', index: 0, status: 'fulfilled' }\nitem = { value: 'c', index: 4, status: 'fulfilled' }\n\n\nError Management Example\n\nHere is an example of how has to behave when there are rejections:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n\nimport frstcmfrstsvd from 'frstcmfrstsvd';\n\n// See https://stackoverflow.com/questions/40920179/should-i-refrain-from-handling-promise-rejection-asynchronously\nprocess.on('rejectionHandled', () => { });\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection');\n});\n\nconst sleep = time => \n new Promise(resolve => setTimeout(resolve, time));\n\nconst arr = [\n sleep(2000).then(() => 'a'),\n 'x',\n sleep(1000).then(() => 'b'),\n 'y',\n sleep(3000).then(() => { throw `Ohhh:\\n` }),\n 'z',\n];\n\n(async () => {\n try {\n for await (let item of frstcmfrstsvd(arr)) {\n console.log(\"item = \",item);\n }\n } catch(e) {\n console.log('Catched!:\\n', e);\n }\n\n})()\n\n\nGives as output:\n\n1\n2\n3\n4\n5\n6\n7\n➜ firstcomefirstserved git:(main) ✗ node examples/reject-frstcmfrstsvd.mjs \nitem = { value: 'x', index: 1, status: 'fulfilled' }\nitem = { value: 'y', index: 3, status: 'fulfilled' }\nitem = { value: 'z', index: 5, status: 'fulfilled' }\nitem = { value: 'b', index: 2, status: 'fulfilled' }\nitem = { value: 'a', index: 0, status: 'fulfilled' }\nitem = { reason: 'Ohhh:\\n', index: 4, status: 'rejected' }\n\n\nCompare the Performance of your solution with the performance of allSettled\n\nWrite a program to compare the performance of your solution with the performance of Promise.allSettled.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n ➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 320.399ms\nallsettled: 329.469ms\n➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 323.915ms\nallsettled: 331.516ms\n➜ firstcomefirstserved git:(main) ✗ node examples/performance-reject-frstcmfrstsvd.mjs\nfrstcmfrstsvd: 324.116ms\nallsettled: 331.935ms\n\n\nSee\n\n\n Here is a solution. Don’t look at it unless you are blocked\n ULL-MII-SYTWS-2021/learning-async-iteration-and-generators (Private)\n \n campus-virtual/2021/learning/asyncjs-learning/learning-async-iteration-and-generators\n \n \n Chapter Async iteration and generators\n Chapter Iterables\n Chapter Generators of JavaScript.info\n\n\nES6 Modules in Node.JS\n\n\n See the Node.js doc Modules: Packages for more details on the use of ECMA 6 Modules in Node.js.\n How Can I use en es6 Import in Node.JS Stackoverflow\n\n", "url": "/practicas/p18-t2-first-come-first-served-for-await.html" }, { "title": "05p4 T2 Networking", "excerpt": "Práctica p4-t2-networking\n\n\n Lea el Capítulo 3 “Networking with Sockets” de Node.js 8 the Right Way y resuelva los problemas en la secciónes Testability y Robustness\n\n\nTestability exercises\n\n\n Add a unit test for a single message that is split over two or more data events from the stream\n Add a unit test that passes in null to the LDJClient constructor, and asserts that an error is thrown\n Then make the test pass by modifying the constructor to accept null: the semantic being that the created stream behaves as /dev/null in Unix. See npm package dev-null\n\n\nRobustness exercises\n\n\n The LDJClient already handles the case in which a properly formatted JSON string is split over multiply lines. What happen if the incoming data is not a properly formatted JSON string?\n Write a test case that sends a data event that is not JSON. What do you think on how to manage this case?\n What happens if the last data event completes a a JSON message, but without the trailing new line?\n Write a case where the stream object sends a data event containing JSON but no newline, followed by a close event. How will you manage this case?\n Should LDJClient emit a close event for its listeners?\n\n\nRequirements\n\n\n Añadan pruebas\n Añada documentación\n Añada Integración Contínua usando Travis (Haga un badge en su README.md) o bien use GitHub Actions\n Use Jekyll y GitHub Pages para desplegar su informe de práctica\n Añada un gulpfile.js para facilitar la ejecución de las tareas\n\n\nRecursos\n\nNode.js the Right Way book\n\n\n BULL PuntoQ\n Node.js 8 the Right Way\n Book “Node.js 8 the Right Way” 2018 Edition. Google Books\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (private repo)\n\n\nUPM MOOC on Node.JS\n\n\n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP:\n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP\n \n \n\n\nNet module\n\n\n createServer\n\n\nGulp\n\n\n Véase la sección Gulp de los apuntes\n gulp quick start\n gulp getting started\n\n\nGitHub Actions\n\n\n GitHub Actions\n\n\nCI and Travis\n\n\n Apuntes de Travis\n Viejos apuntes de Travis 16/17\n\n\nDocumentación\n\n\n documentation.js,\n jsdoc,\n docco\n\n\nPruebas\n\n\n Apuntes: Sección pruebas\n Mocha\n chai\n\n\nRecursos para el profesor\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (private repo)\n \n Paths related:\n 1\n2\n3\n4\n\n[~/sol-nodejs-the-right-way/networking-with-sockets-chapter-3(master)]$ pwd -P\n/Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3\n\n \n \n \n \n sol-c (private repo)\n \n See the branch chapter3-exercises\n \n \n Sol -ai (private repo)\n\n", "content": "Práctica p4-t2-networking\n\n\n Lea el Capítulo 3 “Networking with Sockets” de Node.js 8 the Right Way y resuelva los problemas en la secciónes Testability y Robustness\n\n\nTestability exercises\n\n\n Add a unit test for a single message that is split over two or more data events from the stream\n Add a unit test that passes in null to the LDJClient constructor, and asserts that an error is thrown\n Then make the test pass by modifying the constructor to accept null: the semantic being that the created stream behaves as /dev/null in Unix. See npm package dev-null\n\n\nRobustness exercises\n\n\n The LDJClient already handles the case in which a properly formatted JSON string is split over multiply lines. What happen if the incoming data is not a properly formatted JSON string?\n Write a test case that sends a data event that is not JSON. What do you think on how to manage this case?\n What happens if the last data event completes a a JSON message, but without the trailing new line?\n Write a case where the stream object sends a data event containing JSON but no newline, followed by a close event. How will you manage this case?\n Should LDJClient emit a close event for its listeners?\n\n\nRequirements\n\n\n Añadan pruebas\n Añada documentación\n Añada Integración Contínua usando Travis (Haga un badge en su README.md) o bien use GitHub Actions\n Use Jekyll y GitHub Pages para desplegar su informe de práctica\n Añada un gulpfile.js para facilitar la ejecución de las tareas\n\n\nRecursos\n\nNode.js the Right Way book\n\n\n BULL PuntoQ\n Node.js 8 the Right Way\n Book “Node.js 8 the Right Way” 2018 Edition. Google Books\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (private repo)\n\n\nUPM MOOC on Node.JS\n\n\n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP:\n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP\n \n \n\n\nNet module\n\n\n createServer\n\n\nGulp\n\n\n Véase la sección Gulp de los apuntes\n gulp quick start\n gulp getting started\n\n\nGitHub Actions\n\n\n GitHub Actions\n\n\nCI and Travis\n\n\n Apuntes de Travis\n Viejos apuntes de Travis 16/17\n\n\nDocumentación\n\n\n documentation.js,\n jsdoc,\n docco\n\n\nPruebas\n\n\n Apuntes: Sección pruebas\n Mocha\n chai\n\n\nRecursos para el profesor\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way (private repo)\n \n Paths related:\n 1\n2\n3\n4\n\n[~/sol-nodejs-the-right-way/networking-with-sockets-chapter-3(master)]$ pwd -P\n/Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3\n\n \n \n \n \n sol-c (private repo)\n \n See the branch chapter3-exercises\n \n \n Sol -ai (private repo)\n\n\n", "url": "/practicas/05p4-t2-networking.html" }, { "title": "06p5 T3 Websockets", "excerpt": "Práctica p5-t3-websockets\n\nLea el capítulo WebSocket del libro The Modern JavaScript Tutorial y haga un resumen de lo aprendido.\n\nEstudie también y desarrolle el ejemplo explicado en:\n\n\n Build a simple chat app with node.js and socket.io By Noufel Gouirhate Dec 24, 2017 Medium.com\n \n Puede encontrar el código en este Repo ULL-ESIT-DSI-1819/simpleChatApp\n \n \n Despliegue la aplicación en Heroku y en iaas.ull.es\n \n Para el despliegue en Heroku deberá leer el artículo: Using WebSockets on Heroku with Node.js\n Repo ULL-ESIT-DSI-1819/websocket-socket-io-heroku\n \n Aquí es esencial habilitar session affinity:\n\n 1\n2\n[~/local/src/javascript/learning/websockets/websockets-heroku-socket-io(master)]$ heroku features:enable http-session-affinity\nEnabling http-session-affinity for ⬢ dsi-socket-io-example... done\n \n\n Session affinity, sometimes referred to as sticky sessions, is a platform feature that associates all HTTP requests coming from an end-user with a single application instance (web dyno).\n \n Repo ULL-ESIT-DSI-1819/websocket-ws-heroku\n \n \n\n\nReto 1 para la práctica p5-t3-websockets\n\n\n Add {user} is typing … functionality.\n\n\n\n\nTip: Decida en que lugar del documento saldrá el mensaje ... is typing\n\nEn el HTML, deberá decidir donde va a aparecer el mensaje de feedback indicando que un usuario\nesta tecleando y añadirle un id. Por ejemplo:\n\n1\n<div id=\"feedback\"></div>\n\n\nTip: Como escuchar por las pulsaciones de teclas\n\nLe puede ayudar añadir en el código del cliente una llamada a el método addEventListener:\n\n1\ntarget.addEventListener(tipo, listener);\n\n\n\n tipo: Una cadena representando el tipo de evento a escuchar.\n \n The keydown event is fired when a key is pressed down.\n Unlike the keypress event, the keydown:w\n event is fired for all keys, regardless of whether they produce a character value.\n \n \n listener: normalmente la function que será llamada cuando ocurre el evento tipo sobre el elemento del DOM representado por target. En este caso el código de listener deberá emitir un mensaje indicando que el usuario esta tecleando.\n El server debería recoger el mensaje y hacer un broadcast del mismo al resto de clientes conectados\n\n\nReto 2 para la práctica p5-t3-websockets\n\n\n Añáda rooms a su chat. Establezca dos rooms llamadas practicas y ocio\n\n\nVea los ejemplos en ULL-ESIT-DSI-1819/socket-io-namespaces\ny lea la sección Namespaces de la documentación de Socket.io\n\nPuede hacer este ejercicio usando namespaces o rooms.\n\nUsando namespaces\n\nEn el directorio ns tiene un ejemplo de como usar namespaces:\n\nFichero ns/index.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\nconst path = require('path');\nconst express = require('express');\nconst app = express();\nconst http = require('http').Server(app);\nconst io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:namespace', function(req, res) {\n res.render('space', { space: req.params.namespace});\n});\n\nfunction welcome(nsp, socket, spaceName) {\n console.log('someone connected to '+spaceName);\n socket.emit('hi', `Welcome client '${socket.id}' to ${spaceName}!`);\n nsp.emit('hi', `Client '${socket.id}' joined ${spaceName}!`);\n}\n\nconst nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n welcome(nsp, socket, '/my-namespace');\n});\n\nconst nsp2 = io.of('/your-namespace');\nnsp2.on('connection', function(socket) {\n welcome(nsp2, socket, '/your-namespace');\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero ns/public/index.html\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/my-namespace\">my-namespace</a></li>\n <li><a href=\"/your-namespace\">your-namespace</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero ns/views/space.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src=\"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/<%- space %>');\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n\nUsando rooms\n\nFichero rooms/index.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nvar path = require('path');\nvar express = require('express');\nvar app = express();\nvar http = require('http').Server(app);\nvar io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:room', function(req, res) {\n res.render('room', { room: req.params.room});\n});\n\nvar nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n socket.emit('hi', `Welcome client '${socket.id}' to my-namespace!`);\n socket.on('join', function(room) {\n console.log(\"room = \"+room);\n socket.join(room);\n nsp.to(room).emit('hi', socket.id+' joined room \"'+room+'\"');\n });\n console.log('someone connected: '+socket.id);\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero rooms/public/index.html:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/room-1\">room-1</a></li>\n <li><a href=\"/room-2\">room-2</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero rooms/views/room.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src = \"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/my-namespace');\n\n socket.emit('join', '<%- room %>');\n\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n\nRecursos\n\n\n Capítulo WebSocket del libro The Modern JavaScript Tutorial\n WebSockets\n \n Socket.io\n \n Socket.io Guide: a chat\n \n Associated Repo\n \n \n Docs\n \n Namespaces\n \n \n \n \n Chats\n \n Build a simple chat app with node.js and socket.io - By Noufel Gouirhate Dec 24, 2017 Medium.com\n \n Repo ULL-ESIT-DSI-1819/simpleChatApp\n \n \n Web Sockets (Node.js and Socket.io Chat App) in the Net Ninja Youtube Channel\n \n Repo ULL-ESIT-DSI-1819/websockets-playlist\n \n \n Introduction to Socket.io by Udara Bibile at Medium.com\n \n \n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App\n \n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 1\n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 2\n Corresponding repo at GitHub\n \n \n Real Time Slide Presentation\n \n Real-time Presentation Slides with Socket.io, Node.js and Javascript by Nafeu Nasir at Medium.com\n \n Repo ULL-ESIT-DSI-1819/realtime-slides-tut.git\n Real-time Slides Demonstration YouTube\n \n \n Synchronizing HTML5 slides with Node.js by Tim Branyen\n \n \n Libros\n \n Socket.IO Real-time Web Application Development By: Rohit Rai book at PuntoQ ULL\n \n Repo con soluciones al libro\n \n \n \n \n \n \n Programación Web\n \n Express\n \n Apuntes de Express 1617\n \n \n ejs\n Despliegues\n \n Como Desplegar una Aplicación Web en iaas.ull.es\n Apuntes de Heroku\n Para el despliegue en Heroku deberá leer el artículo: Using WebSockets on Heroku with Node.js\n Repo ULL-ESIT-DSI-1819/websocket-socket-io-heroku\n \n Aquí es esencial habilitar session affinity:\n\n 1\n2\n[~/local/src/javascript/learning/websockets/websockets-heroku-socket-io(master)]$ heroku features:enable http-session-affinity\nEnabling http-session-affinity for ⬢ dsi-socket-io-example... done\n \n\n Session affinity, sometimes referred to as sticky sessions, is a platform feature that associates all HTTP requests coming from an end-user with a single application instance (web dyno).\n \n \n \n Webpack\n \n Webpack guide: “getting started”\n Youtube video Webpack 4 por Fatz\n \n \n \n \n\n\n", "content": "Práctica p5-t3-websockets\n\nLea el capítulo WebSocket del libro The Modern JavaScript Tutorial y haga un resumen de lo aprendido.\n\nEstudie también y desarrolle el ejemplo explicado en:\n\n\n Build a simple chat app with node.js and socket.io By Noufel Gouirhate Dec 24, 2017 Medium.com\n \n Puede encontrar el código en este Repo ULL-ESIT-DSI-1819/simpleChatApp\n \n \n Despliegue la aplicación en Heroku y en iaas.ull.es\n \n Para el despliegue en Heroku deberá leer el artículo: Using WebSockets on Heroku with Node.js\n Repo ULL-ESIT-DSI-1819/websocket-socket-io-heroku\n \n Aquí es esencial habilitar session affinity:\n\n 1\n2\n[~/local/src/javascript/learning/websockets/websockets-heroku-socket-io(master)]$ heroku features:enable http-session-affinity\nEnabling http-session-affinity for ⬢ dsi-socket-io-example... done\n \n\n Session affinity, sometimes referred to as sticky sessions, is a platform feature that associates all HTTP requests coming from an end-user with a single application instance (web dyno).\n \n Repo ULL-ESIT-DSI-1819/websocket-ws-heroku\n \n \n\n\nReto 1 para la práctica p5-t3-websockets\n\n\n Add {user} is typing … functionality.\n\n\n\n\nTip: Decida en que lugar del documento saldrá el mensaje ... is typing\n\nEn el HTML, deberá decidir donde va a aparecer el mensaje de feedback indicando que un usuario\nesta tecleando y añadirle un id. Por ejemplo:\n\n1\n<div id=\"feedback\"></div>\n\n\nTip: Como escuchar por las pulsaciones de teclas\n\nLe puede ayudar añadir en el código del cliente una llamada a el método addEventListener:\n\n1\ntarget.addEventListener(tipo, listener);\n\n\n\n tipo: Una cadena representando el tipo de evento a escuchar.\n \n The keydown event is fired when a key is pressed down.\n Unlike the keypress event, the keydown:w\n event is fired for all keys, regardless of whether they produce a character value.\n \n \n listener: normalmente la function que será llamada cuando ocurre el evento tipo sobre el elemento del DOM representado por target. En este caso el código de listener deberá emitir un mensaje indicando que el usuario esta tecleando.\n El server debería recoger el mensaje y hacer un broadcast del mismo al resto de clientes conectados\n\n\nReto 2 para la práctica p5-t3-websockets\n\n\n Añáda rooms a su chat. Establezca dos rooms llamadas practicas y ocio\n\n\nVea los ejemplos en ULL-ESIT-DSI-1819/socket-io-namespaces\ny lea la sección Namespaces de la documentación de Socket.io\n\nPuede hacer este ejercicio usando namespaces o rooms.\n\nUsando namespaces\n\nEn el directorio ns tiene un ejemplo de como usar namespaces:\n\nFichero ns/index.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\nconst path = require('path');\nconst express = require('express');\nconst app = express();\nconst http = require('http').Server(app);\nconst io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:namespace', function(req, res) {\n res.render('space', { space: req.params.namespace});\n});\n\nfunction welcome(nsp, socket, spaceName) {\n console.log('someone connected to '+spaceName);\n socket.emit('hi', `Welcome client '${socket.id}' to ${spaceName}!`);\n nsp.emit('hi', `Client '${socket.id}' joined ${spaceName}!`);\n}\n\nconst nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n welcome(nsp, socket, '/my-namespace');\n});\n\nconst nsp2 = io.of('/your-namespace');\nnsp2.on('connection', function(socket) {\n welcome(nsp2, socket, '/your-namespace');\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero ns/public/index.html\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/my-namespace\">my-namespace</a></li>\n <li><a href=\"/your-namespace\">your-namespace</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero ns/views/space.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src=\"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/<%- space %>');\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n\nUsando rooms\n\nFichero rooms/index.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nvar path = require('path');\nvar express = require('express');\nvar app = express();\nvar http = require('http').Server(app);\nvar io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:room', function(req, res) {\n res.render('room', { room: req.params.room});\n});\n\nvar nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n socket.emit('hi', `Welcome client '${socket.id}' to my-namespace!`);\n socket.on('join', function(room) {\n console.log(\"room = \"+room);\n socket.join(room);\n nsp.to(room).emit('hi', socket.id+' joined room \"'+room+'\"');\n });\n console.log('someone connected: '+socket.id);\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero rooms/public/index.html:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/room-1\">room-1</a></li>\n <li><a href=\"/room-2\">room-2</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero rooms/views/room.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src = \"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/my-namespace');\n\n socket.emit('join', '<%- room %>');\n\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n\nRecursos\n\n\n Capítulo WebSocket del libro The Modern JavaScript Tutorial\n WebSockets\n \n Socket.io\n \n Socket.io Guide: a chat\n \n Associated Repo\n \n \n Docs\n \n Namespaces\n \n \n \n \n Chats\n \n Build a simple chat app with node.js and socket.io - By Noufel Gouirhate Dec 24, 2017 Medium.com\n \n Repo ULL-ESIT-DSI-1819/simpleChatApp\n \n \n Web Sockets (Node.js and Socket.io Chat App) in the Net Ninja Youtube Channel\n \n Repo ULL-ESIT-DSI-1819/websockets-playlist\n \n \n Introduction to Socket.io by Udara Bibile at Medium.com\n \n \n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App\n \n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 1\n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 2\n Corresponding repo at GitHub\n \n \n Real Time Slide Presentation\n \n Real-time Presentation Slides with Socket.io, Node.js and Javascript by Nafeu Nasir at Medium.com\n \n Repo ULL-ESIT-DSI-1819/realtime-slides-tut.git\n Real-time Slides Demonstration YouTube\n \n \n Synchronizing HTML5 slides with Node.js by Tim Branyen\n \n \n Libros\n \n Socket.IO Real-time Web Application Development By: Rohit Rai book at PuntoQ ULL\n \n Repo con soluciones al libro\n \n \n \n \n \n \n Programación Web\n \n Express\n \n Apuntes de Express 1617\n \n \n ejs\n Despliegues\n \n Como Desplegar una Aplicación Web en iaas.ull.es\n Apuntes de Heroku\n Para el despliegue en Heroku deberá leer el artículo: Using WebSockets on Heroku with Node.js\n Repo ULL-ESIT-DSI-1819/websocket-socket-io-heroku\n \n Aquí es esencial habilitar session affinity:\n\n 1\n2\n[~/local/src/javascript/learning/websockets/websockets-heroku-socket-io(master)]$ heroku features:enable http-session-affinity\nEnabling http-session-affinity for ⬢ dsi-socket-io-example... done\n \n\n Session affinity, sometimes referred to as sticky sessions, is a platform feature that associates all HTTP requests coming from an end-user with a single application instance (web dyno).\n \n \n \n Webpack\n \n Webpack guide: “getting started”\n Youtube video Webpack 4 por Fatz\n \n \n \n \n\n\n", "url": "/practicas/06p5-t3-websockets.html" }, { "title": "04p3 T1 C3 Http", "excerpt": "Siguiendo el capítulo 20 Node.JS del libro Eloquent JavaScript (EJS) escriba sus propios apuntes con ejemplos y realice los ejercicios\n", "content": "Siguiendo el capítulo 20 Node.JS del libro Eloquent JavaScript (EJS) escriba sus propios apuntes con ejemplos y realice los ejercicios\n", "url": "/practicas/04p3-t1-c3-http.html" }, { "title": "10p10 T3 Jekyll Search", "excerpt": "Jekyll search\n", "content": "Jekyll search\n\n", "url": "/practicas/10p10-t3-jekyll-search.html" }, { "title": "11p11 T3 Restful", "excerpt": "Part III. Chapter 7. Developing RESTful Web Services\n", "content": "Part III. Chapter 7. Developing RESTful Web Services\n", "url": "/practicas/11p11-t3-restful.html" }, { "title": "12p12 Tfa User Experience", "excerpt": "Part III. Chapter 8. Creating a Beautiful User Experience. Chapter 9. \nFortifying Your Application\n", "content": "Part III. Chapter 8. Creating a Beautiful User Experience. Chapter 9. \nFortifying Your Application\n", "url": "/practicas/12p12-tfa-user-experience.html" }, { "title": "07p9 T3 Transfoming Data", "excerpt": "Crawling\n", "content": "Crawling\n", "url": "/practicas/07p9-t3-transfoming-data.html" }, { "title": "08p8 T3 Jekyll Netlify", "excerpt": "Jekyll and Netlify\n", "content": "Jekyll and Netlify\n\n", "url": "/practicas/08p8-t3-jekyll-netlify.html" }, { "title": "09p10 T3 Commanding Databases", "excerpt": "Commanding Databases\n", "content": "Commanding Databases\n\n", "url": "/practicas/09p10-t3-commanding-databases.html" }, { "title": "P16 T2 Async Await Is Generators And Promises", "excerpt": "Solution\n\n", "content": "Solution\n\nSolution to p16-t2-async-await-is-generators-and-promises\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\nfunction doTask1(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg), 100)\n })\n}\n\nfunction doTask2(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+2), 100)\n })\n}\n\nfunction doTask3(arg) {\n return new Promise((resolve, reject) => {\n setTimeout(() => resolve(arg+3), 100)\n })\n}\n\nfunction* init(arg) {\n const res1 = yield doTask1(arg);\n console.log(res1);\n \n const res2 = yield doTask2(res1);\n console.log(res2);\n\n const res3 = yield doTask3(res2);\n console.log(res3);\n\n return res3;\n}\n\nfunction waiter(genFun, arg) {\n const itr = genFun(arg);\n\n function runAndWait(arg) {\n const result = itr.next(arg);\n\n if (result.done) \n return result.value;\n else\n return Promise.resolve(result.value).then(runAndWait)\n }\n\n return runAndWait;\n}\n\nconst doIt = waiter(init, 3);\ndoIt();\n\n", "url": "/practicas/solutions/p16-t2-async-await-is-generators-and-promises.html" }, { "title": "Error", "excerpt": "\n", "content": "Error: ¡Ay Diós mío!\n\nAún no he escrito esta página.\n\nAvísame de cualquier fallo que veas\ncreando una incidencia en la página de issues del repo\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", "url": "/404.html" }, { "title": "p3-t2-handling-events/", "excerpt": "\n", "content": "Práctica p3-t2-handling-events\n\n\n Siguiendo el capítulo Handling Events de EJS escribe tus propios apuntes con ejemplos\n Realiza los ejercicios:\n \n Censored Keyboard: program a text field (an input tag) where the letters Q, W, and X cannot be typed into\n Mouse trail: a series of images that would follow the mouse pointer as you moved it across the page.\n Tabs: A tabbed interface. It allows you to select an interface panel by choosing from a number of tabs sticking out above an element.\n \n \n Elabora tu informe usando Jekyll y GH Pages\n Instala el generador estático Jekyll en tu máquina. En el informe incluye una sección acerca de tu experiencia del uso de GHPages y Jekyll\n Lee los tutoriales sobre GitHub Pages\n Lee los tutoriales sobre Jekyll\n Haz el despliegue del _site con el informe en GitHub usando la rama gh-pages y los contenidos en la rama master\n \n Puedes usar el módulo npm gh-pages para simplificar el despliegue a GitHub: gh-pages -d _site\n \n \n Usa HTMLProofer para testear la salud de tu website\n Añade Integración Contínua con HTMLProofer y Travis CI\n\n\nReferencias\n\n\n Eloquent JS 3d Edition: Handling Events\n Eloquent JS 2nd Edition: Handling Events\n \n Repo de Ejemplo del Capítulo\n \n \n GitHub Pages\n Jekyll\n Marijn Haverbeke (el autor de EJS) en su artículo Flows of energy indica que prefiere el formato asciidoc\n\n", "url": "/tema2-async/practicas/p3-t2-handling-events/index.html" }, { "title": "loadScript", "excerpt": "\n", "content": "loadScript\n\nHere’s a callback-based function that loads a script from a specified src and adds it \nto the current document:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\nfunction loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n}\n\n\nRewrite the loadScript function using promises.\nExample of usage:\n\n1\n2\n3\n4\n5\n6\n7\n8\nlet promise = loadScript(\"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\");\n\npromise.then(\n script => alert(`${script.src} is loaded!`),\n error => alert(`Error: ${error.message}`)\n);\n\npromise.then(script => alert('Another handler...'));\n\n\nSolution\n\n\n Run the solution\n Solution\n\n", "url": "/tema2-async/event-loop/exercises/promises/load-script/README.html" }, { "title": "Categories", "excerpt": "\n", "content": "\n\n \n \n \n \n\n Clases\n \n \n \n \n \n \n Clase del Lunes 18/01/2021\n \n \n \n \n \n \n \n Clase del Miércoles 13/01/2021\n \n \n \n \n \n \n \n Clase del Lunes 11/01/2021\n \n \n \n \n \n \n \n Clase del Lunes 14/12/2020\n \n \n \n \n \n \n \n Clase del Miércoles 02/12/2020\n \n \n \n \n \n \n \n Clase del Lunes 30/11/2020\n \n \n \n \n \n \n \n Clase del Lunes 23/11/2020\n \n \n \n \n \n \n \n Clase del Lunes 16/11/2020\n \n \n \n \n \n \n \n Clase del Miércoles 11/11/2020\n \n \n \n \n \n \n \n Clase del Lunes 09/11/2020\n \n \n \n \n \n \n \n Clase del Lunes 02/11/2020\n \n \n \n \n \n \n \n Clase del Lunes 26/10/2020\n \n \n \n \n \n \n \n Clase de Prácticas del Miércoles 21/10/2020\n \n \n \n \n \n \n \n Clase del Lunes 19/10/2020\n \n \n \n \n \n \n \n Clase del Lunes 05/10/2020\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n", "url": "/categories/" }, { "title": "Clases", "excerpt": "\n", "content": "Clases\n\n\n \n \n \n \n \n \n\n Classes Durante el mes de January\n\n\n \n Clase del Lunes 18/01/2021 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Miércoles 13/01/2021 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 11/01/2021 (Clase en el repo) \n \n \n \n \n \n \n \n \n\n Classes Durante el mes de December\n\n\n \n Clase del Lunes 14/12/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Miércoles 02/12/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n\n Classes Durante el mes de November\n\n\n \n Clase del Lunes 30/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 23/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 16/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Miércoles 11/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 09/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 02/11/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n\n Classes Durante el mes de October\n\n\n \n Clase del Lunes 26/10/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase de Prácticas del Miércoles 21/10/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 19/10/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n Clase del Lunes 05/10/2020 (Clase en el repo) \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "url": "/clases.html" }, { "title": "Al Libro de Calificaciones en el Campus", "excerpt": "\n", "content": "Al Libro de Calificaciones en el Campus\n\nA la lista de Prácticas en el Campus\n\nLista de Prácticas Publicadas\n\n \n Descripción de la Práctica pb-gh-campus-expert\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p01-t1-iaas\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p2-t1-vscode\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p2-t1-c3-filesystem\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p5-t1-meta\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p6-t1-gh-cli\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p7-t2-asyncmap\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p8-t2-async-serialize\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p8-t2-async-webpack-esmodule\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p9-t2-promise-readfile\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p10-t2-promise-all\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p12-t2-promise-allsettled\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p11-t2-callback-2-promise\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p14-t2-async-await\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p15-t2-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p16-t2-async-await-is-generators-and-promises\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p17-t2-async-iteration-and-generators\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p18-t2-first-come-first-served-for-await\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p4-t2-networking\n Enlace a los repos de los alumnos\n \n Descripción de la Práctica p5-t3-websockets\n Enlace a los repos de los alumnos\n\n", "url": "/practicas" }, { "title": "Search", "excerpt": "\n", "content": "{% capture initSearch %}\n\nSearch\n\n\n Search term (accepts a regex):\n \n \n \n \n \n\n\n\n\n\n\n\n\nPlease enable JavaScript to use the search form.\n\n{% endcapture %}\n\n\n \n \n {{ initSearch\n lstrip }}\n \n \n\n", "url": "/search/" }, { "title": "Adaptación a la Docencia y Evaluación No Presencial", "excerpt": "\n", "content": "Adaptación a la Docencia y Evaluación No Presencial\n\nProtocolo Covid para el ALUMNADO de la ULL\n\n\n Protocolo Covid para el ALUMNADO de la ULL\n\n\nTutorías no presenciales\n\nMedios para realizar las tutorías:\n\n\n Chat virtual (chat.google.com) y videoconferencia (Google Meet).\n Campus Virtual\n GitHub Issues\n\n\nEn el caso de las tutorías, estamos utilizando las herramientas de chat y meet de Google para dudas y preguntas relacionadas con los contenidos teóricos, la asignatura y las prácticas. También utilizamos los issues de GitHub para resolver cuestiones sobre las prácticas. Bajo demanda se realizan tutorías mediante videoconferencia.\n\nMetodología no presencial\n\nSesiones virtuales/clases\n\nRealizamos las clases mediante videoconferencias (Google Meet). Las de teoría serán grabadas y publicadas en el campus virtual. Los vídeos son compartidos via Google Drive, el Campus (Kaltura) y Youtube.\n\nInclusión de documentación sobre cada tema\n\nTanto en el Campus como en la organización GitHub se puede acceder a la información de la asignatura. Los apuntes se encuentran en {{site.repo_apuntes}}\n\nTutorías/Foros/debate\n\nUtilizamos los recursos del aula virtual (Moodle), Google Chat y Google Meets para incentivar la participación, resolver dudas y profundizar en temas.\n\nSemanalmente, se facilita un guión de una práctica semanal, que los alumnos deberán resolver y entregar. Pueden preguntar dudas por todos los canales del Campus, Google o GitHub.\n\nEvaluación y Calificación\n\nEvaluación Contínua\n\n\n Entregas de prácticas y retos\n Tienen siempre mayor valor la realización/defensa de las entregas online que la entrega de los repos\n La última práctica consiste en la presentación y entrega de un Trabajo Fin de Asignatura (TFA)\n\n\nAlumnos que no superan pero se acogen a Evaluación Contínua\n\nLos alumnos que han asistido a clase, tutorías y han participado en un número suficiente de actividades pero no han superado la asignatura podrán entregar las prácticas con la antelación suficiente antes de cada cierre de actas (Enero, Junio, Julio, Septiembre).\n\nDeberán hacer una defensa de las prácticas presentadas en tiempo acordado con el profesor.\nEl profesor les indicará si está aprobado o si debe mejorar para entregarlas antes de la siguiente convocatoria.\n\nExámenes de Convocatoria\n\nLos alumnos que no puedan (por no haber seguido el curso) o que decidan no acogerse a evaluación contínua deberán presentarse a un examen práctico de evaluación en las \nconvocatorias establecidas por la ULL.\n\nLa práctica de evaluación consistirá en la entrega en GitHub Classroom de un ejercicio intensivo que se deben entregar en un tiempo limitado y su posterior defensa que permitirá\nevaluar los conocimientos del alumno de las competencias de la asignatura.\n\nReferencias\n\n\n RECURSOS DISPONIBLES PARA REALIZAR ACTIVIDAD DOCENTE NO PRESENCIAL (Curso Moodle ULL)\n Criterios y Procedimiento de Adaptación Temporal a la Docencia y Evaluación no Presencial\n ULL Corona Virus\n ELABORACIÓN DE LAS ADENDAS A LAS GUÍAS DOCENTES. PREGUNTAS FRECUENTES \n Fichas de Evaluación Telemática\n Videotutorial Evaluación ULL\n Calendario Académico\n Horarios del Grado de Ingeniería Informática para el curso 19/20\n Horarios de tutorías del Departamento de Ingeniería Informática\n\n\n", "url": "/covid19.html" }, { "title": "El Master", "excerpt": "\n", "content": "\nEl Master\n\n\n Página oficial del Master en la ULL: Horarios, Exámenes, Guías Docentes, Prácticas Externas, Becas y Ayudas. (Link en la ULL)\n \n Horarios 20/21\n Horarios 19/20\n \n \n Tabla del Master\n Comparativa Master II - FullStack - Contestacion Modifica (Acceso restringido)\n Google Spreadsheet con las Asignaturas de FullStack (Accesible sólo a profesores)\n\n", "url": "/degree.html" }, { "title": "Evaluación", "excerpt": "\n", "content": "Evaluación\n\nImportante\n\n\n Cuando creas que tienes el número suficiente de prácticas elaboradas solicita hora con el profesor para una presentación presencial de tus prácticas\n La calificación aparecerá en la convocatoria siguiente a la presentación presencial de tus prácticas\n\n\nLista de Prácticas a Entregar\n\n\n Consulta la lista de prácticas y el Trabajo Fin de Asignatura p12-tfa-user-experience\n \n Recuerda: Pueden encontrar las soluciones a las prácticas del autor del libro en este repo ULL-MII-SYTWS-1920/book-solution-nodejs-the-right-way. Debería tener permisos de acceso\n \n \n\n\nFechas de los cierres de actas\n\n\n Viernes 14 de Febrero 2020\n Viernes 27 de Marzo 2020\n Jueves 25 de Junio 2020\n Miércoles 22 de Julio 2020\n Jueves 25 de Septiembre 2020\n\n\nExámenes\n\n\n Descripción del calendario\n Entiendo que las clases se acaban el 17/01/2019\n Los exámenes aparece del 20/01 al 01/02. Los de la Web ULL no han actualizado el enlace, pero es este:\n \n Fichero en docs.google con las Fechas de los Exámenes\n Enero:\n \n 24/1/2020\n 16:00\n Aula 2.2\n 31/1/2020\n 16:00\n 2.2\n Cierre de actas de Enero: Viernes 7 de Febrero de 2020\n \n \n Junio\n \n 3/7/2020\n 16:00\n Aula 2.2\n Cierre de actas: Jueves 25 de Junio 2020\n \n \n Septiembre\n \n 4/9/2020\n 16:00\n Aula 2.2\n Cierre de actas: Jueves 25 de Septiembre 2020\n \n \n \n \n\n\nInstrucciones para los exámenes de Convocatoria\n\n\n El examen de convocatoria consiste en una prueba escrita\n Deberán traer un bolígrafo con carga suficiente. El papel será proporcionado por el profesor. No se permite el uso de dispositivos móviles ni electrónicos, libros, apuntes, etc. durante el examen\n La prueba contiene un conjunto de preguntas para aquellos alumnos que no hacen uso de la evaluación contínua (alumnos que no han superado las prácticas)\n La prueba tendrá una duración de no mas de tres horas para los alumnos que no hacen uso de la evaluación contínua y de no mas de dos para los que van por evaluación contínua\n Si lo desea, índiqueme con antelación si necesita un justificante documental de haber realizado el examen.\n Los alumnos que no tienen aptas las prácticas deberán acreditar su identidad mediante la exhibición de su carné de estudiante, documento nacional de identidad, pasaporte o, en su defecto, acreditación suficiente a juicio del profesor. Caso de no poder acreditar su identidad, el alumnado podrá realizar la prueba de evaluación realizando una declaración jurada, y deberá acreditar su identidad el primer día lectivo posterior a la misma.\n La suplantación de identidad será comunicada al decanato o dirección del centro, para el inicio del trámite correspondiente, a los efectos de determinar las consecuencias disciplinarias a las que hubiere lugar por parte del alumnado implicado.\n El empleo por parte del alumnado de medios ilícitos o fraudulentos en la realización de la prueba conducirá a la calificación numérica de 0, debiendo abandonar el lugar de la prueba y quedando sujeto a las consecuencias disciplinarias que se pudieran derivar de su conducta.\n Iniciada la prueba no se permitirá al alumnado la entrada al lugar de realización, salvo por razones excepcionales que habrán de ser valoradas por el profesor. El alumnado solo podrá abandonarlo durante la realización de la misma, si está autorizado o acompañado por el profesorado responsable de la vigilancia. En otro caso, el abandono del recinto implicará la finalización del examen, que ha de ser entregado por el estudiante al profesorado.\n En el caso de que el alumnado que se presente a la realización de la prueba no conste en el acta en la asignatura, se le permitirá que la lleve a cabo, quedando pendiente su evaluación de la posible subsanación de su situación administrativa.\n\n", "url": "/evaluacion.html" }, { "title": "Bibliografía y Referencias", "excerpt": "\n", "content": "Bibliografía y Referencias\n\nResources for the Student\n\n\n Repo de Bibliografía en ULL-MII-SYTWS-2021\n\n\nDevelopment and Management of Information Systems\n\n\n Developing Information Systems : Practical guidance for IT professionals by James Cadle, Tahir Ahmed, Julian Cox, Lynda Girvan, Alan Paul, Debra Paul, and Pete Thompson\n A review of quality frameworks in information systems Thanh Thoa Pham Thi, Markus Helfert\n\n\nJS\n\n\n The Modern JavaScript Tutorial. https://javascript.info/\n Eloquent JS 3rd Edition\n Eloquent JS 2nd Edition\n Advanced JavaScript. Zachary Shute. 2019 PuntoQ ULL\n\n\nNode.js\n\n\n Node.js 8 the Right Way. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ BULL)\n \n Pueden encontrar las soluciones a las prácticas del autor del libro en este repo ULL-MII-SYTWS-1920/book-solution-nodejs-the-right-way\n \n \n Node.js 8 the Right Way Google Books\n \n Node.js 8 the Right Way GitHub. versión de 2013.\n \n \n Node.js in Action, Second Edition by: Bradley Meck Alex Young and Mike Cantelon. Acceda por medio del PuntoQ de la ULL\n \n \n Mastering Node.js - Second Edition by: Sandro Pasquali; Kevin Faaborg. Acceda por medio del PuntoQ de la ULL\n \n Trasparencias curso de JS de MiriadaX GitBook by Basarat Ali Syed\n\n\nTypeScript\n\n\n Programming TypeScript. Boris Cherny. 2019. BULL\n TypeScript Deep Dive. GitBook (Open Source). Basarat Ali Syed.\n Learn React with TypeScript 3 Carl Rippon 2018. BULL\n Hands-On Functional Programming with TypeScript. Remo H. Jansen 2019. BULL\n\n\nRabbitMQ\n\n\n RabbitMQ Essentials By: David Dossot (Debes estar autenticado via PuntoQ BULL)\n Learning RabbitMQ By: Martin Toshev\n Mastering RabbitMQ By: Emrah Ayanoglu; Yusuf Aytaş; Dotan Nahum\n\n\n0MQ\n\n\n ZeroMQ By: Faruk Akgul 2013\n ZeroMQ By: Pieter Hintjens 2013\n\n\nPattern Design\n\n\n Node.js Design Patterns - Second Edition By: Mario Casciaro; Luciano Mammino\n\n\nHigh Performance\n\n\n Node.js High Performance By: Diogo Resende\n\n\nREST\n\n\n RESTful Web API Design with Node.js 10 - Third Edition by: Valentin Bojinov. Acceda por medio del PuntoQ de la ULL\n Building APIs with Node.js by Caio Ribeiro Pereira. Acceda por medio del PuntoQ de la ULL\n Developing Microservices with Node.js by David González. Acceda por medio del PuntoQ de la ULL\n TypeScript Microservices\nBy: Parth Ghiya. Acceda por medio del PuntoQ de la ULL\n\n\nJAM Stack\n\n\n O’Reilly book: Modern Web Development on the JAMstack - Netlify\n \n Web Workers\n \n Book Web Workers: Safari O’Reilly. Usa Acceso ULL\n\n\nGraphQL\n\n\n Beginning GraphQL. Xavier Decuyper y Brian Kimokoti. Paqt PuntoQ\n React Cookbook by Carlos Santana Roldan PuntoQ\n Visual Design of GraphQL Data. A Practical Introduction with Legacy Data and Neo4.j Thomas Frisendal PuntoQ\n\n\nGit, Github\n\n\n Chacon’s book on Git\n OCW ULL: Integración de las Herramientas “GitHub Education” en el Aula Casiano et Al.\n\n\nWebpack\n\n{% include references-webpack.md %}\n\nReact\n\n{% include references-react.md %}\n\nJournals and Magazines\n\n\n https://www.smashingmagazine.com/\n\n\nBibliografía Auxiliar\n\n\n Página de la Asignatura CA del MII\n \n Apuntes del profesor: Computación Avanzada\n \n \n Node.js 8 the Right Way Practical, Server-Side JS that Scales. Jim R. Wilson. Old Edition\n \n \n Book ASYNC JavaScript: Build More Responsive Apps with Less Code Trevor Burnham\n \n \n Book You Don’t Know JS: Async & Performance\n \n \n Slides “MEAN Architecture 2.0” by Scott Davis\n \n \n Modern JavaScript Cheatsheet\n \n Book: Understanding ECMAScript 6\n Book Exploring ES6 \n\n\nCursos y Apuntes Relacionados\n\n\n Apuntes del curso 16/17 en Gitbooks\n Apuntes del curso 16/17 en GitHub (gh-pages)\n Apuntes del curso 15/16 en Gitbooks\n Apuntes de PL del Grado en github pages URL\n Apuntes de Ruby en GitHub\n DSI 15/16\n SYTW 16/17\n PL curso 14/15\n PL curso 15/16\n\n\nAsignaturas Relacionadas en el Master de II\n\n\n Computación de Altas Prestaciones y Tecnologías Web Master II\n Tecnologías Web Master II\n\n\nCursos OCW ULL relacionados\n\n\n OCW ULL: Integración de las Herramientas “GitHub Education” en el Aula Casiano et Al.\n Apuntes del antiguo curso de PL de la Ingeniería Informática (Open CourseWare ULL) (C, Perl, Yacc, Eyapp)\n Lenguajes y Herramientas Informáticas (Open CourseWare ULL) (C, Perl)\n\n\n", "url": "/references.html" }, { "title": "Recursos de la Asignatura", "excerpt": "\n", "content": "Recursos de la Asignatura\n\nCampus Virtual\n\n\n SYTWS\n Participantes\n Calificaciones\n Tareas\n Foros\n\n\nCampus Virtuales de Otras Asignaturas del Profesor\n\n\n Org ULL-ESIT-PL-1819\n Org ULL-MII-CA-1819\n Org ULL-ESIT-DSI-1819\n Org ULL-ESIT-PL-1718\n Org ULL-ESIT-MII-CA-1718\n Org ULL-ESIT-DSI-1617\n\n\nGitHub\n\n\n Página Web de SYTWS\n Organización ULL-ESIT-SYTWS-1920\n \n Repo ull-esit-sytws-1920.github.io\n \n \n\n\nAsking GitHub for Educational Discounts\n\n\n Solicitudes a GitHub\n When you receive then email notifying you that you’ve been approved for GitHub Education faculty benefits, you may return to to upgrade your academic GitHub organizations\n\n\nGoogle Drive\n\n\n Spreadsheet\n\n\nGoogle+\n\n\n Comunidad Google+ SYTWS\n\n\nRecursos Generales\n\nPrácticas\n\n\n Herramientas para la Asignación de Tareas\n \n GitHub Classroom\n CodeLab TFG de Samuel\n \n \n Instrucciones para las entregas de Prácticas y Trabajos\n\n\nConnecting GitHub Classroom with Moodle\n\nGitHub Classroom integrates with learning management systems (LMS) such as Brightspace, Canvas, Moodle, and others. GitHub Classroom supports:\n\n\n Roster provisioning\n Assignment creation (Planned) Brrr\n \n Submission syncing (Planned) Brrr\n \n Use GitHub Classroom with Canvas, Google Classroom, or your own tools\n Integrating GHC with a learning management system (LMS)\n Configuring GitHub Classroom in Moodle\n Importing a course roster from your Learning Management System\n\n\nBULL\n\n\n BULL PuntoQ\n Video tutoriales de ayuda sobre PuntoQ\n Antiplagio\n\n\niaas.ull.es\n\n\n Instrucciones para el uso de iaas.ull.es\n \n Gestor online de pools\n IaaS - Uso de la aplicación de gestión de pools\n Video del profesor: iaas.ull.es\n https://iaas.ull.es/mismaquinas\n \n \n\n\nSTIC\n\nIncidencias\n\n\n Gestor de incidencias. RT para rt.stic.ull.es\n Tarjeta Universitaria\n\n\nVPN\n\n\n \n Servicio de vpn: guías de configuración\n \n \n Instrucciones para acceder a la VPN de la ULL en un Mac sin usar GlobalProtect\n \n\n\nMapa de Recursos\n\n\n Mapa de recursos de la ULL\n\n\nImpresión\n\n\n Datos para el servicio de impresión\n\n\nCambio de contraseña\n\n\n Cambio de contraseña\n\n\nSede ULL/ULL Online\n\n\n Sede ULL\n \n Solicitud General\n Mis trámites\n Portafirmas de la ULL\n Certificado de Docencia Impartida\n \n \n\n\n", "url": "/resources.html" }, { "title": "Competencias", "excerpt": "\n", "content": "Competencias\n\n\n \n Tabla de Competencias del Master\n \n Generales\n \n CO1\tCapacidad para proyectar, calcular y diseñar productos, procesos e instalaciones en todos los ámbitos de la Ingeniería Informática\n CO3\tCapacidad para dirigir, planificar y supervisar equipos multidisciplinares\n CO4\tCapacidad para el modelado matemático, cálculo y simulación en centros tecnológicos y de ingeniería de empresa, particularmente en tareas de investigación, desarrollo e innovación en todos los ámbitos relacionados con la Ingeniería en Informática\n CO7\tCapacidad para la puesta en marcha, dirección y gestión de procesos de fabricación de equipos informáticos, con garantía de la seguridad para las personas y bienes, la calidad final de los productos y su homologación\n CO8\tCapacidad para la aplicación de los conocimientos adquiridos y de resolver problemas en entornos nuevos o poco conocidos dentro de contextos más amplios y mulitidisciplinares, siendo capaces de integrar estos conocimientos\n \n \n Específicas\n \n SL2\tComprender, evaluar y aplicar las tecnologías, herramientas, recursos en el marco de las arquitecturas, redes, componentes, servicios y estándares en sistemas y entornos libres.\n SL3\tComprender, diseñar, evaluar y aplicar tecnologías, herramientas, recursos, estándares en el marco del desarrollo de software y su implantación en sistemas y entornos libres.\n TI_2\tCapacidad de comprender y saber aplicar el funcionamiento y organización de Internet, las tecnologías y protocolos de redes de nueva generación, los modelos de componentes, software intermediario y servicios\n TI_3\tCapacidad para asegurar, gestionar, auditar y certificar la calidad de los desarrollos, procesos, sistemas, servicios, aplicaciones y productos informáticos\n TI_6\tCapacidad para diseñar y evaluar sistemas operativos y servidores, y aplicaciones y sistemas basados en computación distribuida\n TI_8\tCapacidad de diseñar y desarrollar sistemas, aplicaciones y servicios informáticos en sistemas empotrados y ubicuos\n \n \n\n", "url": "/tema0-presentacion/competencias.html" }, { "title": "Gulp: a tool to Automate and Enhance your Workflow", "excerpt": "\n", "content": "Gulp: a tool to Automate and Enhance your Workflow\n\nGulp Tutorial Getting Started\n\n\n Quick Start\n JavaScript and Gulpfiles\n Creating Tasks\n Async Completion\n Working with Files\n Explaining Globs\n Using Plugins\n Watching Files\n\n\nGulp API Documentation\n\n\n Concepts\n src()\n dest()\n symlink()\n lastRun()\n series()\n parallel()\n watch()\n task()\n registry()\n tree()\n Vinyl\n Vinyl.isVinyl()\n Vinyl.isCustomProp()\n\n\nExamples of how to execute shell commands with gulp\n\nEn gulp 4.0\n\n1\n2\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space\n\n\n1\n[~/.../juanIrache-solutions/20_3_public_space(master)]$ cat gulpfile.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\nconst gulp = require(\"gulp\");\nconst { exec } = require('child_process');\nconst util = require('util');\nconst pexec = util.promisify(require('child_process').exec);\n\nfunction server() {\n try {\n let s = exec('nodemon server.js');\n s.stdout.pipe(process.stdout);\n s.stderr.pipe(process.stderr);\n } catch(e) {\n console.error(\"Hubieron errores:\\n\"+e);\n }\n}\n\nasync function cget() {\n try {\n const {stdout, stderr} = await pexec(\"curl -v http://localhost:8000/package.json\");\n console.log('stdout:', stdout);\n console.error('stderr:', stderr);\n } catch(e) {\n console.error(\"Hubieron errores:\\n\"+e);\n }\n}\n\nexports.cget = cget;\nexports.server = server;\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n[~/.../juanIrache-solutions/20_3_public_space(master)]$ gulp server\n[13:32:53] Using gulpfile ~/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space/gulpfile.js\n[13:32:53] Starting 'server'...\n[nodemon] 1.11.0\n[nodemon] to restart at any time, enter `rs`\n[nodemon] watching: *.*\n[nodemon] starting `node server.js`\nhello world!\n\n\nEn otra terminal:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ gulp cget\n[13:35:11] Using gulpfile ~/local/src/javascript/eloquent-javascript-3/juanIrache-solutions/20_3_public_space/gulpfile.js\n[13:35:11] Starting 'cget'...\nstdout: {\n \"name\": \"20_3_public_space\",\n \"version\": \"1.0.0\",\n \"description\": \"Solutions for Chapter 20 of EJS book: https://eloquentjavascript.net/20_node.html by Juan Irache\",\n \"main\": \"code.js\",\n \"scripts\": {\n \"test\": \"nodemon server.js\",\n \"start\": \"node server.js\"\n },\n \"keywords\": [],\n \"author\": \"Casiano Rodriguez-Leon <casiano.rodriguez.leon@gmail.com> (https://github.com/crguezl)\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"mime\": \"^2.4.4\"\n },\n \"devDependencies\": {\n \"gulp\": \"^4.0.2\"\n }\n}\n\nstderr: % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying ::1...\n* TCP_NODELAY set\n* Connected to localhost (::1) port 8000 (#0)\n> GET /package.json HTTP/1.1\n> Host: localhost:8000\n> User-Agent: curl/7.54.0\n> Accept: */*\n> \n< HTTP/1.1 200 OK\n< Access-Control-Allow-Origin: *\n< Access-Control-Allow-Methods: POST, PUT, GET, OPTIONS, DELETE, MKCOL\n< Content-Type: application/json\n< Date: Thu, 31 Oct 2019 13:35:12 GMT\n< Connection: keep-alive\n< Transfer-Encoding: chunked\n< \n{ [519 bytes data]\n100 512 0 512 0 0 9662 0 --:--:-- --:--:-- --:--:-- 9846\n* Connection #0 to host localhost left intact\n\n[13:35:12] Finished 'cget' after 97 ms\n\n\nEn Gulp 3.9\n\n\n Véase la sección Gulp de los apuntes\n\n\nAquí tiene un ejemplo (incompleto) en gulp 3.9:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n var gulp = require(\"gulp\");\n var shell = require(\"gulp-shell\");\n\n gulp.task(\"pre-install\", shell.task([\n \"npm i -g gulp static-server\",\n \"npm install -g nodemon\",\n \"npm install -g gulp-shell\"\n ]));\n\n gulp.task(\"serve\", shell.task(\"nodemon server.js\"));\n\n gulp.task(\"lint\", shell.task(\"jshint *.js **/*.js\"));\n\n gulp.task(\"get\", shell.task(\"curl -v http://localhost:8000/file.txt\"));\n gulp.task(\"put\", shell.task(\"curl -v -X PUT -d 'Bye world!' http://localhost:8000/file.txt\"));\n\n", "url": "/tema1-introduccion/build-tools.html" }, { "title": "Control Version", "excerpt": "\n", "content": "Control Version\n\nMeta\n\nGitHub Command Line Interface\n", "url": "/tema1-introduccion/control-version.html" }, { "title": "Capítulo. Diseño: Smells, Strategy Pattern y el Switch Smell", "excerpt": "\n", "content": "Capítulo. Diseño: Smells, Strategy Pattern y el Switch Smell\n\n\n Apuntes del curso 15/16: Code Smells/Código Hediondo\n Apuntes del curso 16/17: Patrones de Diseño\n Apuntes del curso 15/16: Eliminando Switch Smell\n Apuntes del curso 16/17: Strategy Pattern\n Apuntes del curso 16/17: Práctica: Evaluar Strategy Pattern\n Apuntes del curso 16/17: Práctica: Creación de Paquetes NPM y Strategy Pattern\n JSHint\n\n", "url": "/tema1-introduccion/design.html" }, { "title": "Visual Studio Code", "excerpt": "\n", "content": "\nVisual Studio Code\n\n\n VSCode User Guide\n \n \n Basic Editing\n \n\n \n Extension Marketplace\n \n \n \n IntelliSense\n \n \n \n Code Navigation\n \n \n \n Refactoring\n \n \n \n Debugging\n \n \n \n Version Control\n \n \n \n Integrated Terminal\n \n \n \n Multi-root Workspaces\n \n \n \n Tasks\n \n \n \n Snippets\n \n \n \n Emmet\n \n \n \n Command Line\n \n \n \n Accessibility\n \n \n \n\n\n\n Version Control\n \n Using Version Control in VS Code\n Video Git Version Control in VS Code\n Video Git in Visual Studio Code\n \n \n Collaboration\n \n Introducing Visual Studio Live Share\n Vídeo Visual Studio Live Share Demo on VS Code\n \n \n Editando con VSCode en la máquina iaas.ull.es\n \n VSCode: Remote Development tutorials\n Use un plugin para Visual Studio Code que permita montar un sistema de archivos sobre SSH\n \n SSH FS: File system provider using SSH\n SSHExtension This extension allows you to open an SSH connection in the integrated terminal. The extension was created in order to have access to the SSH in conjunction with the already available access to the FTP.\n Remote FS\n \n \n \n \n Settings file locations\n \n Depending on your platform, the user settings file is located here:\n \n Windows %APPDATA%\\Code\\User\\settings.json\n macOS $HOME/Library/Application Support/Code/User/settings.json\n Linux $HOME/.config/Code/User/settings.json\n The workspace setting file is located under the .vscode folder in your root folder.\n \n \n \n \n VS Code Tips and Tricks Tutorial\n VS Code Tips and Tricks Tutorial Repo\n Vídeo de Jesús Torres: Breve intro de cómo programar y depurar C++ con Visual Studio Code + Gatos\n Web Bookmarks a VSCode Extension by Alejandro Gonzalez Alonso \n(TFG de II de la ULL)\n\n\nStackEdit\n\n\n stackedit.io\n\n\nStackEdit is an editor in the cloud: it can sync your files with Google Drive, Dropbox and GitHub. It can also publish them as blog posts to Blogger, WordPress and Zendesk. You can choose whether to upload in Markdown format, HTML, or to format the output using the Handlebars template engine.\n\n\n\nAtom\n\n\n Vídeo del profesor explicando el GitHub Package\n\n\nHerramientas Útiles\n\n\n http://asciiflow.com/ Aplicación Web que nos permite dibujar aprovechando los caractéres\n\n\nPrácticas\n\n\n Descripción de la Práctica p2-t1-vscode\n\n", "url": "/tema1-introduccion/editors.html" }, { "title": "Capítulo. Programación Funcional", "excerpt": "\n", "content": "Capítulo. Programación Funcional\n\n\n Eloquent JS: High Order Functions\n Repo ULL-ESIT-MII-CA-1718/ejs-chapter05-higher-order-functions\n\n\nRamda\n\n\n ramda.js\n Repo jsdaycan2019-ramda\n\n", "url": "/tema1-introduccion/functional.html" }, { "title": "GitHub Command Line Interface", "excerpt": "\n", "content": "GitHub Command Line Interface\n\ngh api\n\nAuthentication Token\n\nGo to github.com/settings/tokens\nto generate a new token for gh and set then environment variable \nGITHUB_TOKEN (export GITHUB_TOKEN= ...)\n\nExample\n\nPlaceholder values :owner, :repo, and :branch in the endpoint argument will get replaced with values from the repository of the current directory.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n[~/.../sytws2021/apuntes(master)]$ gh api repos/:owner/:repo/issues\n[\n {\n \"url\": \"https://api.github.com/repos/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io/issues/5\",\n \"repository_url\": \"https://api.github.com/repos/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io\",\n \"labels_url\": \"https://api.github.com/repos/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io/issues/5/labels{/name}\",\n \"comments_url\": \"https://api.github.com/repos/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io/issues/5/comments\",\n \"events_url\": \"https://api.github.com/repos/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io/issues/5/events\",\n \"html_url\": \"https://github.com/ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io/issues/5\",\n \"id\": 715027457,\n \"node_id\": \"MDU6SXNzdWU3MTUwMjc0NTc=\",\n \"number\": 5,\n \"title\": \"tema0-presentacion/practicas/pb-gh-campus-expert/\",\n \"user\": {\n ...\n }\n ...\n }\n]\n\n\nWe can pipe the output to jq:\n\n1\n2\n[~/.../sytws2021/apuntes(master)]$ gh api repos/:owner/:repo/issues | jq '.[0] | .title'\n\"tema0-presentacion/practicas/pb-gh-campus-expert/\"\n\n\nOf course, we can explicit the repo and owner. For example:\n\n1\n2\n3\n➜ learning git:(master) gh api repos/ULL-MII-SYTWS-2021/p01-t1-iaas-alu0101040882/issues | jq '.[0] | .user.login, .body'\n\"crguezl\"\n\"Hola @alu0101040882, \\r\\n\\r\\nVeo que alguno ya está trabajando en la práctica de\n\n\nLet us see an example using the POST method. We will start from this curl example \nin the GitHub API getting started guide:\n\n1\n2\n3\n4\n5\n6\n7\n8\n$ curl -i -H \"Authorization: token 5199831f4dd3b79e7c5b7e0ebe75d67aa66e79d4\" \\\n -d '{ \\\n \"name\": \"blog\", \\\n \"auto_init\": true, \\\n \"private\": true, \\\n \"gitignore_template\": \"nanoc\" \\\n }' \\\n https://api.github.com/user/repos\n\n\nand let us adapt to gh api. We use -X or --method stringto set the HTTP method for the request (default GET) and -fto set the fields:\n\n1\n➜ /tmp gh api -X POST -f name=repo-prueba-gh-api -f private=true /user/repos\n\n\nThis way we have created a private repo inside the user scope:\n\n\n\nPagination\n\nThe option --paginateallow us to make additional HTTP requests to fetch \nall pages of results. Here is an example.\n\n1\n2\n3\n4\n5\n6\n➜ to-meta git:(master) ✗ gh alias set get-repos 'api /orgs/$1/repos'\n- Adding alias for get-repos: api /orgs/$1/repos\n✓ Added alias.\n➜ to-meta git:(master) ✗ gh alias list\nco: pr checkout\nget-repos: api /orgs/$1/repos\n\n\n1\n➜ to-meta git:(master) ✗ gh get-repos ULL-MII-SYTWS-2021\n\n\n\n\nNow we can pipe the output to jq to get the names of the repos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n➜ to-meta git:(master) ✗ gh get-repos ULL-MII-SYTWS-2021 | jq '.[].full_name' -\n\"ULL-MII-SYTWS-2021/sytws-2021-meta\"\n\"ULL-MII-SYTWS-2021/sytws2021-private\"\n\"ULL-MII-SYTWS-2021/books-shared\"\n\"ULL-MII-SYTWS-2021/p01-t1-iaas-fcohdezc\"\n\"ULL-MII-SYTWS-2021/p01-t1-iaas-crguezl\"\n\"ULL-MII-SYTWS-2021/p01-t1-iaas-alu0100886870\"\n...\n\n\nLet ask for the repos in the PL organization for the course 19/20:\n\n1\n2\n➜ to-meta git:(master) ✗ gh api /orgs/ULL-ESIT-PL-1920/repos | jq '.[] | .name' | wc\n 30 30 1088\n\nIt gave us 30 repos. There are much more than that in that organization.\n\nIf we use --paginate the request takes a long time and gives us near a thousand repos:\n\n1\n2\n➜ to-meta git:(master) ✗ gh api --paginate /orgs/ULL-ESIT-PL-1920/repos | jq '.[] | .name' | wc\n 990 990 32868\n\n\ngh alias\n\ngh alias set\n\n1\n➜ to-meta git:(master) ✗ gh help alias set\n\n\nDeclare a word as a command alias that will expand to the specified command(s).\n\nThe expansion may specify additional arguments and flags. If the expansion\nincludes positional placeholders such as $1, $2, etc., any extra arguments\nthat follow the invocation of an alias will be inserted appropriately.\n\nIf --shell is specified, the alias will be run through a shell interpreter (sh). This allows you\nto compose commands with | or redirect with >. Note that extra arguments following the alias\nwill not be automatically passed to the expanded expression. To have a shell alias receive\narguments, you must explicitly accept them using $1, $2, etc., or $@ to accept all of them.\n\nPlatform note: on Windows, shell aliases are executed via sh as installed by Git For Windows. If\nyou have installed git on Windows in some other way, shell aliases may not work for you.\n\nQuotes must always be used when defining a command as in the examples.\n\nUSAGE\ngh alias set [flags]\n\nFLAGS\n-s, –shell Declare an alias to be passed through a shell interpreter\n\nINHERITED FLAGS\n–help Show help for command\n\nEXAMPLES\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n $ gh alias set pv 'pr view'\n $ gh pv -w 123\n #=> gh pr view -w 123\n\n $ gh alias set bugs 'issue list --label=\"bugs\"'\n\n $ gh alias set epicsBy 'issue list --author=\"$1\" --label=\"epic\"'\n $ gh epicsBy vilmibm\n #=> gh issue list --author=\"vilmibm\" --label=\"epic\"\n\n $ gh alias set --shell igrep 'gh issue list --label=\"$1\" | grep $2'\n $ gh igrep epic foo\n #=> gh issue list --label=\"epic\" | grep \"foo\"\n\n\nLet us search for repos inside our organization using GitHub API v3:\n\n1\n➜ to-meta git:(master) ✗ gh api '/search/repositories?q=vscode+org:ULL-MII-SYTWS-2021+in:name'\n\n\n\n\nIn this link you’ll find the full output.\n\n\n See the SEARCH\nsection of the REST API GitHub docs to know more about the API.\n See section Search Repositories for more info on how to search for repos\n\n\nNow we can use gh alias set to make an alias get-lab to get the repos:\n\n1\n2\n3\n4\n5\n6\n➜ to-meta git:(master) ✗ gh alias set get-labs 'api /search/repositories?q=$2+org:$1+in:name'\n- Adding alias for get-labs: api /search/repositories?q=$2+org:$1+in:name\n✓ Added alias.\n➜ to-meta git:(master) ✗ gh alias list\nco: pr checkout\nget-labs: api /search/repositories?q=$2+org:$1+in:name\n\n\nAnd now we can use it:\n\n1\n➜ to-meta git:(master) ✗ gh get-labs ULL-MII-SYTWS-2021 iaas\n\n\nNext we can pipe the output to jq to get the names of the repos and the date of the last push:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n➜ to-meta git:(master) ✗ gh get-labs ULL-MII-SYTWS-2021 iaas | jq '.items[] | .name, .pushed_at'\n\"p01-t1-iaas-juanchojbarroso\"\n\"2020-10-21T15:58:32Z\"\n\"p01-t1-iaas-alu0101040882\"\n\"2020-10-17T16:53:39Z\"\n\"p01-t1-iaas-fcohdezc\"\n\"2020-10-06T17:51:52Z\"\n\"p01-t1-iaas-crguezl\"\n\"2020-10-19T13:50:13Z\"\n\"p01-t1-iaas-alu0100886870\"\n\"2020-10-21T17:05:08Z\"\n\"p01-t1-iaas-lardabi\"\n\"2020-10-06T18:01:16Z\"\n\nWe can improve it by writing a script:\n\n1\n➜ to-meta git:(master) ✗ cat ~/bin/repos\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n#!/bin/bash\n\nORG=ULL-MII-SYTWS-2021\nASSIGNMENT=iaas\nif [[ $# -gt 0 ]] ; then\n ASSIGNMENT=$1\nfi\nif [[ $# -gt 1 ]] ; then\n ORG=$2\nfi\n# echo $ASSIGNMENT $ORG\ngh api --paginate /search/repositories?q=$ASSIGNMENT+org:$ORG+in:name |\n jq '.items[] | .name, .pushed_at' |\n sed 'N;s/\\n/ => /'\n\n\nLet us make an alias for gh:\n\n1\n2\n3\n➜ to-meta git:(master) ✗ gh alias set --shell get-repos 'repos $1 $2'\n- Adding alias for get-repos: repos $1 $2\n✓ Changed alias get-repos from !repos to !repos $1 $2\n\n\nWatch the use of single quotes.\n\nLet us use our new alias:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n➜ apuntes git:(curso2021) gh get-repos TFA ULL-ESIT-PL-1920\n\"tfa-module-miguel-tfa\" => \"2020-09-04T09:40:57Z\"\n\"tfa-daniel-tfa\" => \"2020-06-02T14:00:30Z\"\n\"tfa-manuel-jorge-tfa\" => \"2020-09-13T21:40:24Z\"\n\"tfa-basilio-tfa\" => \"2020-07-14T06:49:29Z\"\n\"tfa-alien-tfa\" => \"2020-09-05T07:35:52Z\"\n\"tfa-miguel-angel-tfa\" => \"2020-09-15T13:19:47Z\"\n\"tfa-esther-sergio-tfa\" => \"2020-07-10T08:53:04Z\"\n...\n\n\nLEARN MORE\n\nUse gh <command> <subcommand> --help for more information about a command.\n Read the manual at https://cli.github.com/manual\n\nGraphQL Example\n\nGraphQL is a query language for web services APIs and a runtime for fulfilling those queries with your existing data. GraphQL provides a complete and understandable description of the data in your API, gives clients the power to ask for exactly what they need and nothing more.\n\nFollows an example of query using GraphQL.\n\nWe can set the GraphQL query in a separated file:\n\n1\n➜ bin git:(master) cat gh-api-example.graphql\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\nquery {\n repository(owner:\"ULL-MII-SYTWS-2021\", name:\"p01-t1-iaas-alu0101040882\") {\n issues(last:2, states:OPEN) {\n edges {\n node {\n title\n url\n labels(first:5) {\n edges {\n node {\n name\n }\n }\n }\n }\n }\n }\n }\n}\n\n\nTo learn more, see the tutorial Forming calls with GraphQL\n.\n\nLooking at the composition line by line:\n\n1\nquery {\n\n\nBecause we want to read data from the server, not modify it, query is the root operation. (If you don’t specify an operation, query is also the default.)\n\n1\nrepository(owner:\"ULL-MII-SYTWS-2021\", name:\"p01-t1-iaas-alu0101040882\") \n\n\nTo begin the query, we want to find a repository object. The schema validation indicates this object requires an owner and a name argument. A schema defines a GraphQL API’s type system. It describes the complete set of possible data (objects, fields, relationships, everything) that a client can access\n\n1\nissues(last:2, states:OPEN) {\n\n\nA field is a unit of data you can retrieve from an object. As the official GraphQL docs say: The GraphQL query language is basically about selecting fields on objects.\n\nTo account for all issues in the repository, we call the issues object.\n\nSome details about the issues object:\n\nThe docs tell us this object has the type IssueConnection.\n\nSchema validation indicates this object requires a last or first number of results as an argument, so we provide 2.\n\nThe docs also tell us this object accepts a states argument, which is an IssueState enum that accepts OPEN or CLOSED values.\n\nTo find only open issues, we give the states key a value of OPEN.\n\n1\nedges {\n\n\nEdges represent connections between nodes. When you query a connection, you traverse its edges to get to its nodes.\n\nWe know issues is a *connection** because the Doc says it has the IssueConnection type.\n\nConnections let us query related objects as part of the same call. With connections, we can use a single GraphQL call where we would have to use multiple calls to a REST API.\n\nTo retrieve data about individual issues, we have to access the node via edges.\n\n1\nnode {\n\n\nHere we retrieve the node at the end of the edge. \nThe IssueConnection docs indicate the node at the end of the IssueConnection type is an Issue object.\n\nNow that we know we’re retrieving an Issue object, we can look at the docs for issue and specify the fields we want to return:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\ntitle\nurl\nlabels(first:5) {\n edges {\n node {\n name\n }\n }\n}\n\n\nHere we specify the title, url, and labels fields of the Issue object.\n\nThe labels field has the type LabelConnection. As with the issues object, because labels is a connection, we must travel its edges to a connected node: the label object. At the node, we can specify the label object fields we want to return, in this case, name.\n\nIn gh, the --field flag behaves like --raw-field with magic type conversion based on the format of the value:\n\n\n literal values “true”, “false”, “null”, and integer numbers get converted to appropriate JSON types;\n placeholder values “:owner”, “:repo”, and “:branch” get populated with values from the repository of the current directory;\n if the value starts with “@”, the rest of the value is interpreted as a filename to read the value from. Pass “-“ to read from standard input.\n\n\nFor GraphQL requests, all fields other than “query” and “operationName” are interpreted as GraphQL variables.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n➜ bin git:(master) gh api graphql --paginate -F query=@gh-api-example.graphql | jq .\n{\n \"data\": {\n \"repository\": {\n \"issues\": {\n \"edges\": [\n {\n \"node\": {\n \"title\": \"Revisión\",\n \"url\": \"https://github.com/ULL-MII-SYTWS-2021/p01-t1-iaas-alu0101040882/issues/2\",\n \"labels\": {\n \"edges\": [\n {\n \"node\": {\n \"name\": \"enhancement\"\n }\n }\n ]\n }\n }\n }\n ]\n }\n }\n }\n}\n\n\nDescripción de la práctica p6-t1-gh-cli\n\nDescripción de la práctica p6-t1-gh-cli\n\nReferences\n\n\n Blog: GitHub CLI is Now Available: Here’s Why You Should Be Excited by \nKasun Rajapakse\n\n", "url": "/tema1-introduccion/gh.html" }, { "title": "Uso del iaas.ull.es. Entornos de Trabajo", "excerpt": "\n", "content": "Uso del iaas.ull.es. Entornos de Trabajo\n\n\n Instrucciones para el uso de iaas.ull.es\n Repo SYTW/iaas-ull-es: Instrucciones Sobre Como Desplegar una Aplicación Web en iaas.ull.es\n Gestor online de pools\n IaaS - Uso de la aplicación de gestión de pools\n Video del profesor: iaas.ull.es\n https://iaas.ull.es/mismaquinas\n\n\nPrácticas\n\n\n Descripción de la Práctica p01-t1-iaas\n \n Express Web Framework (Node.js/JavaScript) (Mozilla)\n \n \n\n\n", "url": "/tema1-introduccion/iaas.html" }, { "title": "JQ", "excerpt": "\n", "content": "JQ\n\n{% include jq.md %}\n", "url": "/tema1-introduccion/jq.html" }, { "title": "Meta", "excerpt": "\n", "content": "Meta\n\nWhat is a Mono Repo\n\nIn revision control systems, a monorepo (“mono” from Greek μόνος, mónos, ‘single, alone’ and “repo” short for repository) is a software development strategy where code for many projects is stored in the same repository.\n\nA mono-repo is a repository containing all of the source for an organization. It presents source in a single, hierarchical directory structure. A mono-repo supports standard operations such as atomic commits and merges across the code it contains.\n\nCritically, in order to host all source for an organization, the performance of a mono-repo must not degrade as it grows in terms of:\n\n\n history (number of commits)\n amount of code (number of files and bytes)\n number of developers\n\n\nWhy doesn’t everyone have a mono-repo?\n\nMost organizations do not have a mono-repo because existing DVCS systems (e.g., Git and Mercurial) suffer performance degradation as the size of the repository and the number of users increase. Over time, basic operations such as git status, git fetch, etc. become slow enough that developers, given the opportunity, will begin splitting code into multiple repositories. Also may be some members are not allowed to have visibility access to some organization projects.\n\n\n Wikipedia on Mono Repo\n\n\nMeta\n\nmeta is a tool for managing multi-project systems and libraries.\n\nmeta is powered by plugins that wrap common commands, letting you execute them against some or all of the repos in your solution at once. meta is built on loop, and as such inherits loops ability to easily target a particular set of directories for executing a common command (eg meta git status --include-only dir1,dir2. See loop for more available options).\n\n\n See the README of the meta repo\n\n\nmeta project\n\n\n meta project import will add an existing project to your .meta file and clone it\n meta project create will add a new directory and git initialize it, and add the given remote\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n➜ meta git:(master) ✗ meta project help create\nUsage: meta-project-create <destFolder> <childRepoUrl>\n\nCreates a new folder and initializes git with provided remote.\n➜ meta git:(master) ✗ meta project help import\nUsage: meta-project-import <destFolder> <childRepoUrl>\n\nConfigures .meta file and imports a project from provided 'childRepoUrl' using git clone into 'destFolder'.\n\n\nI think we need to extend create with only a directory\n\nmeta git\n\nTo clone in step a meta-repo and all the sub repos yo do somthing like this:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n➜ my-first-plugin git:(master) ✗ meta git clone git@github.com:mateodelnorte/meta.git\nmeta:\nCloning into 'meta'...\nremote: Enumerating objects: 4, done.\nremote: Counting objects: 100% (4/4), done.\nremote: Compressing objects: 100% (4/4), done.\nremote: Total 1096 (delta 0), reused 1 (delta 0), pack-reused 1092\nReceiving objects: 100% (1096/1096), 1.21 MiB | 2.48 MiB/s, done.\nResolving deltas: 100% (698/698), done.\nmeta ✓\n\n/Users/casianorodriguezleon/campus-virtual/2021/learning/learning-meta/my-first-plugin/meta/plugins/symlink-meta-dependencies:\nCloning into 'plugins/symlink-meta-dependencies'...\nremote: Enumerating objects: 4, done.\nremote: Counting objects: 100% (4/4), done.\nremote: Compressing objects: 100% (4/4), done.\nremote: Total 111 (delta 0), reused 1 (delta 0), pack-reused 107\nReceiving objects: 100% (111/111), 159.40 KiB | 1.01 MiB/s, done.\nResolving deltas: 100% (50/50), done.\n\n...\n\n\n\nmeta git clone NOTE\n\nmeta git clone lacks the capacility to recursively clone nested meta projects.\nSee\n\nPlugins for Meta\n\n\n Developing a Plugin for Meta by Patrick Lee Scott\n Issue 144: How to write a plugin\n\n\nPráctica p5-t1-meta\n\n\n Descripción de la práctica p5-t1-meta\n\n", "url": "/tema1-introduccion/meta.html" }, { "title": "Capítulo. Módulos en NPM", "excerpt": "\n", "content": "Capítulo. Módulos en NPM\n\n\n Creación de Paquetes NPM (Apuntes)\n Ejemplo en https://github.com/ULL-ESIT-DSI-1617/create-a-npm-module\n \n Submódulo https://github.com/ULL-ESIT-DSI-1617/scapegoat\n Submódulo https://github.com/ULL-ESIT-DSI-1617/prueba-scapegoat\n \n \n About GitHub Package Registry\n \n GitHub Package Registry is a software package hosting service, similar to npmjs.org, rubygems.org, or hub.docker.com, that allows you to host your packages and code in one place. You can host software packages privately or publicly and use them as dependencies in your projects.\n \n \n Best practice: Specify global dependencies in your gulpfile\n Node.js — How to test your new NPM module without publishing it every 5 minutes\n Best practice: Better local require() paths for Node.js:\n \n When the directory structure of your Node.js application (not library!) has some depth, you end up with a lot of annoying relative paths in your require calls like:\n 1\nvar Article = require('../../../models/article');\n \n Those suck for maintenance and they’re ugly.\n \n \n \n Veáse la sección GitHub Package Registry de estos apuntes\n Using npm update and npm outdated to update dependencies\n\n\nCapítulo. Módulos en ECMA6\n\n\n Eloquent JS: Modules\n Book: Understanding ECMAScript 6. Chapter 13. Encapsulating Code With Modules\n \n What are Modules?\n Basic Exporting\n Basic Importing\n Renaming Exports and Imports\n Default Values in Modules\n Re-exporting a Binding\n Importing Without Bindings\n Loading Modules\n Summary\n \n \n ES6 Modules in Depth by Nicolás Bevacqua Sep 25th, 2015\n Exploring ES6 by Dr. Axel Rauschmayer. Capítulo: 16. Modules\n Exploring ES6 by Dr. Axel Rauschmayer. Sección 4.18 From CommonJS modules to ES6 modules\n ECMAScript modules in browsers by Jake Archibald\n Using ES6 modules natively in Node.js\n Ejemplos en ULL-ESIT-MII-CA-1718/ecma6-modules-examples\n Véase un ejemplo en la implementación del proyecto “Electronic Life” en la rama modules del repo ULL-ESIT-MII-CA-1718/electronic-life\n\n", "url": "/tema1-introduccion/modulos.html" }, { "title": "Debugging in Chrome", "excerpt": "\n", "content": "Debugging in Chrome\n\n\n Debugging in Chrome in the client in javascript.info\n\n\nDebugging NodeJS\n\nEn la terminal:\n\n1\n$ node --inspect-brk myprog\n\nEn el navegador abrimos la URL chrome://inspect y hacemos click en el enlace inspect\n\n\n Mis viejos apuntes: Debugging NodeJS\n Debugging in 2017 with Node.js YouTube video https://youtu.be/Xb_0awoShR8\n \n Debugging in 2017 with Node.js YouTube\n \n \n\n\nnvm\n\n\n Quick Tip: Install Multiple Versions of Node.js using nvm\n Node Version Manager - Simple bash script to manage multiple active node.js versions\n\n\nEloquent JS Book Chapter 20\n\n\n Eloquent JS Book Chapter 20: Node.js\n\n\nAnatomy of an HTTP Transaction\n\n\n Anatomy of an HTTP Transaction\n\n\nThe book “Node.js 8 the Right Way”. Chapter 2: Wrangling the File System\n\n\n Node.js 8 the Right Way Practical, Server-Side JS that Scales. Jim R. Wilson 2018 Edition. Safari. Chapter 2: Wrangling the File System. Acceda por medio del PuntoQ de la ULL\n Chapter 2: Wrangling the File System. GitHub Repo. Folder with Solutions to Chapter 2 Privado\n \n Book “Node.js 8 the Right Way” 2018 Edition Google Books\n Book “Node.js 8 the Right Way” Old Edition in GitHub\n \n \n Node.JS 8 The Right Way. Practical Server-Side That Scales: Repo with the solutions (all chapters)\n Read section The HTTP module from Eloquent Javascript 2nd edition\n Read section A File Server from Eloquent Javascript 2nd edition\n\n\nJavaScript Event Loop\n\n\n Tutorial Concurrency model and Event Loop\n\n\nStreams\n\n\n A Brief History of Node Streams\n A Brief History of Node Streams. Part 2\n\n\nPrácticas\n\n\n Descripción de la práctica p2-t1-c3-filesystem\n Descripción de la práctica p3-t1-c3-http\n\n\nGet Started With Node: An Introduction To APIs, HTTP And ES6+ JavaScript\n\n\n Get Started With Node: An Introduction To APIs, HTTP And ES6+ JavaScript\n Smashing Magazine\n Getting Started With An Express And ES6+ JavaScript Stack\n\n", "url": "/tema1-introduccion/node.html" }, { "title": "ECMA5 OOP", "excerpt": "\n", "content": "ECMA5 OOP\n\nThe Secret Life of Objects\n\n\n Repo ULL-ESIT-DSI-1617/oop-eloquentjs-example conteniendo el ejemplo “Laying out a table” del Chapter 6: The Secret Life of Objects\n The Secret Life of Objects example explained\n jsfiddle ilustrativo\n\n\nProject Electronic Life\n\n\n OOP in JavaScript in ECMA5. Eloquent JS 2nd Edition: Project: Electronic Life\n \n Repos Electronic Life in ULL-ESIT-MII-CA-1718\n Emojis\n \n js-emoji\n emojipedia\n Ejemplo sencillo ULL-ESIT-MII-CA-1718/emoji-js\n \n \n \n \n\n\nHerencia\n\n\n Repo con ejemplos de Herencia\n Tutorial Conversor de Temperaturas (gh-pages en GitHub)\n Repo ULL-ESIT-GRADOII-PL/ull-etsii-grado-pl-1213-temperature-converter\n\n\nECMA6 OOP\n\n\n OOP in JavaScript in Ecma6. Eloquent JS: The Secret Life of Objects\n ECMAScript 6 Power Tutorial: Class and Inheritance\n Object-Oriented JavaScript — A Deep Dive into ES6 Classes\n\n", "url": "/tema1-introduccion/oop.html" }, { "title": "Reto Async para Chapter 2. Wrangling the File System", "excerpt": "\n", "content": "Reto Async para Chapter 2. Wrangling the File System\n\nEscriba un programa Node.js que usando fs.readFile lea un conjunto de ficheros pasados en vía de comandos y produzca como salida la concatenación de los mismos en el orden especificado. Evite usar fs.readFileSync:\n\n1\n$ concat -f one.txt -f two.txt -f three.txt -o salida.txt\n\n\nCon commander es posible indicar una opción que se puede repetir\n\n1\n2\n3\n4\n5\n6\n7\nconst program = require('commander');\nfunction collect(value, previous) {\n return previous.concat([value]);\n}\nprogram.option('-c, --collect <value>', 'repeatable value', collect, []);\nprogram.parse(process.argv);\nconsole.log(program.collect)\n\n\n1\n2\n$ node repeatable-option-commander.js -c a -c b -c c\n[ 'a', 'b', 'c' ]\n\n\n\n Lea la sección The Async Module de los apuntes y encuentre una solución usando Async. Considere la posibilidad la posibilidad de excepciones debidas a que alguno de los ficheros no exista\n Encuentre una solución sin hacer uso de Async ¿Cómo lo haría?\n Haciendo abstracción de la solución encontrada en el paso anterior escriba una función asyncMap que funcione como el map del módulo Async:\n\n\n1\n asyncMap(inputs, (item, cb) => fs.readFile(item, cb), (err, contents) => { ... });\n\n", "url": "/tema1-introduccion/practicas/p2-t1-c3-file-system/reto-async.html" }, { "title": "Reto 1 para Chapter 2. Wrangling the File System", "excerpt": "\n", "content": "Reto 1 para Chapter 2. Wrangling the File System\n\nCuando al comando ssh se le pasa además del destino un argumento adicional lo interpreta como un comando y lo ejecuta en la máquina de destino:\n\n1\n2\n3\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ ssh dsi ls\nlabs\nsnap\n\n\nEscriba un programa en Node.js\nque ejecute en remoto usando ssh el programa Node.js pasado como argumento en línea de comandos:\n\n1\n2\n3\n4\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ ./remote-node.js 'console.log(4*5)'\nchild stdout:\n20\nchild process exited with code 0 and signal null\n\n\nAquí las comillas simples 'console.log(4*5)' son esenciales \npara proteger la cadena de su interpretación por la bash shell.\n\nEste programa se conecta vía ssh a la máquina virtual de iaas.ull.es del pool de la asignatura y ejecuta node -e 'console.log(4*5)'.\nEsto es, es equivalente a el siguiente comando:\n\n1\n2\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ ssh dsi \"node -e 'console.log(4*5)'\"\n20\n\nsol-nodejs-the-right-way/filesystem-chapter-2º\n\nSugerencias:\n\n\n Cuando al intérprete de Node.js se le pasa la opción -e interpreta que el programa es la cadena que sigue a la opción -e. Ejemplo:\n 1\n2\n [~/campus-virtual/1819/dsi1819/introduccion(master)]$ node -e 'console.log(2+3)'\n 5\n \n \n Use spawn para crear un proceso que ejecuta ssh\n Pase como argumentos a ssh el comando node con el argumento -e y el programa proveido en línea de comandos\n Ponga manejadores/callbacks on('data') para los streams stdout y stderr del proceso ejecutando la ssh de manera \nque vuelquen en la consola los chunks que van llegando\n\n\nNOTA (para el profesor):\n1\n2\n3\n4\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ pwd -P\n/Users/casiano/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ ls -l remote-node.js \n-rwxr-xr-x 1 casiano staff 701 16 feb 12:29 remote-node.js\n\n\nReto 2 para Chapter 2. Wrangling the File System\n\nEscriba un programa en Node.js\nque ejecute en remoto usando ssh el programa Node.js cuyo nombre es pasado como argumento en línea de comandos.\n\n1\n2\n3\n4\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ node dsi-node.js program.js\nchild stdout:\n5\nchild process exited with code 0 and signal null\n\n\nEl fichero program.js se supone que está en la máquina local. Deberá transferirlo a la máquina remota (use scp) para su posterior ejecución. El comando scp permite transferir ficheros entre máquinas usando ssh:\n\n1\n2\n3\n4\n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ scp watcher.js dsi:/tmp/w.js\nwatcher.js 100% 1229 8.8KB/s 00:00 \n[~/local/src/CA/sol-nodejs-the-right-way/filesystem-chapter-2(master)]$ ssh dsi ls '/tmp/w*' \n/tmp/w.js\n\n\n", "url": "/tema1-introduccion/practicas/p2-t1-c3-file-system/reto.html" }, { "title": "Challenge 1: Content negotiation", "excerpt": "\n", "content": "Challenge 1: Content negotiation\n\nOne of the things that HTTP can do, is called content negotiation.\n\nThe Accept header for a request can be used to tell the server what type of document the client would like to get.\n\nSome servers ignore this header, but when a server knows of various ways to encode a resource, \nit can look at this header and send the one that the client prefers.\n\nThe URL http://eloquentjavascript.net/author is configured to respond with either\n\n\n plaintext,\n HTML, or\n JSON,\n\n\ndepending on what the client asks for.\n\nThese formats are identified by the standardized media types text/plain, text/html, and application/json.\n\nWrite a Node.js client that send requests to fetch all three formats of this resource:\n\n1\n2\n3\n4\n5\n6\n[\"text/plain\", \"text/html\", \"application/json\"].forEach(function(type) {\n http.request({\n hostname: \"eloquentjavascript.net\",\n path: \"/author\", \n headers: {Accept: type} \n }, ...\n\n\nUse Node’s http.request function. \nThe headers of a request can be given as an object, in the headers property of http.request’s first argument.\n\n1\n2\n3\n4\n5\nhttp.request({\n hostname: \"eloquentjavascript.net\",\n path: \"/author\", \n headers: {Accept: type} \n }\n\n\nWrite out the content of the responses to each request.\n\nDon’t forget to call the end method on the object returned by http.request in order to actually fire off the request.\n\n1\n2\n3\n4\n5\n6\n7\n8\n[\"text/plain\", \"text/html\", \"application/json\"].forEach(function(type) {\n http.request({\n hostname: \"eloquentjavascript.net\",\n path: \"/author\", \n headers: {Accept: type} \n }, function(response) {\n ...\n }).end();\n\n\nThe response object passed to http.request’s callback is a readable stream.\n\nThis means that you must collect the chunks to get the whole response body from it.\n\nThe following utility function reads a whole stream and calls a callback function with the result, \nusing the usual pattern of passing any errors it encounters as the first argument to the callback:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nfunction readStreamAsString(stream, callback) {\n var data = \"\";\n stream.on(\"data\", function(chunk) {\n data += chunk.toString();\n });\n stream.on(\"end\", function() {\n callback(null, data);\n });\n stream.on(\"error\", function(error) {\n callback(error);\n });\n}\n\n\nMake use this of this utility function inside your request callback to read the response and dump it\nto the console.\n\n1\n2\n3\n4\n5\n[~/EJS/chapter20-node-js/chapter20-node-js-crguezl/exercises/content-negotiation-again(master)]$ ls -l\ntotal 8\n-rw-r--r-- 1 casiano staff 817 25 feb 13:10 index.js\n[~/EJS/chapter20-node-js/chapter20-node-js-crguezl/exercises/content-negotiation-again(master)]$ pwd -P\n/Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/chapter20-node-js-crguezl/exercises/content-negotiation-again\n\n\nReto 2: Fixing a leak\n\nFor easy remote access to some files, I might get into the habit\nof having the file server defined in this chapter running on my\nmachine, in the /home/marijn/public directory. Then, one day, I\nfind that someone has gained access to all the passwords I stored\nin my browser.\n\nWhat happened?\n\nIf it isn’t clear to you yet, think back to the urlToPath function, defined like this:\n\n1\n2\n3\n4\nfunction urlToPath(url) {\n var path = require(\"url\").parse(url).pathname;\n return \".\" + decodeURIComponent(path);\n}\n\nNow consider the fact that paths passed to the fs functions can\nbe relative—they may contain ../ to go up a directory. What happens\nwhen a client sends requests to URLs like the ones shown here?\n\n1\n2\n3\nhttp://myhostname:8000/../.config/config/google-chrome/Default/Web%20Data\nhttp://myhostname:8000/../.ssh/id_dsa\nhttp://myhostname:8000/../../../etc/passwd\n\n\n\n Change urlToPath to fix this problem. Take into account the fact\nthat Node on Windows allows both forward slashes and backslashes\nto separate directories.\n It is enough to strip out all occurrences of two dots that have a\nslash, a backslash, or the end of the string on both sides.\n Using the replace method with a regular expression is the easiest way to\ndo this.\n But since such instances may overlap (as in /../../f),\nyou may have to apply replace multiple times, until the string no\nlonger changes.\n Also make sure you do the replace after decoding\nthe string, or it would be possible to foil the check by encoding\na dot or a slash.\n\n\nAnother potentially worrying case is when paths start with a slash,\nwhich are interpreted as absolute paths.\n\nBut because urlToPath puts\na dot character in front of the path, it is impossible to create\nrequests that result in such a path.\n\nMultiple slashes in a row,\ninside the path, are odd but will be treated as a single slash by\nthe file system.\n\nHere is a Solution\n", "url": "/tema1-introduccion/practicas/p3-t1-c3-http/reto.html" }, { "title": "Pruebas, Integración y Calidad", "excerpt": "\n", "content": "Pruebas, Integración y Calidad\n\nNode.js the RW: Chapter 5. Transforming Data and Testing Continuously\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way. Chapter 5. Transforming Data and Testing Continuously\n Safari. Node.js The Right Way. Chapter 5 Transforming Data and Testing Continuously\n BULL PuntoQ\n\n\nApuntes sobre Herramientas para Pruebas\n\n\n Sección Pruebas en los Apuntes del curso 16/17\n \n Mocha\n Should\n Travis\n Chai\n Sinon\n Karma\n Covering\n Blanket\n Istanbul\n BrowserSync\n \n \n\n\nPruebas en el Navegador/Browser\n\n\n Learning JavaScript Test-Driven Development by Example SitePoint Tutorial\n Mocha y Chai en el navegador. Apuntes del curso 15/16\n Testing your frontend JavaScript code using mocha, chai, and sinon. Nicolas Perriault\n Covering\n \n Blanket\n Istanbul\n BrowserSync\n \n \n\n", "url": "/tema1-introduccion/pruebas.html" }, { "title": "WRITING NODE.JS MODULES IN C++", "excerpt": "\n", "content": "WRITING NODE.JS MODULES IN C++\n\n\n Writing Node.js modules in C++\n Repo\n\n\n", "url": "/tema1-introduccion/v8.html" }, { "title": "Programación Asíncrona en ECMA 6", "excerpt": "\n", "content": "Programación Asíncrona en ECMA 6\n\n{% include event-loop.md %}\n\nEvent Loop\n\n\n Introducción al Bucle de Eventos, Las Race Conditions, Las Promesas y los Web Workers\n Callbacks: https://javascript.info/callbacks\n Concurrency model and the event loop: Mozilla Developers\n Philip Roberts: ¿Que diablos es el “event loop” (bucle de eventos) de todos modos? (JSConf EU)\n loupe a tool n the cloud to see the event loop working\n\n\nPromesas, Async/Await\n\n\n Introducción al Bucle de Eventos, Las Race Conditions, Las Promesas y los Web Workers\n\n\nJavascript.info: The Modern JavaScript Tutorial. Chapter Promises, async/await\n\n\n Introduction: callbacks\n Promises: Basics: https://javascript.info/promise-basics\n Promise Chaining\n Error handling with promises\n Promise API\n Promisification\n Microtasks\n Async/await\n\n\nWriting Asynchronous Tasks In Modern JavaScript\n\n\n Writing Asynchronous Tasks In Modern JavaScript Smashing Magazine\n\n\nEdX: Asynchronous Programming with JS\n\n\n Asynchronous Programming with Javascript EdX Course\n \n GitHub repoULL-MII-CA-1819/async-js\n \n \n Asynchronous Iterators in JavaScript by Tiago Lopes\n\n\nGenerators and Iterators\n\nJavascript.info: The Modern JavaScript Tutorial. Chapter Generators, advanced iteration\n\n\n Generators\n Async iterators and generators\n\n\nHandling Events\n\n\n Eloquent JS. Chapter 14: Handling Events\n \n Repo ULL-ESIT-MII-CA-1718/ejs-chapter14-handling-events con ejemplos y ejercicios\n \n \n SitePoint Article: How to Create Custom Events in JavaScript\n\n\nEjercicios\n\n\n Ejercicios de Promesas\n\n\nPrácticas\n\n\n Descripción de la práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) p7-t2-async-js-edx\n\n\nReferencias\n\n\n Asynchronous Programming with Javascript EdX Course\n \n GitHub repoULL-MII-CA-1819/async-js\n \n \n Vídeo Cómo funciona Async/Await en menos de 15 minutos YouTube Vídeo por Appdelante\n Book Exploring ES6\n \n Book Exploring ES6: 24. Asynchronous programming (background) \n Book Exploring ES6: 25. Promises for asynchronous programming\n \n \n Book Understanding ECMAScript 6\n \n Book Understanding ECMAScript 6: Iterators and Generators\n Book Understanding ECMAScript 6: Promises and Asynchronous Programming\n \n \n Book You Don’t Know JS: Chapter Async & Performance\n Book ASYNC JavaScript: Build More Responsive Apps with Less Code\n Node.js 8: util.promisify() by Dr. Axel Rauschmayer\n Async examples in JS in GitHub\n Book Eloquent JS: Handling Events\n Curso JavaScript Promises en Udacity\n Book The Modern Javascript Tutorial. Chapter Promises, async/await\n Promises Workshop for JavaScript! Learn to wield promises like a master to write clean asynchronous code GitHub Repo. A Workshopper module that teaches you to use promises in javascript\n\n", "url": "/tema2-async-1920/async.html" }, { "title": "Node.js EventEmitters", "excerpt": "\n", "content": "Node.js EventEmitters\n\nThe Observer Pattern\n\n\n The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.\n\n\n\n\nSee also\n\n\n Learning JavaScript Design Patterns. A book by Addy Osmani\n\n\nLa Clase EventEmitter\n\n\n Algunos métodos de los objetos de la clase EventEmitter:\n\n\n\n\non\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ node\nWelcome to Node.js v12.10.0.\nType \".help\" for more information.\n> const {EventEmitter} = require(\"events\")\nundefined\n> function c1() { console.log('an event occurred!');}\nundefined\n> function c2() { console.log('yet another event occurred!');}\nundefined\n> const myEmitter = new EventEmitter();\nundefined\n> myEmitter.on('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] { eventOne: [Function: c1] },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.on('eventOne', c2)\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ]\n },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne');\nan event occurred!\nyet another event occurred!\ntrue\n\nonce\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n> myEmitter.once('eventOnce', () => console.log('eventOnce once fired')); \nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n eventOnce: [Function: bound onceWrapper] { listener: [Function] }\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOnce');\neventOnce once fired\ntrue\n> myEmitter.emit('eventOnce');\nfalse\n> myEmitter.emit('eventOnce');\nfalse\n\nArgumentos\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n> myEmitter.on('status', (code, msg)=> console.log(`Got ${code} and ${msg}`));\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('status', 200, 'ok');\nGot 200 and ok\n\n\noff\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n> myEmitter.off('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [Function: c2],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne'); \nyet another event occurred!\ntrue\n\n\nlistenerCount and rawListeners\n\n1\n2\n3\n4\n> myEmitter.listenerCount('eventOne')\n1\n> myEmitter.rawListeners('eventOne')\n[ [Function: c2] ]\n\n\nEjercicio\n\nVamos ahora a escribir una clase WithTime cuyos objetos disponen de un método execute que permite ejecutar \nuna función asíncrona asyncfun que acepta como último argumento una callback cb.\n\nComo es habitual, se supone que la callback es llamada cb(err, data) por asyncfun cuando esta termina su tarea asíncrona.\n\nEl primer parámetro err indica el error si lo hubo y el segundo data con el resultado de la operación asíncrona: cb(err, data).\n\nSe pide que:\n\n\n La función execute emita eventos begin y end señalando el comienzo y final de la ejecución de asyncfun\n Deberá así mismo emitir un evento result con el resultado de la operación asíncrona.\n Deberá emitir un evento time indicando el tiempo que ha tomado la ejecución en nanosegundos (use process.hrtime.bigint para ello)\n\n\nPor ejemplo, un código como:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\nconst inspect = require(\"util\").inspect;\nconst ins = (x) => inspect(x, {depth: Infinity, colors: true});\nconst fetch = require(\"node-fetch\");\nconst WithTime = require(\"./with-time.js\");\n\nconst withTime = new WithTime();\n\nwithTime.on('begin', (label) => console.log('About to execute '+label));\n\nwithTime.on('end', (label) => console.log('Done with execution of '+label));\n\nwithTime.on('result', (label, data) => console.log('Function '+label+' produced:\\n'+ins(data)));\n\nwithTime.on('time', (label, t) => console.log('Function '+label+' took '+t+' nanoseconds'));\n\nconst readFile = (url, cb) => {\n fetch(url)\n .then((resp) => resp.json())\n .then(function(data) {\n cb(null, data);\n })\n .catch(e => console.log(`Buf!\\n${e}`));\n}\n\nwithTime.execute(readFile, 'https://jsonplaceholder.typicode.com/posts/3');\n\n\nDebería producir una salida como está:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nAbout to execute readFile\nFunction readFile produced:\n{\n userId: 1,\n id: 3,\n title: 'ea molestias quasi exercitationem repellat qui ipsa sit aut',\n body: 'et iusto sed quo iure\\n' +\n 'voluptatem occaecati omnis eligendi aut ad\\n' +\n 'voluptatem doloribus vel accusantium quis pariatur\\n' +\n 'molestiae porro eius odio et labore et velit aut'\n}\nFunction readFile took 331675217 nanoseconds\nDone with execution of readFile\n\n\nEsta es una Solución\n\n1\n[~/.../networking-with-sockets-chapter-3-crguezl/event-emitter-tutorial(master)]$ cat with-time.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\nconst { EventEmitter } = require(\"events\");\n\nclass WithTime extends EventEmitter {\n\n // This function executes asyncFunc(...args)\n execute(asyncFunc, ...args) {\n let label = asyncFunc.name;\n\n this.emit('begin', label);\n let old = process.hrtime.bigint();\n asyncFunc(...args, (err, data) => {\n if (err) { \n this.emit('error', err); \n } else {\n this.emit('result', label, data);\n this.emit('time', label, process.hrtime.bigint() - old);\n this.emit('end', label);\n }\n });\n }\n\n}\n\nmodule.exports = WithTime;\n\n", "url": "/tema2-async-1920/event-emitter.html" }, { "title": "new Promise(executor);", "excerpt": "\n", "content": "new Promise(executor);\n\nParameters\n\nexecutor\n\nA function that is passed with the arguments resolve and reject.\n\nThe executor function is executed immediately by the Promise implementation, \npassing resolve and reject functions\n\n(the executor is called before the Promise constructor even returns the created object).\n\nThe resolve and reject functions, when called, resolve or reject the promise, respectively.\n\nThe executor normally initiates some asynchronous work, and then, once that completes, either calls the resolve function to resolve the promise or else rejects it if an error occurred. \nIf an error is thrown in the executor function, the promise is rejected.\n\nTo Exercises Description\n\nThe return value of the executor is ignored.\n", "url": "/tema2-async-1920/exercises/promises/exception-inside-promise/executor.html" }, { "title": "Capítulo 2: Message Queues", "excerpt": "\n", "content": "Capítulo 2: Message Queues\n\n0MQ\n\n Building Distributed Systems with Node.js and ØMQ Jim Wilson Talk\n Using ZeroMQ with Node.js\n Repo Connecting Robust Microservices\n GitHub Repo ULL-MII-CA-1819/nodejs-the-right-way Chapter 4: Connecting Robust Microservices\n\n\nPrácticas\n\n\n Descripción de la práctica Connecting Robust Microservices (p6-t2-microservices)\n\n\nRabbitMQ\n\n Part 1: RabbitMQ for beginners - What is RabbitMQ?\n Part 2.2: Getting started with RabbitMQ and Node.js\n CloudAMQP with Node.js Getting started\n Repo ULL-MII-CA-1819/rabbit-mq-learning with my experience with RabbitMQ\n\n", "url": "/tema2-async-1920/message-queues.html" }, { "title": "Módulos en ECMA5", "excerpt": "\n", "content": "Módulos en ECMA5\n\n\n Módulos en ECMA5. Eloquent JS. Capítulo 10\n \n Repo de Ejemplo del Capítulo 10\n Repo de Ejemplo del Capítulo 10: Sección Require\n Repo de Ejemplo del Capítulo 10: Sección Slow-loading modules\n \n \n ECMA5. The revealing module pattern: Again with the Module Pattern – reveal something to the world\n JavaScript Module Systems Showdown: CommonJS vs AMD vs ES2015\n\n", "url": "/tema2-async-1920/modulos-ecma5.html" }, { "title": "Reto para la práctica p4-t2-networking", "excerpt": "\n", "content": "Reto para la práctica p4-t2-networking\n\nEscriba un servidor que permita un chat  donde los clientes se conectan\nvia telnet o netcat.\n\nCuando se arranca el sevidor debe decir algo como esto:\n\n1\n2\nserver$ node chat-server.js \nServer listening at http://localhost:8000\n\n\nDespués si se conecta un cliente, debe recibir un mensaje de bienvenida:\n\n1\n2\n1$ nc localhost 8000\nWelcome to telnet chat!\n\n\nEn la consola del server debe reflejarse que un cliente se ha conectado:\n\n1\n2\n3\nserver$ node chat-server.js \nServer listening at http://localhost:8000\nGuest1 joined this chat.\n\n\nSi desde otra terminal se conecta otro cliente …\n\n1\n2\n2$ nc localhost 8000\nWelcome to telnet chat!\n\n\ny un cliente escribe algo …\n\n1\n2\n3\n4\n1$ nc localhost 8000\nWelcome to telnet chat!\nGuest2 joined this chat.\nhello all!\n\n\ndebe reflejarse en el resto de los clientes:\n\n1\n2\n3\n2$ nc localhost 8000\nWelcome to telnet chat!\nGuest1> hello all!\n\n\nasí como en la consola del server:\n\n1\n2\n3\n4\n5\nserver$ node chat-server.js \nServer listening at http://localhost:8000\nGuest1 joined this chat.\nGuest2 joined this chat.\nGuest1> hello all!\n\n\nTips\n\n\n \n Es conveniente tener un array sockets en el que se guarden los sockets \ncreados para los clientes que están conectados\n\n 1\nlet sockets = [];\n \n \n \n Le será de ayuda una función broadcast que envía un messageque acaba \nde llegar de un cliente al resto de los clientes:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\nfunction broadcast(from, message) {\n // If there are no sockets, then don't broadcast any messages\n if (sockets.length !== 0) {\n // If there are clients remaining then broadcast message\n sockets.forEach((socket, index, array) => {\n // Dont send any messages to the sender\n ...\n });\n }\n};\n \n\n \n Documentación de forEach\n \n \n \n Cada vez que un cliente se desconecta deberemos eliminar el socket de dicho cliente\ndel array sockets\n \n Documentación de splice\n Documentación de indexOf\n \n \n\n\nPuede mejorar mucho la versión descrita aquí siguiendo este tutorial:\n\n\n Real-Time Chat With Node.js’ Readline & Socket.io\n\n\nRecursos para el profesor\n\n\n sol c\n Path: /Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3\n\n", "url": "/tema2-async-1920/practicas/p4-t2-networking/reto.html" }, { "title": "Retos para la práctica p6-t2-microservices", "excerpt": "\n", "content": "Retos para la práctica p6-t2-microservices\n\nReto 1: Granja de Trabajadores\n\nEn el paradigma de paralelismo conocido como Farm o Granja de\nProcesadores la tarea que se quiere realizar es dividida en un subconjunto de sub-tareas \nbastante mayor que el número de procesadores disponibles.\n\n Un procesador denominado maestro o capataz envia las\ntareas a los restantes procesos-trabajadores.\n Tan pronto como un trabajador devuelve el resultado de una subtarea el capataz le envía una\nnueva subtarea.\n El capataz combina el resultado parcial con los que\nhaya obtenido hasta ese momento para ir cosntruyendo la solución a la tarea inicial.\n\n\nUna ventaja que tiene este paradigma es que consigue equilibrar la carga de trabajo entre las máquinas,\n\n independientemente de que estas sean heterogéneas o no,\n independientemente de cual sea la carga dinámica de las estaciones por la presencia\nde otros procesos y usuarios e\n independientemente de que las tareas sean heterogéneas en sus necesidades de tiempo de cómputo.\n\n\nEn el siguiente código mostramos como usar los sockets ROUTER y DEALER de 0MQ junto \ncon los clusters de Node.js para crear un borrador de una granja de trabajadores:\n\nFichero connecting-robust-microservices-chapter-4/microservices/dealer.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n'use strict';\n\nconst PORT = require(\"./port.js\");\nconst ins = require(\"./ins.js\");\nconst cluster = require(\"cluster\");\nconst zmq = require(\"zeromq\");\n\nconst numWorkers = require(\"os\").cpus().length;\n\nconst randomBetween = (min, max) => Math.floor(Math.random() * (max - min) + min);\n\nfunction workerTask() {\n const dealer = zmq.socket('dealer');\n dealer.identity = process.env[\"identity\"]; \n\n console.log(\"identity \"+dealer.identity+\n \" process \"+process.pid+\" port = \"+PORT);\n\n dealer.connect('tcp://localhost:'+PORT);\n\n let total = 0;\n\n const sendMessage = () => dealer.send(['ready']);\n\n // Get workload from broker, until finished\n dealer.on('message', function onMessage(...args) {\n // console.log(\"Inside Worker. args = \"+ins(args.map(x => x.toString())));\n const workload = args[0].toString('utf8');\n //console.log(\"Inside Worker. workload = \"+workload);\n\n if (workload === 'stop') {\n console.log('Completed: '+total+' tasks ('+dealer.identity+' '+process.pid+')');\n dealer.removeListener('message', onMessage);\n // https://nodejs.org/api/events.html#events_emitter_removelistener_eventname_listener is a method of EventsEmitter\n dealer.close();\n return;\n }\n total++;\n\n // Simulate some work\n setTimeout(sendMessage, randomBetween(0, 500));\n });\n\n // Tell the broker we're ready for work\n sendMessage();\n}\n\nfunction main() {\n const broker = zmq.socket('router');\n //broker.bindSync('tcp://*:5671');\n broker.bind('tcp://*:'+PORT);\n\n let endTime = Date.now() + 5000\n , workersFired = 0;\n\n broker.on('message', function (...args) {\n // console.log(\"Inside Master. args = \"+ins(args.map(x => x.toString())));\n const identity = args[0]\n , now = Date.now();\n\n if (now < endTime) {\n broker.send([identity, 'more work']);\n } else {\n broker.send([identity, 'stop']);\n workersFired++;\n if (workersFired === numWorkers) {\n setImmediate(function () { // See https://nodejs.org/api/timers.html#timers_setimmediate_callback_args\n broker.close();\n cluster.disconnect();\n });\n }\n }\n });\n\n for (let i=0;i<numWorkers;i++) {\n cluster.fork({identity: \"worker\"+i});\n }\n}\n\nif (cluster.isMaster) main();\nelse workerTask();\n\n\nObserva que pese a que el worker envía solamente [ 'ready' ]:\n\n1\n2\n3\n4\n const sendMessage = () => dealer.send(['ready']);\n ...\n // Simulate some work\n setTimeout(sendMessage, randomBetween(0, 500));\n\n\nEn el master recibimos como primer elemento la identity del worker:\n\n1\n2\n3\n broker.on('message', function (...args) {\n // console.log(\"Inside Master. args = \"+ins(args.map(x => x.toString())));\n const identity = args[0]\n\nConsultemos la documentación de 0MQ:\n\n\n The ROUTER socket, unlike other sockets, tracks every connection\nit has, and tells the caller about these.\n The way it tells the caller is to stick the connection identity in front of each message\nreceived\n An identity, sometimes called an address, is just a binary\nstring with no meaning except “this is a unique handle to the\nconnection”\n Then, when you send a message via a ROUTER socket, you first send an identity frame.\n\n\nThe zmq_socket() man page describes it thus:\n\n\n When receiving messages a ZMQ_ROUTER socket shall prepend a message part containing the identity of the originating peer to the message before passing it to the application. Messages received are fair-queued from among all connected peers. \nWhen sending messages a ZMQ_ROUTER socket shall remove the first part of the message and use it to determine the identity of the peer the message shall be routed to.\n\n\nCuando ejecuto este programa, obtengo una salida parecida a esta:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n[~/.../microservices(master)]$ node dealer.js \nidentity worker0 process 56820 port = 60300\nidentity worker2 process 56822 port = 60300\nidentity worker3 process 56823 port = 60300\nidentity worker1 process 56821 port = 60300\nCompleted: 24 tasks (worker3 56823)\nCompleted: 22 tasks (worker2 56822)\nCompleted: 19 tasks (worker1 56821)\nCompleted: 18 tasks (worker0 56820)\n\n\nUsando 0MQ y paralelismo de granja, compute en paralelo una aproximación al número π aprovechando la siguiente fórmula:\n\n\\[\\int_{0}^{1} \\frac{4}{(1+x^2)} dx = 4 \\arctan(x) |_{0}^{1}\\ = 4 ( \\frac{\\pi}{4} - 0) = \\pi\\]\n\nPara computar π aproxime la integral mediante sumas de áreas de rectángulos:\n\n\n\n\n El capataz divide el intervalo [0,1] en un número de subintervalos bastante mayor que el número de trabajadores\n El capataz le indicará a cada trabajador para que intervalo debe calcular el área\n El trabajador computa el área haciendo la correspondiente suma de Riemann y la devuelve al capataz,\n El capataz añade dicha subárea al acumulador de área computada.\n El capataz envía un nuevo intervalo al trabajador si quedan intervalos por computar. En caso contrario envía un mensaje de parada.\n\n\nReto 2: Chat\n\nEscriba un chat de línea de comandos - con rooms - usando 0MQ.\n\n\n Use el patrón PUB/SUB.\n Use el “tópico” del patrón PUB/SUB para implantar las rooms\n \n \n En el servidor:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n publisher.send( [\"room-1\", // topic\n JSON.stringify(\n {\n type: \"message\",\n from: user,\n content: content\n }\n )\n ]\n \n \n \n En el cliente:\n\n 1\n2\n3\n4\n5\nsubscriber.on(\"message\", (room, data) => {\n console.log(room.toString());\n const message = JSON.parse(data);\n ...\n});\n \n \n \n \n En el cliente, para la lectura desde teclado use readline. Sigue un ejemplo:\n\n\nFichero local/src/javascript/learning/readline-examples/small-cli.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n const readline = require('readline');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: 'DSI> '\n });\n\n const bye = () => {\n console.log('Have a great day!');\n process.exit(0);\n };\n\n const methods = {\n hello: () => console.log(\"world\"),\n exit: () => bye(),\n default: (line) => console.log(`Say what? I might have heard '${line.trim()}'`),\n };\n\n rl.prompt();\n\n rl.on('line', (line) => {\n const choice = line.trim();\n if (choice in methods) methods[choice]();\n else methods['default'](line);\n rl.prompt();\n }).on('close', () => bye);\n\n\n El cliente envía sus mensajes al servidor usando un socket 0MQ REQ/REP.\nEl cliente envía su mensaje al servidor como un request JSON indicando la room a la que va dirigida. \nEl servidor, una vez recibe el mensaje en el socket REQ/REP, lo \npublica a los clientes conectados a la room especificada usando el socket PUB/SUB\n\n\n", "url": "/tema2-async-1920/practicas/p6-t2-microservices/reto.html" }, { "title": "Capítulo 4: RPC", "excerpt": "\n", "content": "Capítulo 4: RPC\n\nIn gRPC a client application can directly call methods on a server application on a different machine as if it was a local object, making it easier for you to create distributed applications and services. As in many RPC systems, gRPC is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types.\n\nOn the server side, the server implements this interface and runs a gRPC server to handle client calls. On the client side, the client has a stub (referred to as just a client in some languages) that provides the same methods as the server.\n\ngRPC clients and servers can run and talk to each other in a variety of environments - from servers inside Google to your own desktop - and can be written in any of gRPC’s supported languages. \nIn addition, the latest Google APIs will have gRPC versions of their interfaces, letting you easily build Google functionality into your applications.\n\n\n Intro to gRPC: A Modern Toolkit for Microservice Communication YouTube\n What is gRPC?\n \n gRPC Documentation\n \n \n\n", "url": "/tema2-async-1920/rpc.html" }, { "title": "Capítulo: Sockets", "excerpt": "\n", "content": "Capítulo: Sockets\n\nSockets TCP y UDP\n\n\n Safari. Chapter 3 Networking with Sockets\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n \n Networking with Sockets\n \n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP:\n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP\n \n \n\n\nPrácticas\n\n\n Descripción de la práctica p4-t2-networking\n\n", "url": "/tema2-async-1920/sockets.html" }, { "title": "The Async Module", "excerpt": "\n", "content": "The Async Module\n\nAsync is a utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. Although originally designed for use with Node.js and installable via\n\n1\nnpm install async\n\n\nit can also be used directly in the browser.\n\nMap\n\n1\n2\n3\nasync.map(['file1','file2','file3'], (file, cb) => fs.stat(file, cb), function(err, results) {\n // results is now an array of stats for each file\n}); \n\n\n\n Documentation of Map\n\n\n1\n2\n3\n4\n5\nmap(\n coll, \n (item, cb) => iteratee(item,cb), \n (err, results) => maincallback(err, results)\n )\n\n\n1\n2\n3\n import map from 'async/map'; \n // En Node.js\n const { map } = require('async')\n\n\n\n Produces a new collection of values by mapping each value in coll through the iteratee function.\n The iteratee is called with an item from coll and a callback cb for when it has finished processing.\n Each of these callbacks cb take 2 arguments: an error, and the result of iteratee(item).\n If iteratee passes an error to its callback cb, the maincallback (for the map function) is immediately called with the error.\n Note, that since this function applies the iteratee to each item in parallel, there is no guarantee that the iteratee functions will complete in order. However, the results array will be in the same order as the original coll.\n\n\nEjemplo: Concatenación de ficheros\n\nEl objetivo es escribir un programa que usando fs.readFile lea un conjunto de ficheros pasados en vía de comandos y produzca como salida la concatenación de los mismos en el orden especificado, sin usar lecturas síncronas. \nLa escritura debe ocurrir después que hayan terminado todas las lecturas.\n\nHe aquí una solución:\n\n1\n[~/.../ssh2-hello(master)]$ cat simp-reto-async-reading-multiple-files.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n'use strict';\n\nconst fs = require('fs'),\n { map } = require('async'),\n inputs = ['in1', 'in2'],\n output = 'out';\n\nmap(inputs, fs.readFile,\n (err, contents) => {\n if (err) console.log('Error: ' + error);\n else {\n const data = contents.reduce((a, b) => a + b);\n fs.writeFile(output, data, () => console.log(`Output in file '${output}'`)\n );\n }\n }\n);\n\n\nEjecución:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/.../ssh2-hello(master)]$ node simp-reto-async-reading-multiple-files.js\nOutput in file 'out'\n[~/.../ssh2-hello(master)]$ cat in1\nin1\nhi!\n[~/.../ssh2-hello(master)]$ cat in2\nin2\n[~/.../ssh2-hello(master)]$ cat out\nin1\nhi!\nin2\n\n\n¿Como lograría resolver este problema si no dispusiera de async.js?\n\nFilter\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\nasync.filter(\n ['file1','file2','file3'],\n (filePath, callback) => {\n fs.access(filePath, err => callback(null, !err)); // Tests a user's permissions for file\n }, \n function(err, results) {\n // results now equals an array of the existing files\n }\n); \n\n\n\n Documentation of filter\n\n\n1\n2\n3\nimport filter from 'async/filter';\n\nfilter(coll, iteratee, callbackopt)\n\n\n\n Returns a new array of all the values in coll which pass an async truth test.\n This operation is performed in parallel, but the results array will be in the same order as the original.\n iteratee is a truth test to apply to each item in coll.\n \n The iteratee is invoked with (item, callback)\n It is passed a callback(err, truthValue), which must be called with a boolean argument once it has completed\n \n \n\n\nParallel\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\nasync.parallel(\n [\n (callback) => {\n setTimeout(() => { callback(null, 'one'); }, 200);\n },\n (callback) => {\n setTimeout(() => { callback(null, 'two'); }, 100);\n }\n ],\n // optional callback\n (err, results) => {\n // the results array will equal ['one','two'] even though\n // the second function had a shorter timeout.\n});\n\n\n\n Documentation of Parallel\n\n\n1\n2\n3\n import parallel from 'async/parallel';\n\n parallel(tasks, callbackopt)\n\n\n\n Run the tasks collection of functions in parallel, without waiting until the previous function has completed.\n If any of the functions pass an error to its callback, the main callback is immediately called with the value of the error.\n Once the tasks have completed, the results are passed to the final callback as an array.\n\n\nHint: Use reflect to continue the execution of other tasks when a task fails.\n\nIt is also possible to use an object instead of an array\n\nEach property will be run as a function and the results will be passed to the final callback as an object instead of an array.\n\nThis can be a more readable way of handling results from async.parallel\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n\n// an example using an object instead of an array\nasync.parallel({\n one: function(callback) {\n setTimeout(function() {\n callback(null, 1);\n }, 200);\n },\n two: function(callback) {\n setTimeout(function() {\n callback(null, 2);\n }, 100);\n }\n}, function(err, results) {\n // results is now equals to: {one: 1, two: 2}\n});\n\n\nExample:\n\n1\n[~/.../Asyncjs]$ cat parallelTimers.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\nconst async = require ('async');\nconst start = new Date;\nasync.parallel([\n function(callback) { setTimeout(callback, 100); },\n function(callback) { setTimeout(callback, 300); },\n function(callback) { setTimeout(callback, 200); }\n], function(err, results) {\n console.log('Completed in ' + (new Date - start) + 'ms');\n});\n\n\nExecution:\n\n1\n2\n[~/.../async-js-book/Asyncjs]$ node parallelTimers.js\nCompleted in 305ms\n\n\nSeries\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\nasync.series([\n function(callback) {\n // do some stuff ...\n callback(null, 'one');\n },\n function(callback) {\n // do some more stuff ...\n callback(null, 'two');\n }\n],\n// optional callback\nfunction(err, results) {\n // results is now equal to ['one', 'two']\n});\n\n\n\n Documentation of series\n\n\nseries(tasks, callbackopt)\n\n1\nimport series from 'async/series';\n\n\n\n Run the functions in the tasks collection in series, each one running once the previous function has completed.\n If any functions in the series pass an error to its callback, no more functions are run, and callback is immediately called with the value of the error.\n Otherwise, callback receives an array of results when tasks have completed.\n\n\nIt is also possible to use an object instead of an array\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\nasync.series({\n one: function(callback) {\n setTimeout(function() {\n callback(null, 1);\n }, 200);\n },\n two: function(callback){\n setTimeout(function() {\n callback(null, 2);\n }, 100);\n }\n}, function(err, results) {\n // results is now equal to: {one: 1, two: 2}\n});\n\n\nEach property will be run as a function, and the results will be passed to the final callback as an object instead of an array.\n\nThis can be a more readable way of handling results from async.series.\n\nNote that while many implementations preserve the order of object properties, the ECMAScript Language Specification explicitly states that\n\n\n The mechanics and order of enumerating the properties is not specified.\n\n\nSo if you rely on the order in which your series of functions are executed, and want this to work on all platforms, consider using an array.\n\nExample\n\n1\n[~/.../async-js-book/Asyncjs]$ cat seriesTimers.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nconst async = require ('async');\n\nconst start = new Date;\n\nasync.series([\n function(callback) { setTimeout(callback, 100); },\n function(callback) { setTimeout(callback, 300); },\n function(callback) { setTimeout(callback, 200); }\n], function(err, results) {\n // show time elapsed since start\n console.log('Completed in ' + (new Date - start) + 'ms');\n});\n\n\n1\n2\n[~/.../async-js-book/Asyncjs]$ node seriesTimers.js\nCompleted in 618ms\n\n\nQueue\n\nSee Async.js: queue\n\nCreates a queue object with the specified concurrency. Tasks added to the queue are processed in parallel (up to the concurrency limit). If all worker’s are in progress, the task is queued until one becomes available. Once a worker completes a task, that task’s callback is called.\n\n1\n[~/.../async-js-book/Asyncjs]$ cat queue-example.js\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nconst async = require(\"async\");\nconst ir = (min, max) => Math.round((Math.random() * (max - min) + min))\nconst d = new Date();\nconst makeCb = (str) => (err => console.log('finished processing '+str+' '+(new Date() - d)));\n\nconst worker = (task, callback) => {\n setTimeout(\n () => {\n console.log('hello ' + task.name);\n callback();\n },ir(0,1000) // Wait a random time\n )\n};\n\n// create a queue object with concurrency 2\nconst q = async.queue(worker, 2);\n\n/*\n q.drain: a function that sets a callback that is called when the last item\n from the queue has returned from the worker.\n If the callback is omitted, q.drain() returns a promise for the next occurrence.\n*/\nq.drain(function() {\n console.log('worker finished and queue is empty');\n});\n\n// assign an error callback\nq.error(function(err, task) {\n console.error('task experienced an error '+err);\n});\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n[~/.../async-js-book/Asyncjs]$ node queue-example.js\nhello ear\nfinished processing ear 709\nhello bar\nfinished processing bar 961\nhello foo\nfinished processing foo 976\nhello baz\nfinished processing item 1186\nhello bay\nfinished processing item 1316\nhello bax\nfinished processing item 1323\nworker finished and queue is empty\n\n", "url": "/tema2-async/async-js.html" }, { "title": "Programación Asíncrona en ECMA 6", "excerpt": "\n", "content": "Programación Asíncrona en ECMA 6\n\nEvent Loop\n\n\n Introducción al Bucle de Eventos, Las Race Conditions, Las Promesas y los Web Workers\n\n\nPromises. Async/Await\n\nJavascript.info: The Modern JavaScript Tutorial. Chapter Promises, async/await\n\n\n Introduction: callbacks\n Promises: Basics: https://javascript.info/promise-basics\n Promise Chaining\n Error handling with promises\n Promise API\n Promisification\n Microtasks\n Async/await\n\n\nWriting Asynchronous Tasks In Modern JavaScript\n\n\n Writing Asynchronous Tasks In Modern JavaScript Smashing Magazine\n\n\nEdX: Asynchronous Programming with JS\n\n\n Asynchronous Programming with Javascript EdX Course\n \n GitHub repoULL-MII-CA-1819/async-js\n \n \n Asynchronous Iterators in JavaScript by Tiago Lopes\n\n\nGenerators and Iterators\n\nJavascript.info: The Modern JavaScript Tutorial. Chapter Generators, advanced iteration\n\n\n Generators\n Async iterators and generators\n\n\nHandling Events\n\n\n Eloquent JS. Chapter 14: Handling Events\n \n Repo ULL-ESIT-MII-CA-1718/ejs-chapter14-handling-events con ejemplos y ejercicios\n \n \n SitePoint Article: How to Create Custom Events in JavaScript\n\n\nEjercicios\n\n\n Ejercicios de Promesas\n\n\nPrácticas\n\n\n Descripción de la práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) p7-t2-async-js-edx\n\n\nReferencias\n\n\n Asynchronous Programming with Javascript EdX Course\n \n GitHub repoULL-MII-CA-1819/async-js\n \n \n Vídeo Cómo funciona Async/Await en menos de 15 minutos YouTube Vídeo por Appdelante\n Book Exploring ES6\n \n Book Exploring ES6: 24. Asynchronous programming (background) \n Book Exploring ES6: 25. Promises for asynchronous programming\n \n \n Book Understanding ECMAScript 6\n \n Book Understanding ECMAScript 6: Iterators and Generators\n Book Understanding ECMAScript 6: Promises and Asynchronous Programming\n \n \n Book You Don’t Know JS: Chapter Async & Performance\n Book ASYNC JavaScript: Build More Responsive Apps with Less Code\n Node.js 8: util.promisify() by Dr. Axel Rauschmayer\n Async examples in JS in GitHub\n Book Eloquent JS: Handling Events\n Curso JavaScript Promises en Udacity\n Book The Modern Javascript Tutorial. Chapter Promises, async/await\n Promises Workshop for JavaScript! Learn to wield promises like a master to write clean asynchronous code GitHub Repo. A Workshopper module that teaches you to use promises in javascript\n\n", "url": "/tema2-async/async.html" }, { "title": "Node.js EventEmitters", "excerpt": "\n", "content": "Node.js EventEmitters\n\nEventEmitter is a very important class in Node.js. It provides a channel for events to be dispatched and listeners to be notified. Many objects you’ll encounter in Node.js inherit from EventEmitter, like the Streams class.\n\nThe Observer Pattern\n\n\n The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.\n\n\n\n\nSee also\n\n\n Learning JavaScript Design Patterns. A book by Addy Osmani\n\n\nLa Clase EventEmitter\n\n\n Algunos métodos de los objetos de la clase EventEmitter:\n\n\n\n\non\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n[~/.../p4-t2-networking/networking-with-sockets-chapter-3-crguezl(master)]$ node\nWelcome to Node.js v12.10.0.\nType \".help\" for more information.\n> const {EventEmitter} = require(\"events\")\nundefined\n> function c1() { console.log('an event occurred!');}\nundefined\n> function c2() { console.log('yet another event occurred!');}\nundefined\n> const myEmitter = new EventEmitter();\nundefined\n> myEmitter.on('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] { eventOne: [Function: c1] },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.on('eventOne', c2)\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ]\n },\n _eventsCount: 1,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne');\nan event occurred!\nyet another event occurred!\ntrue\n\nonce\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n> myEmitter.once('eventOnce', () => console.log('eventOnce once fired')); \nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n eventOnce: [Function: bound onceWrapper] { listener: [Function] }\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOnce');\neventOnce once fired\ntrue\n> myEmitter.emit('eventOnce');\nfalse\n> myEmitter.emit('eventOnce');\nfalse\n\nArgumentos\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n> myEmitter.on('status', (code, msg)=> console.log(`Got ${code} and ${msg}`));\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [ [Function: c1], [Function: c2] ],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('status', 200, 'ok');\nGot 200 and ok\n\n\noff\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n> myEmitter.off('eventOne', c1);\nEventEmitter {\n _events: [Object: null prototype] {\n eventOne: [Function: c2],\n status: [Function]\n },\n _eventsCount: 2,\n _maxListeners: undefined\n}\n> myEmitter.emit('eventOne'); \nyet another event occurred!\ntrue\n\n\nlistenerCount and rawListeners\n\n1\n2\n3\n4\n> myEmitter.listenerCount('eventOne')\n1\n> myEmitter.rawListeners('eventOne')\n[ [Function: c2] ]\n\n\nEjercicio\n\nVamos ahora a escribir una clase WithTime cuyos objetos disponen de un método execute que permite ejecutar \nuna función asíncrona asyncfun que acepta como último argumento una callback cb.\n\nComo es habitual, se supone que la callback es llamada cb(err, data) por asyncfun cuando esta termina su tarea asíncrona.\n\nEl primer parámetro err indica el error si lo hubo y el segundo data con el resultado de la operación asíncrona: cb(err, data).\n\nSe pide que:\n\n\n La función execute emita eventos begin y end señalando el comienzo y final de la ejecución de asyncfun\n Deberá así mismo emitir un evento result con el resultado de la operación asíncrona.\n Deberá emitir un evento time indicando el tiempo que ha tomado la ejecución en nanosegundos (use process.hrtime.bigint para ello)\n\n\nPor ejemplo, un código como:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\nconst inspect = require(\"util\").inspect;\nconst ins = (x) => inspect(x, {depth: Infinity, colors: true});\nconst fetch = require(\"node-fetch\");\nconst WithTime = require(\"./with-time.js\");\n\nconst withTime = new WithTime();\n\nwithTime.on('begin', (label) => console.log('About to execute '+label));\n\nwithTime.on('end', (label) => console.log('Done with execution of '+label));\n\nwithTime.on('result', (label, data) => console.log('Function '+label+' produced:\\n'+ins(data)));\n\nwithTime.on('time', (label, t) => console.log('Function '+label+' took '+t+' nanoseconds'));\n\nconst readFile = (url, cb) => {\n fetch(url)\n .then((resp) => resp.json())\n .then(function(data) {\n cb(null, data);\n })\n .catch(e => console.log(`Buf!\\n${e}`));\n}\n\nwithTime.execute(readFile, 'https://jsonplaceholder.typicode.com/posts/3');\n\n\nDebería producir una salida como está:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nAbout to execute readFile\nFunction readFile produced:\n{\n userId: 1,\n id: 3,\n title: 'ea molestias quasi exercitationem repellat qui ipsa sit aut',\n body: 'et iusto sed quo iure\\n' +\n 'voluptatem occaecati omnis eligendi aut ad\\n' +\n 'voluptatem doloribus vel accusantium quis pariatur\\n' +\n 'molestiae porro eius odio et labore et velit aut'\n}\nFunction readFile took 331675217 nanoseconds\nDone with execution of readFile\n\n\nEsta es una Solución\n\n1\n[~/.../networking-with-sockets-chapter-3-crguezl/event-emitter-tutorial(master)]$ cat with-time.js \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\nconst { EventEmitter } = require(\"events\");\n\nclass WithTime extends EventEmitter {\n\n // This function executes asyncFunc(...args)\n execute(asyncFunc, ...args) {\n let label = asyncFunc.name;\n\n this.emit('begin', label);\n let old = process.hrtime.bigint();\n asyncFunc(...args, (err, data) => {\n if (err) { \n this.emit('error', err); \n } else {\n this.emit('result', label, data);\n this.emit('time', label, process.hrtime.bigint() - old);\n this.emit('end', label);\n }\n });\n }\n\n}\n\nmodule.exports = WithTime;\n\n", "url": "/tema2-async/event-emitter.html" }, { "title": "new Promise(executor);", "excerpt": "\n", "content": "new Promise(executor);\n\nParameters\n\nexecutor\n\nA function that is passed with the arguments resolve and reject.\n\nThe executor function is executed immediately by the Promise implementation, \npassing resolve and reject functions\n\n(the executor is called before the Promise constructor even returns the created object).\n\nThe resolve and reject functions, when called, resolve or reject the promise, respectively.\n\nThe executor normally initiates some asynchronous work, and then, once that completes, either calls the resolve function to resolve the promise or else rejects it if an error occurred. \nIf an error is thrown in the executor function, the promise is rejected.\n\nTo Exercises Description\n\nThe return value of the executor is ignored.\n", "url": "/tema2-async/event-loop/exercises/promises/exception-inside-promise/executor.html" }, { "title": "Solución", "excerpt": "\n", "content": "Solución\n\n1\n{% include_relative index.html %}\n\n\n\n Run the solution\n\n\n\n", "url": "/tema2-async/event-loop/exercises/promises/load-script/solution.html" }, { "title": "Race Conditions", "excerpt": "\n", "content": "Race Conditions\n\nLoading an image with some delay\n\nConsider this file index.html:\n\n1\n{% include_relative index.html %}\n\n\nExperiment\n\nCopy and open this file index.html with your browser.\nCan you see the infinite loop image?\n\nNow comment the line where waitFor is initialized and uncomment the other:\n\n1\nlet waitFor = 0;\n\n\nWhat do you think it will happen? Can you explain it?\n\nWhere is it:\n\n1\n2\n➜ race-condition git:(curso2021) ✗ ls ~/campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/race-condition\nindex.html infinity-loop.png instructions.md not-race-example.js race-example.js\n\n\nReferences\n\n\n Meta repo de la Charla UAI2015\n \n Repo de Ejemplo ULL-MII-SYTWS-1920/js-race\n \n \n Charla en InfoQ: https://www.infoq.com/presentations/javascript-concurrency-parallelism/\n \n Folders:\n\n 1\n2\n~/campus-virtual/2021/sytws2021/apuntes/tema2-async/event-loop/exercises/race-condition\n~/local/src/uai/uai2015/race-condition/index.html\n \n \n Abstract de la charla UAI2015\n Race Condition in JavaScript YouTube Video\n\n\nManually Interleaving Promises\n\nThis other example (using promises instead of callbacks) is taken from this blog:\n\n\n Yes, there are race conditions in JavaScript by Yuval Greenfield\n\n\nPromises are a (relatively) new way to handle asynchronous programming in JS. For an introduction to Promises see this section:\n\n\n Callbacks Problems and Promise Introduction\n\n\nFile race-example.js\n\n1\n{% include_relative race-example.js %}\n\n\nAn example of race condition in JavaScript.\nWhen you run this script using Node or in a browser, it\ndoes not print “Ended with 0”, but a random number.\n\n1\n2\n3\n4\n5\n6\n7\n➜ race-condition git:(curso2021) ✗ node race-example.js \nStarted with 0\nEnded with 3\nAll done\n➜ race-condition git:(curso2021) ✗ node race-example.js\nStarted with 0\nEnded with 20\n\n\nEven though the functions running\nsimply loop 100 iterations of adding and subtracting.\n\nThe reason the end result is random is because the\nsleeps are of random duration and the time between the read\nof the variable causes the eventual write to be incorrect\nwhen adder and subber interleave.\n\nThis problem is similar to:\n\nTime-of-check to time-of-use\n\n", "url": "/tema2-async/event-loop/exercises/race-condition/instructions.html" }, { "title": "Web Worker Examples", "excerpt": "\n", "content": "Web Worker Examples\n\nSimple web-worker\n\nEjemplo de uso de Web Workers.\n\nFile index.html\n\n1\n{% include_relative index.html %}\n\n\nFile main.js\n\n1\n{% include_relative main.js %}\n\n\nFile worker.js\n\n1\n{% include_relative worker.js %}\n\n\nRUN it\n\n\n RUN it!\n Demo en GitHub Pages en http://sytw.github.io/simple-web-worker/\n \n En local:\n\n 1\n2\nnpm i\nnode static-server.js\n \n\n y visite http://localhost:3000\n \n\n\nPuede encontrar los códigos de ejemplo en este repo:\n\n\n Repo de ejemplo simple-web-worker\n \n ~/local/src/uai/uai2015/simple-web-worker\n \n \n\n\nEjemplo: Fibonacci\n\n\n Repo de ejemplo fibonacci-worker\n \n ~/local/src/uai/uai2015\n ~/campus-virtual/1920/sytws1920/apuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/fibonacci-worker\n \n \n\n\nCan you create a web worker inside a web worker? Answer: yes!\n\nTutorial by Chinenye Onuegbu: Code examples for JSDay Canarias 2019\n\n\n Fork en SYTWS-1920 del repo de la charla impartida por Chinenye Onuegbu: Code examples for JSDay Canarias 2019\n \n Video. Una presentación extraordinaria. No te la pierdas.\n \n \n En la carpeta example-1 encontramos un ejemplo minimal de web worker\n En este repo podemos encontrar ejemplos de uso de web-workers en Node.js (denominados worker threads). Véase la carpeta nodejs-threads\n\n\nParallel.js\n\n\n parallel-js-examples repo Parallel.js is a Node.js lib for parallel programming\n parallel-js-examples\n\n\nReferencias\n\n\n \n Tutorial: Using Web Workers en Mozilla Developer Network\n \n \n See meta repo ULL-MII-SYTWS-1920/uai2015\n\n In my machine is allocated in:\n\n 1\n~/local/src/uai/uai2015/\n \n \n \n Book Web Workers: Safari O’Reilly. Usa Acceso ULL\n \n\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/instructions.html" }, { "title": "1.3.7 / 2019-04-29", "excerpt": "\n", "content": "1.3.7 / 2019-04-29\n\n\n deps: negotiator@0.6.2\n \n Fix sorting charset, encoding, and language with extra parameters\n \n \n\n\n1.3.6 / 2019-04-28\n\n\n deps: mime-types@~2.1.24\n \n deps: mime-db@~1.40.0\n \n \n\n\n1.3.5 / 2018-02-28\n\n\n deps: mime-types@~2.1.18\n \n deps: mime-db@~1.33.0\n \n \n\n\n1.3.4 / 2017-08-22\n\n\n deps: mime-types@~2.1.16\n \n deps: mime-db@~1.29.0\n \n \n\n\n1.3.3 / 2016-05-02\n\n\n deps: mime-types@~2.1.11\n \n deps: mime-db@~1.23.0\n \n \n deps: negotiator@0.6.1\n \n perf: improve Accept parsing speed\n perf: improve Accept-Charset parsing speed\n perf: improve Accept-Encoding parsing speed\n perf: improve Accept-Language parsing speed\n \n \n\n\n1.3.2 / 2016-03-08\n\n\n deps: mime-types@~2.1.10\n \n Fix extension of application/dash+xml\n Update primary extension for audio/mp4\n deps: mime-db@~1.22.0\n \n \n\n\n1.3.1 / 2016-01-19\n\n\n deps: mime-types@~2.1.9\n \n deps: mime-db@~1.21.0\n \n \n\n\n1.3.0 / 2015-09-29\n\n\n deps: mime-types@~2.1.7\n \n deps: mime-db@~1.19.0\n \n \n deps: negotiator@0.6.0\n \n Fix including type extensions in parameters in Accept parsing\n Fix parsing Accept parameters with quoted equals\n Fix parsing Accept parameters with quoted semicolons\n Lazy-load modules from main entry point\n perf: delay type concatenation until needed\n perf: enable strict mode\n perf: hoist regular expressions\n perf: remove closures getting spec properties\n perf: remove a closure from media type parsing\n perf: remove property delete from media type parsing\n \n \n\n\n1.2.13 / 2015-09-06\n\n\n deps: mime-types@~2.1.6\n \n deps: mime-db@~1.18.0\n \n \n\n\n1.2.12 / 2015-07-30\n\n\n deps: mime-types@~2.1.4\n \n deps: mime-db@~1.16.0\n \n \n\n\n1.2.11 / 2015-07-16\n\n\n deps: mime-types@~2.1.3\n \n deps: mime-db@~1.15.0\n \n \n\n\n1.2.10 / 2015-07-01\n\n\n deps: mime-types@~2.1.2\n \n deps: mime-db@~1.14.0\n \n \n\n\n1.2.9 / 2015-06-08\n\n\n deps: mime-types@~2.1.1\n \n perf: fix deopt during mapping\n \n \n\n\n1.2.8 / 2015-06-07\n\n\n deps: mime-types@~2.1.0\n \n deps: mime-db@~1.13.0\n \n \n perf: avoid argument reassignment & argument slice\n perf: avoid negotiator recursive construction\n perf: enable strict mode\n perf: remove unnecessary bitwise operator\n\n\n1.2.7 / 2015-05-10\n\n\n deps: negotiator@0.5.3\n \n Fix media type parameter matching to be case-insensitive\n \n \n\n\n1.2.6 / 2015-05-07\n\n\n deps: mime-types@~2.0.11\n \n deps: mime-db@~1.9.1\n \n \n deps: negotiator@0.5.2\n \n Fix comparing media types with quoted values\n Fix splitting media types with quoted commas\n \n \n\n\n1.2.5 / 2015-03-13\n\n\n deps: mime-types@~2.0.10\n \n deps: mime-db@~1.8.0\n \n \n\n\n1.2.4 / 2015-02-14\n\n\n Support Node.js 0.6\n deps: mime-types@~2.0.9\n \n deps: mime-db@~1.7.0\n \n \n deps: negotiator@0.5.1\n \n Fix preference sorting to be stable for long acceptable lists\n \n \n\n\n1.2.3 / 2015-01-31\n\n\n deps: mime-types@~2.0.8\n \n deps: mime-db@~1.6.0\n \n \n\n\n1.2.2 / 2014-12-30\n\n\n deps: mime-types@~2.0.7\n \n deps: mime-db@~1.5.0\n \n \n\n\n1.2.1 / 2014-12-30\n\n\n deps: mime-types@~2.0.5\n \n deps: mime-db@~1.3.1\n \n \n\n\n1.2.0 / 2014-12-19\n\n\n deps: negotiator@0.5.0\n \n Fix list return order when large accepted list\n Fix missing identity encoding when q=0 exists\n Remove dynamic building of Negotiator class\n \n \n\n\n1.1.4 / 2014-12-10\n\n\n deps: mime-types@~2.0.4\n \n deps: mime-db@~1.3.0\n \n \n\n\n1.1.3 / 2014-11-09\n\n\n deps: mime-types@~2.0.3\n \n deps: mime-db@~1.2.0\n \n \n\n\n1.1.2 / 2014-10-14\n\n\n deps: negotiator@0.4.9\n \n Fix error when media type has invalid parameter\n \n \n\n\n1.1.1 / 2014-09-28\n\n\n deps: mime-types@~2.0.2\n \n deps: mime-db@~1.1.0\n \n \n deps: negotiator@0.4.8\n \n Fix all negotiations to be case-insensitive\n Stable sort preferences of same quality according to client order\n \n \n\n\n1.1.0 / 2014-09-02\n\n\n update mime-types\n\n\n1.0.7 / 2014-07-04\n\n\n Fix wrong type returned from type when match after unknown extension\n\n\n1.0.6 / 2014-06-24\n\n\n deps: negotiator@0.4.7\n\n\n1.0.5 / 2014-06-20\n\n\n fix crash when unknown extension given\n\n\n1.0.4 / 2014-06-19\n\n\n use mime-types\n\n\n1.0.3 / 2014-06-11\n\n\n deps: negotiator@0.4.6\n \n Order by specificity when quality is the same\n \n \n\n\n1.0.2 / 2014-05-29\n\n\n Fix interpretation when header not in request\n deps: pin negotiator@0.4.5\n\n\n1.0.1 / 2014-01-18\n\n\n Identity encoding isn’t always acceptable\n deps: negotiator@~0.4.0\n\n\n1.0.0 / 2013-12-27\n\n\n Genesis\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/accepts/HISTORY.html" }, { "title": "1.19.0 / 2019-04-25", "excerpt": "\n", "content": "1.19.0 / 2019-04-25\n\n\n deps: bytes@3.1.0\n \n Add petabyte (pb) support\n \n \n deps: http-errors@1.7.2\n \n Set constructor name when possible\n deps: setprototypeof@1.1.1\n deps: statuses@’>= 1.5.0 < 2’\n \n \n deps: iconv-lite@0.4.24\n \n Added encoding MIK\n \n \n deps: qs@6.7.0\n \n Fix parsing array brackets after index\n \n \n deps: raw-body@2.4.0\n \n deps: bytes@3.1.0\n deps: http-errors@1.7.2\n deps: iconv-lite@0.4.24\n \n \n deps: type-is@~1.6.17\n \n deps: mime-types@~2.1.24\n perf: prevent internal throw on invalid type\n \n \n\n\n1.18.3 / 2018-05-14\n\n\n Fix stack trace for strict json parse error\n deps: depd@~1.1.2\n \n perf: remove argument reassignment\n \n \n deps: http-errors@~1.6.3\n \n deps: depd@~1.1.2\n deps: setprototypeof@1.1.0\n deps: statuses@’>= 1.3.1 < 2’\n \n \n deps: iconv-lite@0.4.23\n \n Fix loading encoding with year appended\n Fix deprecation warnings on Node.js 10+\n \n \n deps: qs@6.5.2\n deps: raw-body@2.3.3\n \n deps: http-errors@1.6.3\n deps: iconv-lite@0.4.23\n \n \n deps: type-is@~1.6.16\n \n deps: mime-types@~2.1.18\n \n \n\n\n1.18.2 / 2017-09-22\n\n\n deps: debug@2.6.9\n perf: remove argument reassignment\n\n\n1.18.1 / 2017-09-12\n\n\n deps: content-type@~1.0.4\n \n perf: remove argument reassignment\n perf: skip parameter parsing when no parameters\n \n \n deps: iconv-lite@0.4.19\n \n Fix ISO-8859-1 regression\n Update Windows-1255\n \n \n deps: qs@6.5.1\n \n Fix parsing & compacting very deep objects\n \n \n deps: raw-body@2.3.2\n \n deps: iconv-lite@0.4.19\n \n \n\n\n1.18.0 / 2017-09-08\n\n\n Fix JSON strict violation error to match native parse error\n Include the body property on verify errors\n Include the type property on all generated errors\n Use http-errors to set status code on errors\n deps: bytes@3.0.0\n deps: debug@2.6.8\n deps: depd@~1.1.1\n \n Remove unnecessary Buffer loading\n \n \n deps: http-errors@~1.6.2\n \n deps: depd@1.1.1\n \n \n deps: iconv-lite@0.4.18\n \n Add support for React Native\n Add a warning if not loaded as utf-8\n Fix CESU-8 decoding in Node.js 8\n Improve speed of ISO-8859-1 encoding\n \n \n deps: qs@6.5.0\n deps: raw-body@2.3.1\n \n Use http-errors for standard emitted errors\n deps: bytes@3.0.0\n deps: iconv-lite@0.4.18\n perf: skip buffer decoding on overage chunk\n \n \n perf: prevent internal throw when missing charset\n\n\n1.17.2 / 2017-05-17\n\n\n deps: debug@2.6.7\n \n Fix DEBUG_MAX_ARRAY_LENGTH\n deps: ms@2.0.0\n \n \n deps: type-is@~1.6.15\n \n deps: mime-types@~2.1.15\n \n \n\n\n1.17.1 / 2017-03-06\n\n\n deps: qs@6.4.0\n \n Fix regression parsing keys starting with [\n \n \n\n\n1.17.0 / 2017-03-01\n\n\n deps: http-errors@~1.6.1\n \n Make message property enumerable for HttpErrors\n deps: setprototypeof@1.0.3\n \n \n deps: qs@6.3.1\n \n Fix compacting nested arrays\n \n \n\n\n1.16.1 / 2017-02-10\n\n\n deps: debug@2.6.1\n \n Fix deprecation messages in WebStorm and other editors\n Undeprecate DEBUG_FD set to 1 or 2\n \n \n\n\n1.16.0 / 2017-01-17\n\n\n deps: debug@2.6.0\n \n Allow colors in workers\n Deprecated DEBUG_FD environment variable\n Fix error when running under React Native\n Use same color for same namespace\n deps: ms@0.7.2\n \n \n deps: http-errors@~1.5.1\n \n deps: inherits@2.0.3\n deps: setprototypeof@1.0.2\n deps: statuses@’>= 1.3.1 < 2’\n \n \n deps: iconv-lite@0.4.15\n \n Added encoding MS-31J\n Added encoding MS-932\n Added encoding MS-936\n Added encoding MS-949\n Added encoding MS-950\n Fix GBK/GB18030 handling of Euro character\n \n \n deps: qs@6.2.1\n \n Fix array parsing from skipping empty values\n \n \n deps: raw-body@~2.2.0\n \n deps: iconv-lite@0.4.15\n \n \n deps: type-is@~1.6.14\n \n deps: mime-types@~2.1.13\n \n \n\n\n1.15.2 / 2016-06-19\n\n\n deps: bytes@2.4.0\n deps: content-type@~1.0.2\n \n perf: enable strict mode\n \n \n deps: http-errors@~1.5.0\n \n Use setprototypeof module to replace __proto__ setting\n deps: statuses@’>= 1.3.0 < 2’\n perf: enable strict mode\n \n \n deps: qs@6.2.0\n deps: raw-body@~2.1.7\n \n deps: bytes@2.4.0\n perf: remove double-cleanup on happy path\n \n \n deps: type-is@~1.6.13\n \n deps: mime-types@~2.1.11\n \n \n\n\n1.15.1 / 2016-05-05\n\n\n deps: bytes@2.3.0\n \n Drop partial bytes on all parsed units\n Fix parsing byte string that looks like hex\n \n \n deps: raw-body@~2.1.6\n \n deps: bytes@2.3.0\n \n \n deps: type-is@~1.6.12\n \n deps: mime-types@~2.1.10\n \n \n\n\n1.15.0 / 2016-02-10\n\n\n deps: http-errors@~1.4.0\n \n Add HttpError export, for err instanceof createError.HttpError\n deps: inherits@2.0.1\n deps: statuses@’>= 1.2.1 < 2’\n \n \n deps: qs@6.1.0\n deps: type-is@~1.6.11\n \n deps: mime-types@~2.1.9\n \n \n\n\n1.14.2 / 2015-12-16\n\n\n deps: bytes@2.2.0\n deps: iconv-lite@0.4.13\n deps: qs@5.2.0\n deps: raw-body@~2.1.5\n \n deps: bytes@2.2.0\n deps: iconv-lite@0.4.13\n \n \n deps: type-is@~1.6.10\n \n deps: mime-types@~2.1.8\n \n \n\n\n1.14.1 / 2015-09-27\n\n\n Fix issue where invalid charset results in 400 when verify used\n deps: iconv-lite@0.4.12\n \n Fix CESU-8 decoding in Node.js 4.x\n \n \n deps: raw-body@~2.1.4\n \n Fix masking critical errors from iconv-lite\n deps: iconv-lite@0.4.12\n \n \n deps: type-is@~1.6.9\n \n deps: mime-types@~2.1.7\n \n \n\n\n1.14.0 / 2015-09-16\n\n\n Fix JSON strict parse error to match syntax errors\n Provide static require analysis in urlencoded parser\n deps: depd@~1.1.0\n \n Support web browser loading\n \n \n deps: qs@5.1.0\n deps: raw-body@~2.1.3\n \n Fix sync callback when attaching data listener causes sync read\n \n \n deps: type-is@~1.6.8\n \n Fix type error when given invalid type to match against\n deps: mime-types@~2.1.6\n \n \n\n\n1.13.3 / 2015-07-31\n\n\n deps: type-is@~1.6.6\n \n deps: mime-types@~2.1.4\n \n \n\n\n1.13.2 / 2015-07-05\n\n\n deps: iconv-lite@0.4.11\n deps: qs@4.0.0\n \n Fix dropping parameters like hasOwnProperty\n Fix user-visible incompatibilities from 3.1.0\n Fix various parsing edge cases\n \n \n deps: raw-body@~2.1.2\n \n Fix error stack traces to skip makeError\n deps: iconv-lite@0.4.11\n \n \n deps: type-is@~1.6.4\n \n deps: mime-types@~2.1.2\n perf: enable strict mode\n perf: remove argument reassignment\n \n \n\n\n1.13.1 / 2015-06-16\n\n\n deps: qs@2.4.2\n \n Downgraded from 3.1.0 because of user-visible incompatibilities\n \n \n\n\n1.13.0 / 2015-06-14\n\n\n Add statusCode property on Errors, in addition to status\n Change type default to application/json for JSON parser\n Change type default to application/x-www-form-urlencoded for urlencoded parser\n Provide static require analysis\n Use the http-errors module to generate errors\n deps: bytes@2.1.0\n \n Slight optimizations\n \n \n deps: iconv-lite@0.4.10\n \n The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails\n Leading BOM is now removed when decoding\n \n \n deps: on-finished@~2.3.0\n \n Add defined behavior for HTTP CONNECT requests\n Add defined behavior for HTTP Upgrade requests\n deps: ee-first@1.1.1\n \n \n deps: qs@3.1.0\n \n Fix dropping parameters like hasOwnProperty\n Fix various parsing edge cases\n Parsed object now has null prototype\n \n \n deps: raw-body@~2.1.1\n \n Use unpipe module for unpiping requests\n deps: iconv-lite@0.4.10\n \n \n deps: type-is@~1.6.3\n \n deps: mime-types@~2.1.1\n perf: reduce try block size\n perf: remove bitwise operations\n \n \n perf: enable strict mode\n perf: remove argument reassignment\n perf: remove delete call\n\n\n1.12.4 / 2015-05-10\n\n\n deps: debug@~2.2.0\n deps: qs@2.4.2\n \n Fix allowing parameters like constructor\n \n \n deps: on-finished@~2.2.1\n deps: raw-body@~2.0.1\n \n Fix a false-positive when unpiping in Node.js 0.8\n deps: bytes@2.0.1\n \n \n deps: type-is@~1.6.2\n \n deps: mime-types@~2.0.11\n \n \n\n\n1.12.3 / 2015-04-15\n\n\n Slight efficiency improvement when not debugging\n deps: depd@~1.0.1\n deps: iconv-lite@0.4.8\n \n Add encoding alias UNICODE-1-1-UTF-7\n \n \n deps: raw-body@1.3.4\n \n Fix hanging callback if request aborts during read\n deps: iconv-lite@0.4.8\n \n \n\n\n1.12.2 / 2015-03-16\n\n\n deps: qs@2.4.1\n \n Fix error when parameter hasOwnProperty is present\n \n \n\n\n1.12.1 / 2015-03-15\n\n\n deps: debug@~2.1.3\n \n Fix high intensity foreground color for bold\n deps: ms@0.7.0\n \n \n deps: type-is@~1.6.1\n \n deps: mime-types@~2.0.10\n \n \n\n\n1.12.0 / 2015-02-13\n\n\n add debug messages\n accept a function for the type option\n use content-type to parse Content-Type headers\n deps: iconv-lite@0.4.7\n \n Gracefully support enumerables on Object.prototype\n \n \n deps: raw-body@1.3.3\n \n deps: iconv-lite@0.4.7\n \n \n deps: type-is@~1.6.0\n \n fix argument reassignment\n fix false-positives in hasBody Transfer-Encoding check\n support wildcard for both type and subtype (*/*)\n deps: mime-types@~2.0.9\n \n \n\n\n1.11.0 / 2015-01-30\n\n\n make internal extended: true depth limit infinity\n deps: type-is@~1.5.6\n \n deps: mime-types@~2.0.8\n \n \n\n\n1.10.2 / 2015-01-20\n\n\n deps: iconv-lite@0.4.6\n \n Fix rare aliases of single-byte encodings\n \n \n deps: raw-body@1.3.2\n \n deps: iconv-lite@0.4.6\n \n \n\n\n1.10.1 / 2015-01-01\n\n\n deps: on-finished@~2.2.0\n deps: type-is@~1.5.5\n \n deps: mime-types@~2.0.7\n \n \n\n\n1.10.0 / 2014-12-02\n\n\n make internal extended: true array limit dynamic\n\n\n1.9.3 / 2014-11-21\n\n\n deps: iconv-lite@0.4.5\n \n Fix Windows-31J and X-SJIS encoding support\n \n \n deps: qs@2.3.3\n \n Fix arrayLimit behavior\n \n \n deps: raw-body@1.3.1\n \n deps: iconv-lite@0.4.5\n \n \n deps: type-is@~1.5.3\n \n deps: mime-types@~2.0.3\n \n \n\n\n1.9.2 / 2014-10-27\n\n\n deps: qs@2.3.2\n \n Fix parsing of mixed objects and values\n \n \n\n\n1.9.1 / 2014-10-22\n\n\n deps: on-finished@~2.1.1\n \n Fix handling of pipelined requests\n \n \n deps: qs@2.3.0\n \n Fix parsing of mixed implicit and explicit arrays\n \n \n deps: type-is@~1.5.2\n \n deps: mime-types@~2.0.2\n \n \n\n\n1.9.0 / 2014-09-24\n\n\n include the charset in “unsupported charset” error message\n include the encoding in “unsupported content encoding” error message\n deps: depd@~1.0.0\n\n\n1.8.4 / 2014-09-23\n\n\n fix content encoding to be case-insensitive\n\n\n1.8.3 / 2014-09-19\n\n\n deps: qs@2.2.4\n \n Fix issue with object keys starting with numbers truncated\n \n \n\n\n1.8.2 / 2014-09-15\n\n\n deps: depd@0.4.5\n\n\n1.8.1 / 2014-09-07\n\n\n deps: media-typer@0.3.0\n deps: type-is@~1.5.1\n\n\n1.8.0 / 2014-09-05\n\n\n make empty-body-handling consistent between chunked requests\n \n empty json produces {}\n empty raw produces new Buffer(0)\n empty text produces ''\n empty urlencoded produces {}\n \n \n deps: qs@2.2.3\n \n Fix issue where first empty value in array is discarded\n \n \n deps: type-is@~1.5.0\n \n fix hasbody to be true for content-length: 0\n \n \n\n\n1.7.0 / 2014-09-01\n\n\n add parameterLimit option to urlencoded parser\n change urlencoded extended array limit to 100\n respond with 413 when over parameterLimit in urlencoded\n\n\n1.6.7 / 2014-08-29\n\n\n deps: qs@2.2.2\n \n Remove unnecessary cloning\n \n \n\n\n1.6.6 / 2014-08-27\n\n\n deps: qs@2.2.0\n \n Array parsing fix\n Performance improvements\n \n \n\n\n1.6.5 / 2014-08-16\n\n\n deps: on-finished@2.1.0\n\n\n1.6.4 / 2014-08-14\n\n\n deps: qs@1.2.2\n\n\n1.6.3 / 2014-08-10\n\n\n deps: qs@1.2.1\n\n\n1.6.2 / 2014-08-07\n\n\n deps: qs@1.2.0\n \n Fix parsing array of objects\n \n \n\n\n1.6.1 / 2014-08-06\n\n\n deps: qs@1.1.0\n \n Accept urlencoded square brackets\n Accept empty values in implicit array notation\n \n \n\n\n1.6.0 / 2014-08-05\n\n\n deps: qs@1.0.2\n \n Complete rewrite\n Limits array length to 20\n Limits object depth to 5\n Limits parameters to 1,000\n \n \n\n\n1.5.2 / 2014-07-27\n\n\n deps: depd@0.4.4\n \n Work-around v8 generating empty stack traces\n \n \n\n\n1.5.1 / 2014-07-26\n\n\n deps: depd@0.4.3\n \n Fix exception when global Error.stackTraceLimit is too low\n \n \n\n\n1.5.0 / 2014-07-20\n\n\n deps: depd@0.4.2\n \n Add TRACE_DEPRECATION environment variable\n Remove non-standard grey color from color output\n Support --no-deprecation argument\n Support --trace-deprecation argument\n \n \n deps: iconv-lite@0.4.4\n \n Added encoding UTF-7\n \n \n deps: raw-body@1.3.0\n \n deps: iconv-lite@0.4.4\n Added encoding UTF-7\n Fix Cannot switch to old mode now error on Node.js 0.10+\n \n \n deps: type-is@~1.3.2\n\n\n1.4.3 / 2014-06-19\n\n\n deps: type-is@1.3.1\n \n fix global variable leak\n \n \n\n\n1.4.2 / 2014-06-19\n\n\n deps: type-is@1.3.0\n \n improve type parsing\n \n \n\n\n1.4.1 / 2014-06-19\n\n\n fix urlencoded extended deprecation message\n\n\n1.4.0 / 2014-06-19\n\n\n add text parser\n add raw parser\n check accepted charset in content-type (accepts utf-8)\n check accepted encoding in content-encoding (accepts identity)\n deprecate bodyParser() middleware; use .json() and .urlencoded() as needed\n deprecate urlencoded() without provided extended option\n lazy-load urlencoded parsers\n parsers split into files for reduced mem usage\n support gzip and deflate bodies\n \n set inflate: false to turn off\n \n \n deps: raw-body@1.2.2\n \n Support all encodings from iconv-lite\n \n \n\n\n1.3.1 / 2014-06-11\n\n\n deps: type-is@1.2.1\n \n Switch dependency from mime to mime-types@1.0.0\n \n \n\n\n1.3.0 / 2014-05-31\n\n\n add extended option to urlencoded parser\n\n\n1.2.2 / 2014-05-27\n\n\n deps: raw-body@1.1.6\n \n assert stream encoding on node.js 0.8\n assert stream encoding on node.js < 0.10.6\n deps: bytes@1\n \n \n\n\n1.2.1 / 2014-05-26\n\n\n invoke next(err) after request fully read\n \n prevents hung responses and socket hang ups\n \n \n\n\n1.2.0 / 2014-05-11\n\n\n add verify option\n deps: type-is@1.2.0\n \n support suffix matching\n \n \n\n\n1.1.2 / 2014-05-11\n\n\n improve json parser speed\n\n\n1.1.1 / 2014-05-11\n\n\n fix repeated limit parsing with every request\n\n\n1.1.0 / 2014-05-10\n\n\n add type option\n deps: pin for safety and consistency\n\n\n1.0.2 / 2014-04-14\n\n\n use type-is module\n\n\n1.0.1 / 2014-03-20\n\n\n lower default limits to 100kb\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/body-parser/HISTORY.html" }, { "title": "3.1.0 / 2019-01-22", "excerpt": "\n", "content": "3.1.0 / 2019-01-22\n\n\n Add petabyte (pb) support\n\n\n3.0.0 / 2017-08-31\n\n\n Change “kB” to “KB” in format output\n Remove support for Node.js 0.6\n Remove support for ComponentJS\n\n\n2.5.0 / 2017-03-24\n\n\n Add option “unit”\n\n\n2.4.0 / 2016-06-01\n\n\n Add option “unitSeparator”\n\n\n2.3.0 / 2016-02-15\n\n\n Drop partial bytes on all parsed units\n Fix non-finite numbers to .format to return null\n Fix parsing byte string that looks like hex\n perf: hoist regular expressions\n\n\n2.2.0 / 2015-11-13\n\n\n add option “decimalPlaces”\n add option “fixedDecimals”\n\n\n2.1.0 / 2015-05-21\n\n\n add .format export\n add .parse export\n\n\n2.0.2 / 2015-05-20\n\n\n remove map recreation\n remove unnecessary object construction\n\n\n2.0.1 / 2015-05-07\n\n\n fix browserify require\n remove node.extend dependency\n\n\n2.0.0 / 2015-04-12\n\n\n add option “case”\n add option “thousandsSeparator”\n return “null” on invalid parse input\n support proper round-trip: bytes(bytes(num)) === num\n units no longer case sensitive when parsing\n\n\n1.0.0 / 2014-05-05\n\n\n add negative support. fixes #6\n\n\n0.3.0 / 2014-03-19\n\n\n added terabyte support\n\n\n0.2.1 / 2013-04-01\n\n\n add .component\n\n\n0.2.0 / 2012-10-28\n\n\n bytes(200).should.eql(‘200b’)\n\n\n0.1.0 / 2012-07-04\n\n\n add bytes to string conversion [yields]\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/bytes/History.html" }, { "title": "0.5.3 / 2018-12-17", "excerpt": "\n", "content": "0.5.3 / 2018-12-17\n\n\n Use safe-buffer for improved Buffer API\n\n\n0.5.2 / 2016-12-08\n\n\n Fix parse to accept any linear whitespace character\n\n\n0.5.1 / 2016-01-17\n\n\n perf: enable strict mode\n\n\n0.5.0 / 2014-10-11\n\n\n Add parse function\n\n\n0.4.0 / 2014-09-21\n\n\n Expand non-Unicode filename to the full ISO-8859-1 charset\n\n\n0.3.0 / 2014-09-20\n\n\n Add fallback option\n Add type option\n\n\n0.2.0 / 2014-09-19\n\n\n Reduce ambiguity of file names with hex escape in buggy browsers\n\n\n0.1.2 / 2014-09-19\n\n\n Fix periodic invalid Unicode filename header\n\n\n0.1.1 / 2014-09-19\n\n\n Fix invalid characters appearing in filename* parameter\n\n\n0.1.0 / 2014-09-18\n\n\n Make the filename argument optional\n\n\n0.0.0 / 2014-09-18\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/content-disposition/HISTORY.html" }, { "title": "1.0.4 / 2017-09-11", "excerpt": "\n", "content": "1.0.4 / 2017-09-11\n\n\n perf: skip parameter parsing when no parameters\n\n\n1.0.3 / 2017-09-10\n\n\n perf: remove argument reassignment\n\n\n1.0.2 / 2016-05-09\n\n\n perf: enable strict mode\n\n\n1.0.1 / 2015-02-13\n\n\n Improve missing Content-Type header error message\n\n\n1.0.0 / 2015-02-01\n\n\n Initial implementation, derived from media-typer@0.3.0\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/content-type/HISTORY.html" }, { "title": "1.0.6 / 2015-02-03", "excerpt": "\n", "content": "1.0.6 / 2015-02-03\n\n\n use npm test instead of make test to run tests\n clearer assertion messages when checking input\n\n\n1.0.5 / 2014-09-05\n\n\n add license to package.json\n\n\n1.0.4 / 2014-06-25\n\n\n corrected avoidance of timing attacks (thanks @tenbits!)\n\n\n1.0.3 / 2014-01-28\n\n\n [incorrect] fix for timing attacks\n\n\n1.0.2 / 2014-01-28\n\n\n fix missing repository warning\n fix typo in test\n\n\n1.0.1 / 2013-04-15\n\n\n Revert “Changed underlying HMAC algo. to sha512.”\n Revert “Fix for timing attacks on MAC verification.”\n\n\n0.0.1 / 2010-01-03\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/cookie-signature/History.html" }, { "title": "0.4.0 / 2019-05-15", "excerpt": "\n", "content": "0.4.0 / 2019-05-15\n\n\n Add SameSite=None support\n\n\n0.3.1 / 2016-05-26\n\n\n Fix sameSite: true to work with draft-7 clients\n \n true now sends SameSite=Strict instead of SameSite\n \n \n\n\n0.3.0 / 2016-05-26\n\n\n Add sameSite option\n \n Replaces firstPartyOnly option, never implemented by browsers\n \n \n Improve error message when encode is not a function\n Improve error message when expires is not a Date\n\n\n0.2.4 / 2016-05-20\n\n\n perf: enable strict mode\n perf: use for loop in parse\n perf: use string concatination for serialization\n\n\n0.2.3 / 2015-10-25\n\n\n Fix cookie Max-Age to never be a floating point number\n\n\n0.2.2 / 2015-09-17\n\n\n Fix regression when setting empty cookie value\n \n Ease the new restriction, which is just basic header-level validation\n \n \n Fix typo in invalid value errors\n\n\n0.2.1 / 2015-09-17\n\n\n Throw on invalid values provided to serialize\n \n Ensures the resulting string is a valid HTTP header value\n \n \n\n\n0.2.0 / 2015-08-13\n\n\n Add firstPartyOnly option\n Throw better error for invalid argument to parse\n perf: hoist regular expression\n\n\n0.1.5 / 2015-09-17\n\n\n Fix regression when setting empty cookie value\n \n Ease the new restriction, which is just basic header-level validation\n \n \n Fix typo in invalid value errors\n\n\n0.1.4 / 2015-09-17\n\n\n Throw better error for invalid argument to parse\n Throw on invalid values provided to serialize\n \n Ensures the resulting string is a valid HTTP header value\n \n \n\n\n0.1.3 / 2015-05-19\n\n\n Reduce the scope of try-catch deopt\n Remove argument reassignments\n\n\n0.1.2 / 2014-04-16\n\n\n Remove unnecessary files from npm package\n\n\n0.1.1 / 2014-02-23\n\n\n Fix bad parse when cookie value contained a comma\n Fix support for maxAge of 0\n\n\n0.1.0 / 2013-05-01\n\n\n Add decode option\n Add encode option\n\n\n0.0.6 / 2013-04-08\n\n\n Ignore cookie parts missing =\n\n\n0.0.5 / 2012-10-29\n\n\n Return raw cookie value if value unescape errors\n\n\n0.0.4 / 2012-06-21\n\n\n Use encode/decodeURIComponent for cookie encoding/decoding\n \n Improve server/client interoperability\n \n \n\n\n0.0.3 / 2012-06-06\n\n\n Only escape special characters per the cookie RFC\n\n\n0.0.2 / 2012-06-01\n\n\n Fix maxAge option to not throw error\n\n\n0.0.1 / 2012-05-28\n\n\n Add more tests\n\n\n0.0.0 / 2012-05-28\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/cookie/HISTORY.html" }, { "title": "2.6.9 / 2017-09-22", "excerpt": "\n", "content": "\n2.6.9 / 2017-09-22\n\n\n remove ReDoS regexp in %o formatter (#504)\n\n\n2.6.8 / 2017-05-18\n\n\n Fix: Check for undefined on browser globals (#462, @marbemac)\n\n\n2.6.7 / 2017-05-16\n\n\n Fix: Update ms to 2.0.0 to fix regular expression denial of service vulnerability (#458, @hubdotcom)\n Fix: Inline extend function in node implementation (#452, @dougwilson)\n Docs: Fix typo (#455, @msasad)\n\n\n2.6.5 / 2017-04-27\n\n\n Fix: null reference check on window.documentElement.style.WebkitAppearance (#447, @thebigredgeek)\n Misc: clean up browser reference checks (#447, @thebigredgeek)\n Misc: add npm-debug.log to .gitignore (@thebigredgeek)\n\n\n2.6.4 / 2017-04-20\n\n\n Fix: bug that would occure if process.env.DEBUG is a non-string value. (#444, @LucianBuzzo)\n Chore: ignore bower.json in npm installations. (#437, @joaovieira)\n Misc: update “ms” to v0.7.3 (@tootallnate)\n\n\n2.6.3 / 2017-03-13\n\n\n Fix: Electron reference to process.env.DEBUG (#431, @paulcbetts)\n Docs: Changelog fix (@thebigredgeek)\n\n\n2.6.2 / 2017-03-10\n\n\n Fix: DEBUG_MAX_ARRAY_LENGTH (#420, @slavaGanzin)\n Docs: Add backers and sponsors from Open Collective (#422, @piamancini)\n Docs: Add Slackin invite badge (@tootallnate)\n\n\n2.6.1 / 2017-02-10\n\n\n Fix: Module’s export default syntax fix for IE8 Expected identifier error\n Fix: Whitelist DEBUG_FD for values 1 and 2 only (#415, @pi0)\n Fix: IE8 “Expected identifier” error (#414, @vgoma)\n Fix: Namespaces would not disable once enabled (#409, @musikov)\n\n\n2.6.0 / 2016-12-28\n\n\n Fix: added better null pointer checks for browser useColors (@thebigredgeek)\n Improvement: removed explicit window.debug export (#404, @tootallnate)\n Improvement: deprecated DEBUG_FD environment variable (#405, @tootallnate)\n\n\n2.5.2 / 2016-12-25\n\n\n Fix: reference error on window within webworkers (#393, @KlausTrainer)\n Docs: fixed README typo (#391, @lurch)\n Docs: added notice about v3 api discussion (@thebigredgeek)\n\n\n2.5.1 / 2016-12-20\n\n\n Fix: babel-core compatibility\n\n\n2.5.0 / 2016-12-20\n\n\n Fix: wrong reference in bower file (@thebigredgeek)\n Fix: webworker compatibility (@thebigredgeek)\n Fix: output formatting issue (#388, @kribblo)\n Fix: babel-loader compatibility (#383, @escwald)\n Misc: removed built asset from repo and publications (@thebigredgeek)\n Misc: moved source files to /src (#378, @yamikuronue)\n Test: added karma integration and replaced babel with browserify for browser tests (#378, @yamikuronue)\n Test: coveralls integration (#378, @yamikuronue)\n Docs: simplified language in the opening paragraph (#373, @yamikuronue)\n\n\n2.4.5 / 2016-12-17\n\n\n Fix: navigator undefined in Rhino (#376, @jochenberger)\n Fix: custom log function (#379, @hsiliev)\n Improvement: bit of cleanup + linting fixes (@thebigredgeek)\n Improvement: rm non-maintainted dist/ dir (#375, @freewil)\n Docs: simplified language in the opening paragraph. (#373, @yamikuronue)\n\n\n2.4.4 / 2016-12-14\n\n\n Fix: work around debug being loaded in preload scripts for electron (#368, @paulcbetts)\n\n\n2.4.3 / 2016-12-14\n\n\n Fix: navigation.userAgent error for react native (#364, @escwald)\n\n\n2.4.2 / 2016-12-14\n\n\n Fix: browser colors (#367, @tootallnate)\n Misc: travis ci integration (@thebigredgeek)\n Misc: added linting and testing boilerplate with sanity check (@thebigredgeek)\n\n\n2.4.1 / 2016-12-13\n\n\n Fix: typo that broke the package (#356)\n\n\n2.4.0 / 2016-12-13\n\n\n Fix: bower.json references unbuilt src entry point (#342, @justmatt)\n Fix: revert “handle regex special characters” (@tootallnate)\n Feature: configurable util.inspect()`options for NodeJS (#327, @tootallnate)\n Feature: %O`(big O) pretty-prints objects (#322, @tootallnate)\n Improvement: allow colors in workers (#335, @botverse)\n Improvement: use same color for same namespace. (#338, @lchenay)\n\n\n2.3.3 / 2016-11-09\n\n\n Fix: Catch JSON.stringify() errors (#195, Jovan Alleyne)\n Fix: Returning localStorage saved values (#331, Levi Thomason)\n Improvement: Don’t create an empty object when no process (Nathan Rajlich)\n\n\n2.3.2 / 2016-11-09\n\n\n Fix: be super-safe in index.js as well (@TooTallNate)\n Fix: should check whether process exists (Tom Newby)\n\n\n2.3.1 / 2016-11-09\n\n\n Fix: Added electron compatibility (#324, @paulcbetts)\n Improvement: Added performance optimizations (@tootallnate)\n Readme: Corrected PowerShell environment variable example (#252, @gimre)\n Misc: Removed yarn lock file from source control (#321, @fengmk2)\n\n\n2.3.0 / 2016-11-07\n\n\n Fix: Consistent placement of ms diff at end of output (#215, @gorangajic)\n Fix: Escaping of regex special characters in namespace strings (#250, @zacronos)\n Fix: Fixed bug causing crash on react-native (#282, @vkarpov15)\n Feature: Enabled ES6+ compatible import via default export (#212 @bucaran)\n Feature: Added %O formatter to reflect Chrome’s console.log capability (#279, @oncletom)\n Package: Update “ms” to 0.7.2 (#315, @DevSide)\n Package: removed superfluous version property from bower.json (#207 @kkirsche)\n Readme: fix USE_COLORS to DEBUG_COLORS\n Readme: Doc fixes for format string sugar (#269, @mlucool)\n Readme: Updated docs for DEBUG_FD and DEBUG_COLORS environment variables (#232, @mattlyons0)\n Readme: doc fixes for PowerShell (#271 #243, @exoticknight @unreadable)\n Readme: better docs for browser support (#224, @matthewmueller)\n Tooling: Added yarn integration for development (#317, @thebigredgeek)\n Misc: Renamed History.md to CHANGELOG.md (@thebigredgeek)\n Misc: Added license file (#226 #274, @CantemoInternal @sdaitzman)\n Misc: Updated contributors (@thebigredgeek)\n\n\n2.2.0 / 2015-05-09\n\n\n package: update “ms” to v0.7.1 (#202, @dougwilson)\n README: add logging to file example (#193, @DanielOchoa)\n README: fixed a typo (#191, @amir-s)\n browser: expose storage (#190, @stephenmathieson)\n Makefile: add a distclean target (#189, @stephenmathieson)\n\n\n2.1.3 / 2015-03-13\n\n\n Updated stdout/stderr example (#186)\n Updated example/stdout.js to match debug current behaviour\n Renamed example/stderr.js to stdout.js\n Update Readme.md (#184)\n replace high intensity foreground color for bold (#182, #183)\n\n\n2.1.2 / 2015-03-01\n\n\n dist: recompile\n update “ms” to v0.7.0\n package: update “browserify” to v9.0.3\n component: fix “ms.js” repo location\n changed bower package name\n updated documentation about using debug in a browser\n fix: security error on safari (#167, #168, @yields)\n\n\n2.1.1 / 2014-12-29\n\n\n browser: use typeof to check for console existence\n browser: check for console.log truthiness (fix IE 8/9)\n browser: add support for Chrome apps\n Readme: added Windows usage remarks\n Add bower.json to properly support bower install\n\n\n2.1.0 / 2014-10-15\n\n\n node: implement DEBUG_FD env variable support\n package: update “browserify” to v6.1.0\n package: add “license” field to package.json (#135, @panuhorsmalahti)\n\n\n2.0.0 / 2014-09-01\n\n\n package: update “browserify” to v5.11.0\n node: use stderr rather than stdout for logging (#29, @stephenmathieson)\n\n\n1.0.4 / 2014-07-15\n\n\n dist: recompile\n example: remove console.info() log usage\n example: add “Content-Type” UTF-8 header to browser example\n browser: place %c marker after the space character\n browser: reset the “content” color via color: inherit\n browser: add colors support for Firefox >= v31\n debug: prefer an instance log() function over the global one (#119)\n Readme: update documentation about styled console logs for FF v31 (#116, @wryk)\n\n\n1.0.3 / 2014-07-09\n\n\n Add support for multiple wildcards in namespaces (#122, @seegno)\n browser: fix lint\n\n\n1.0.2 / 2014-06-10\n\n\n browser: update color palette (#113, @gscottolson)\n common: make console logging function configurable (#108, @timoxley)\n node: fix %o colors on old node <= 0.8.x\n Makefile: find node path using shell/which (#109, @timoxley)\n\n\n1.0.1 / 2014-06-06\n\n\n browser: use removeItem() to clear localStorage\n browser, node: don’t set DEBUG if namespaces is undefined (#107, @leedm777)\n package: add “contributors” section\n node: fix comment typo\n README: list authors\n\n\n1.0.0 / 2014-06-04\n\n\n make ms diff be global, not be scope\n debug: ignore empty strings in enable()\n node: make DEBUG_COLORS able to disable coloring\n *: export the colors array\n npmignore: don’t publish the dist dir\n Makefile: refactor to use browserify\n package: add “browserify” as a dev dependency\n Readme: add Web Inspector Colors section\n node: reset terminal color for the debug content\n node: map “%o” to util.inspect()\n browser: map “%j” to JSON.stringify()\n debug: add custom “formatters”\n debug: use “ms” module for humanizing the diff\n Readme: add “bash” syntax highlighting\n browser: add Firebug color support\n browser: add colors for WebKit browsers\n node: apply log to console\n rewrite: abstract common logic for Node & browsers\n add .jshintrc file\n\n\n0.8.1 / 2014-04-14\n\n\n package: re-add the “component” section\n\n\n0.8.0 / 2014-03-30\n\n\n add enable() method for nodejs. Closes #27\n change from stderr to stdout\n remove unnecessary index.js file\n\n\n0.7.4 / 2013-11-13\n\n\n remove “browserify” key from package.json (fixes something in browserify)\n\n\n0.7.3 / 2013-10-30\n\n\n fix: catch localStorage security error when cookies are blocked (Chrome)\n add debug(err) support. Closes #46\n add .browser prop to package.json. Closes #42\n\n\n0.7.2 / 2013-02-06\n\n\n fix package.json\n fix: Mobile Safari (private mode) is broken with debug\n fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript\n\n\n0.7.1 / 2013-02-05\n\n\n add repository URL to package.json\n add DEBUG_COLORED to force colored output\n add browserify support\n fix component. Closes #24\n\n\n0.7.0 / 2012-05-04\n\n\n Added .component to package.json\n Added debug.component.js build\n\n\n0.6.0 / 2012-03-16\n\n\n Added support for “-“ prefix in DEBUG [Vinay Pulim]\n Added .enabled flag to the node version [TooTallNate]\n\n\n0.5.0 / 2012-02-02\n\n\n Added: humanize diffs. Closes #8\n Added debug.disable() to the CS variant\n Removed padding. Closes #10\n Fixed: persist client-side variant again. Closes #9\n\n\n0.4.0 / 2012-02-01\n\n\n Added browser variant support for older browsers [TooTallNate]\n Added debug.enable('project:*') to browser variant [TooTallNate]\n Added padding to diff (moved it to the right)\n\n\n0.3.0 / 2012-01-26\n\n\n Added millisecond diff when isatty, otherwise UTC string\n\n\n0.2.0 / 2012-01-22\n\n\n Added wildcard support\n\n\n0.1.0 / 2011-12-02\n\n\n Added: remove colors unless stderr isatty [TooTallNate]\n\n\n0.0.1 / 2010-01-03\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/debug/CHANGELOG.html" }, { "title": "1.1.2 / 2018-01-11", "excerpt": "\n", "content": "1.1.2 / 2018-01-11\n\n\n perf: remove argument reassignment\n Support Node.js 0.6 to 9.x\n\n\n1.1.1 / 2017-07-27\n\n\n Remove unnecessary Buffer loading\n Support Node.js 0.6 to 8.x\n\n\n1.1.0 / 2015-09-14\n\n\n Enable strict mode in more places\n Support io.js 3.x\n Support io.js 2.x\n Support web browser loading\n \n Requires bundler like Browserify or webpack\n \n \n\n\n1.0.1 / 2015-04-07\n\n\n Fix TypeErrors when under 'use strict' code\n Fix useless type name on auto-generated messages\n Support io.js 1.x\n Support Node.js 0.12\n\n\n1.0.0 / 2014-09-17\n\n\n No changes\n\n\n0.4.5 / 2014-09-09\n\n\n Improve call speed to functions using the function wrapper\n Support Node.js 0.6\n\n\n0.4.4 / 2014-07-27\n\n\n Work-around v8 generating empty stack traces\n\n\n0.4.3 / 2014-07-26\n\n\n Fix exception when global Error.stackTraceLimit is too low\n\n\n0.4.2 / 2014-07-19\n\n\n Correct call site for wrapped functions and properties\n\n\n0.4.1 / 2014-07-19\n\n\n Improve automatic message generation for function properties\n\n\n0.4.0 / 2014-07-19\n\n\n Add TRACE_DEPRECATION environment variable\n Remove non-standard grey color from color output\n Support --no-deprecation argument\n Support --trace-deprecation argument\n Support deprecate.property(fn, prop, message)\n\n\n0.3.0 / 2014-06-16\n\n\n Add NO_DEPRECATION environment variable\n\n\n0.2.0 / 2014-06-15\n\n\n Add deprecate.property(obj, prop, message)\n Remove supports-color dependency for node.js 0.8\n\n\n0.1.0 / 2014-06-15\n\n\n Add deprecate.function(fn, message)\n Add process.on('deprecation', fn) emitter\n Automatically generate message when omitted from deprecate()\n\n\n0.0.1 / 2014-06-15\n\n\n Fix warning for dynamic calls at singe call site\n\n\n0.0.0 / 2014-06-15\n\n\n Initial implementation\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/depd/History.html" }, { "title": "1.0.2 / 2018-01-21", "excerpt": "\n", "content": "1.0.2 / 2018-01-21\n\n\n Fix encoding % as last character\n\n\n1.0.1 / 2016-06-09\n\n\n Fix encoding unpaired surrogates at start/end of string\n\n\n1.0.0 / 2016-06-08\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/encodeurl/HISTORY.html" }, { "title": "1.8.1 / 2017-09-12", "excerpt": "\n", "content": "1.8.1 / 2017-09-12\n\n\n perf: replace regular expression with substring\n\n\n1.8.0 / 2017-02-18\n\n\n Use SHA1 instead of MD5 for ETag hashing\n \n Improves performance for larger entities\n Works with FIPS 140-2 OpenSSL configuration\n \n \n\n\n1.7.0 / 2015-06-08\n\n\n Always include entity length in ETags for hash length extensions\n Generate non-Stats ETags using MD5 only (no longer CRC32)\n Improve stat performance by removing hashing\n Remove base64 padding in ETags to shorten\n Use MD5 instead of MD4 in weak ETags over 1KB\n\n\n1.6.0 / 2015-05-10\n\n\n Improve support for JXcore\n Remove requirement of atime in the stats object\n Support “fake” stats objects in environments without fs\n\n\n1.5.1 / 2014-11-19\n\n\n deps: crc@3.2.1\n \n Minor fixes\n \n \n\n\n1.5.0 / 2014-10-14\n\n\n Improve string performance\n Slightly improve speed for weak ETags over 1KB\n\n\n1.4.0 / 2014-09-21\n\n\n Support “fake” stats objects\n Support Node.js 0.6\n\n\n1.3.1 / 2014-09-14\n\n\n Use the (new and improved) crc for crc32\n\n\n1.3.0 / 2014-08-29\n\n\n Default strings to strong ETags\n Improve speed for weak ETags over 1KB\n\n\n1.2.1 / 2014-08-29\n\n\n Use the (much faster) buffer-crc32 for crc32\n\n\n1.2.0 / 2014-08-24\n\n\n Add support for file stat objects\n\n\n1.1.0 / 2014-08-24\n\n\n Add fast-path for empty entity\n Add weak ETag generation\n Shrink size of generated ETags\n\n\n1.0.1 / 2014-08-24\n\n\n Fix behavior of string containing Unicode\n\n\n1.0.0 / 2014-05-18\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/etag/HISTORY.html" }, { "title": "4.17.1 / 2019-05-25", "excerpt": "\n", "content": "4.17.1 / 2019-05-25\n\n\n Revert “Improve error message for null/undefined to res.status”\n\n\n4.17.0 / 2019-05-16\n\n\n Add express.raw to parse bodies into Buffer\n Add express.text to parse bodies into string\n Improve error message for non-strings to res.sendFile\n Improve error message for null/undefined to res.status\n Support multiple hosts in X-Forwarded-Host\n deps: accepts@~1.3.7\n deps: body-parser@1.19.0\n \n Add encoding MIK\n Add petabyte (pb) support\n Fix parsing array brackets after index\n deps: bytes@3.1.0\n deps: http-errors@1.7.2\n deps: iconv-lite@0.4.24\n deps: qs@6.7.0\n deps: raw-body@2.4.0\n deps: type-is@~1.6.17\n \n \n deps: content-disposition@0.5.3\n deps: cookie@0.4.0\n \n Add SameSite=None support\n \n \n deps: finalhandler@~1.1.2\n \n Set stricter Content-Security-Policy header\n deps: parseurl@~1.3.3\n deps: statuses@~1.5.0\n \n \n deps: parseurl@~1.3.3\n deps: proxy-addr@~2.0.5\n \n deps: ipaddr.js@1.9.0\n \n \n deps: qs@6.7.0\n \n Fix parsing array brackets after index\n \n \n deps: range-parser@~1.2.1\n deps: send@0.17.1\n \n Set stricter CSP header in redirect & error responses\n deps: http-errors@~1.7.2\n deps: mime@1.6.0\n deps: ms@2.1.1\n deps: range-parser@~1.2.1\n deps: statuses@~1.5.0\n perf: remove redundant path.normalize call\n \n \n deps: serve-static@1.14.1\n \n Set stricter CSP header in redirect response\n deps: parseurl@~1.3.3\n deps: send@0.17.1\n \n \n deps: setprototypeof@1.1.1\n deps: statuses@~1.5.0\n \n Add 103 Early Hints\n \n \n deps: type-is@~1.6.18\n \n deps: mime-types@~2.1.24\n perf: prevent internal throw on invalid type\n \n \n\n\n4.16.4 / 2018-10-10\n\n\n Fix issue where \"Request aborted\" may be logged in res.sendfile\n Fix JSDoc for Router constructor\n deps: body-parser@1.18.3\n \n Fix deprecation warnings on Node.js 10+\n Fix stack trace for strict json parse error\n deps: depd@~1.1.2\n deps: http-errors@~1.6.3\n deps: iconv-lite@0.4.23\n deps: qs@6.5.2\n deps: raw-body@2.3.3\n deps: type-is@~1.6.16\n \n \n deps: proxy-addr@~2.0.4\n \n deps: ipaddr.js@1.8.0\n \n \n deps: qs@6.5.2\n deps: safe-buffer@5.1.2\n\n\n4.16.3 / 2018-03-12\n\n\n deps: accepts@~1.3.5\n \n deps: mime-types@~2.1.18\n \n \n deps: depd@~1.1.2\n \n perf: remove argument reassignment\n \n \n deps: encodeurl@~1.0.2\n \n Fix encoding % as last character\n \n \n deps: finalhandler@1.1.1\n \n Fix 404 output for bad / missing pathnames\n deps: encodeurl@~1.0.2\n deps: statuses@~1.4.0\n \n \n deps: proxy-addr@~2.0.3\n \n deps: ipaddr.js@1.6.0\n \n \n deps: send@0.16.2\n \n Fix incorrect end tag in default error & redirects\n deps: depd@~1.1.2\n deps: encodeurl@~1.0.2\n deps: statuses@~1.4.0\n \n \n deps: serve-static@1.13.2\n \n Fix incorrect end tag in redirects\n deps: encodeurl@~1.0.2\n deps: send@0.16.2\n \n \n deps: statuses@~1.4.0\n deps: type-is@~1.6.16\n \n deps: mime-types@~2.1.18\n \n \n\n\n4.16.2 / 2017-10-09\n\n\n Fix TypeError in res.send when given Buffer and ETag header set\n perf: skip parsing of entire X-Forwarded-Proto header\n\n\n4.16.1 / 2017-09-29\n\n\n deps: send@0.16.1\n deps: serve-static@1.13.1\n \n Fix regression when root is incorrectly set to a file\n deps: send@0.16.1\n \n \n\n\n4.16.0 / 2017-09-28\n\n\n Add \"json escape\" setting for res.json and res.jsonp\n Add express.json and express.urlencoded to parse bodies\n Add options argument to res.download\n Improve error message when autoloading invalid view engine\n Improve error messages when non-function provided as middleware\n Skip Buffer encoding when not generating ETag for small response\n Use safe-buffer for improved Buffer API\n deps: accepts@~1.3.4\n \n deps: mime-types@~2.1.16\n \n \n deps: content-type@~1.0.4\n \n perf: remove argument reassignment\n perf: skip parameter parsing when no parameters\n \n \n deps: etag@~1.8.1\n \n perf: replace regular expression with substring\n \n \n deps: finalhandler@1.1.0\n \n Use res.headersSent when available\n \n \n deps: parseurl@~1.3.2\n \n perf: reduce overhead for full URLs\n perf: unroll the “fast-path” RegExp\n \n \n deps: proxy-addr@~2.0.2\n \n Fix trimming leading / trailing OWS in X-Forwarded-For\n deps: forwarded@~0.1.2\n deps: ipaddr.js@1.5.2\n perf: reduce overhead when no X-Forwarded-For header\n \n \n deps: qs@6.5.1\n \n Fix parsing & compacting very deep objects\n \n \n deps: send@0.16.0\n \n Add 70 new types for file extensions\n Add immutable option\n Fix missing </html> in default error & redirects\n Set charset as “UTF-8” for .js and .json\n Use instance methods on steam to check for listeners\n deps: mime@1.4.1\n perf: improve path validation speed\n \n \n deps: serve-static@1.13.0\n \n Add 70 new types for file extensions\n Add immutable option\n Set charset as “UTF-8” for .js and .json\n deps: send@0.16.0\n \n \n deps: setprototypeof@1.1.0\n deps: utils-merge@1.0.1\n deps: vary@~1.1.2\n \n perf: improve header token parsing speed\n \n \n perf: re-use options object when generating ETags\n perf: remove dead .charset set in res.jsonp\n\n\n4.15.5 / 2017-09-24\n\n\n deps: debug@2.6.9\n deps: finalhandler@~1.0.6\n \n deps: debug@2.6.9\n deps: parseurl@~1.3.2\n \n \n deps: fresh@0.5.2\n \n Fix handling of modified headers with invalid dates\n perf: improve ETag match loop\n perf: improve If-None-Match token parsing\n \n \n deps: send@0.15.6\n \n Fix handling of modified headers with invalid dates\n deps: debug@2.6.9\n deps: etag@~1.8.1\n deps: fresh@0.5.2\n perf: improve If-Match token parsing\n \n \n deps: serve-static@1.12.6\n \n deps: parseurl@~1.3.2\n deps: send@0.15.6\n perf: improve slash collapsing\n \n \n\n\n4.15.4 / 2017-08-06\n\n\n deps: debug@2.6.8\n deps: depd@~1.1.1\n \n Remove unnecessary Buffer loading\n \n \n deps: finalhandler@~1.0.4\n \n deps: debug@2.6.8\n \n \n deps: proxy-addr@~1.1.5\n \n Fix array argument being altered\n deps: ipaddr.js@1.4.0\n \n \n deps: qs@6.5.0\n deps: send@0.15.4\n \n deps: debug@2.6.8\n deps: depd@~1.1.1\n deps: http-errors@~1.6.2\n \n \n deps: serve-static@1.12.4\n \n deps: send@0.15.4\n \n \n\n\n4.15.3 / 2017-05-16\n\n\n Fix error when res.set cannot add charset to Content-Type\n deps: debug@2.6.7\n \n Fix DEBUG_MAX_ARRAY_LENGTH\n deps: ms@2.0.0\n \n \n deps: finalhandler@~1.0.3\n \n Fix missing </html> in HTML document\n deps: debug@2.6.7\n \n \n deps: proxy-addr@~1.1.4\n \n deps: ipaddr.js@1.3.0\n \n \n deps: send@0.15.3\n \n deps: debug@2.6.7\n deps: ms@2.0.0\n \n \n deps: serve-static@1.12.3\n \n deps: send@0.15.3\n \n \n deps: type-is@~1.6.15\n \n deps: mime-types@~2.1.15\n \n \n deps: vary@~1.1.1\n \n perf: hoist regular expression\n \n \n\n\n4.15.2 / 2017-03-06\n\n\n deps: qs@6.4.0\n \n Fix regression parsing keys starting with [\n \n \n\n\n4.15.1 / 2017-03-05\n\n\n deps: send@0.15.1\n \n Fix issue when Date.parse does not return NaN on invalid date\n Fix strict violation in broken environments\n \n \n deps: serve-static@1.12.1\n \n Fix issue when Date.parse does not return NaN on invalid date\n deps: send@0.15.1\n \n \n\n\n4.15.0 / 2017-03-01\n\n\n Add debug message when loading view engine\n Add next(\"router\") to exit from router\n Fix case where router.use skipped requests routes did not\n Remove usage of res._headers private field\n \n Improves compatibility with Node.js 8 nightly\n \n \n Skip routing when req.url is not set\n Use %o in path debug to tell types apart\n Use Object.create to setup request & response prototypes\n Use setprototypeof module to replace __proto__ setting\n Use statuses instead of http module for status messages\n deps: debug@2.6.1\n \n Allow colors in workers\n Deprecated DEBUG_FD environment variable set to 3 or higher\n Fix error when running under React Native\n Use same color for same namespace\n deps: ms@0.7.2\n \n \n deps: etag@~1.8.0\n \n Use SHA1 instead of MD5 for ETag hashing\n Works with FIPS 140-2 OpenSSL configuration\n \n \n deps: finalhandler@~1.0.0\n \n Fix exception when err cannot be converted to a string\n Fully URL-encode the pathname in the 404\n Only include the pathname in the 404 message\n Send complete HTML document\n Set Content-Security-Policy: default-src 'self' header\n deps: debug@2.6.1\n \n \n deps: fresh@0.5.0\n \n Fix false detection of no-cache request directive\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n perf: delay reading header values until needed\n perf: enable strict mode\n perf: hoist regular expressions\n perf: remove duplicate conditional\n perf: remove unnecessary boolean coercions\n perf: skip checking modified time if ETag check failed\n perf: skip parsing If-None-Match when no ETag header\n perf: use Date.parse instead of new Date\n \n \n deps: qs@6.3.1\n \n Fix array parsing from skipping empty values\n Fix compacting nested arrays\n \n \n deps: send@0.15.0\n \n Fix false detection of no-cache request directive\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n Remove usage of res._headers private field\n Support If-Match and If-Unmodified-Since headers\n Use res.getHeaderNames() when available\n Use res.headersSent when available\n deps: debug@2.6.1\n deps: etag@~1.8.0\n deps: fresh@0.5.0\n deps: http-errors@~1.6.1\n \n \n deps: serve-static@1.12.0\n \n Fix false detection of no-cache request directive\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n Remove usage of res._headers private field\n Send complete HTML document in redirect response\n Set default CSP header in redirect response\n Support If-Match and If-Unmodified-Since headers\n Use res.getHeaderNames() when available\n Use res.headersSent when available\n deps: send@0.15.0\n \n \n perf: add fast match path for * route\n perf: improve req.ips performance\n\n\n4.14.1 / 2017-01-28\n\n\n deps: content-disposition@0.5.2\n deps: finalhandler@0.5.1\n \n Fix exception when err.headers is not an object\n deps: statuses@~1.3.1\n perf: hoist regular expressions\n perf: remove duplicate validation path\n \n \n deps: proxy-addr@~1.1.3\n \n deps: ipaddr.js@1.2.0\n \n \n deps: send@0.14.2\n \n deps: http-errors@~1.5.1\n deps: ms@0.7.2\n deps: statuses@~1.3.1\n \n \n deps: serve-static@~1.11.2\n \n deps: send@0.14.2\n \n \n deps: type-is@~1.6.14\n \n deps: mime-types@~2.1.13\n \n \n\n\n4.14.0 / 2016-06-16\n\n\n Add acceptRanges option to res.sendFile/res.sendfile\n Add cacheControl option to res.sendFile/res.sendfile\n Add options argument to req.range\n \n Includes the combine option\n \n \n Encode URL in res.location/res.redirect if not already encoded\n Fix some redirect handling in res.sendFile/res.sendfile\n Fix Windows absolute path check using forward slashes\n Improve error with invalid arguments to req.get()\n Improve performance for res.json/res.jsonp in most cases\n Improve Range header handling in res.sendFile/res.sendfile\n deps: accepts@~1.3.3\n \n Fix including type extensions in parameters in Accept parsing\n Fix parsing Accept parameters with quoted equals\n Fix parsing Accept parameters with quoted semicolons\n Many performance improvements\n deps: mime-types@~2.1.11\n deps: negotiator@0.6.1\n \n \n deps: content-type@~1.0.2\n \n perf: enable strict mode\n \n \n deps: cookie@0.3.1\n \n Add sameSite option\n Fix cookie Max-Age to never be a floating point number\n Improve error message when encode is not a function\n Improve error message when expires is not a Date\n Throw better error for invalid argument to parse\n Throw on invalid values provided to serialize\n perf: enable strict mode\n perf: hoist regular expression\n perf: use for loop in parse\n perf: use string concatenation for serialization\n \n \n deps: finalhandler@0.5.0\n \n Change invalid or non-numeric status code to 500\n Overwrite status message to match set status code\n Prefer err.statusCode if err.status is invalid\n Set response headers from err.headers object\n Use statuses instead of http module for status messages\n \n \n deps: proxy-addr@~1.1.2\n \n Fix accepting various invalid netmasks\n Fix IPv6-mapped IPv4 validation edge cases\n IPv4 netmasks must be contiguous\n IPv6 addresses cannot be used as a netmask\n deps: ipaddr.js@1.1.1\n \n \n deps: qs@6.2.0\n \n Add decoder option in parse function\n \n \n deps: range-parser@~1.2.0\n \n Add combine option to combine overlapping ranges\n Fix incorrectly returning -1 when there is at least one valid range\n perf: remove internal function\n \n \n deps: send@0.14.1\n \n Add acceptRanges option\n Add cacheControl option\n Attempt to combine multiple ranges into single range\n Correctly inherit from Stream class\n Fix Content-Range header in 416 responses when using start/end options\n Fix Content-Range header missing from default 416 responses\n Fix redirect error when path contains raw non-URL characters\n Fix redirect when path starts with multiple forward slashes\n Ignore non-byte Range headers\n deps: http-errors@~1.5.0\n deps: range-parser@~1.2.0\n deps: statuses@~1.3.0\n perf: remove argument reassignment\n \n \n deps: serve-static@~1.11.1\n \n Add acceptRanges option\n Add cacheControl option\n Attempt to combine multiple ranges into single range\n Fix redirect error when req.url contains raw non-URL characters\n Ignore non-byte Range headers\n Use status code 301 for redirects\n deps: send@0.14.1\n \n \n deps: type-is@~1.6.13\n \n Fix type error when given invalid type to match against\n deps: mime-types@~2.1.11\n \n \n deps: vary@~1.1.0\n \n Only accept valid field names in the field argument\n \n \n perf: use strict equality when possible\n\n\n4.13.4 / 2016-01-21\n\n\n deps: content-disposition@0.5.1\n \n perf: enable strict mode\n \n \n deps: cookie@0.1.5\n \n Throw on invalid values provided to serialize\n \n \n deps: depd@~1.1.0\n \n Support web browser loading\n perf: enable strict mode\n \n \n deps: escape-html@~1.0.3\n \n perf: enable strict mode\n perf: optimize string replacement\n perf: use faster string coercion\n \n \n deps: finalhandler@0.4.1\n \n deps: escape-html@~1.0.3\n \n \n deps: merge-descriptors@1.0.1\n \n perf: enable strict mode\n \n \n deps: methods@~1.1.2\n \n perf: enable strict mode\n \n \n deps: parseurl@~1.3.1\n \n perf: enable strict mode\n \n \n deps: proxy-addr@~1.0.10\n \n deps: ipaddr.js@1.0.5\n perf: enable strict mode\n \n \n deps: range-parser@~1.0.3\n \n perf: enable strict mode\n \n \n deps: send@0.13.1\n \n deps: depd@~1.1.0\n deps: destroy@~1.0.4\n deps: escape-html@~1.0.3\n deps: range-parser@~1.0.3\n \n \n deps: serve-static@~1.10.2\n \n deps: escape-html@~1.0.3\n deps: parseurl@~1.3.0\n deps: send@0.13.1\n \n \n\n\n4.13.3 / 2015-08-02\n\n\n Fix infinite loop condition using mergeParams: true\n Fix inner numeric indices incorrectly altering parent req.params\n\n\n4.13.2 / 2015-07-31\n\n\n deps: accepts@~1.2.12\n \n deps: mime-types@~2.1.4\n \n \n deps: array-flatten@1.1.1\n \n perf: enable strict mode\n \n \n deps: path-to-regexp@0.1.7\n \n Fix regression with escaped round brackets and matching groups\n \n \n deps: type-is@~1.6.6\n \n deps: mime-types@~2.1.4\n \n \n\n\n4.13.1 / 2015-07-05\n\n\n deps: accepts@~1.2.10\n \n deps: mime-types@~2.1.2\n \n \n deps: qs@4.0.0\n \n Fix dropping parameters like hasOwnProperty\n Fix various parsing edge cases\n \n \n deps: type-is@~1.6.4\n \n deps: mime-types@~2.1.2\n perf: enable strict mode\n perf: remove argument reassignment\n \n \n\n\n4.13.0 / 2015-06-20\n\n\n Add settings to debug output\n Fix res.format error when only default provided\n Fix issue where next('route') in app.param would incorrectly skip values\n Fix hiding platform issues with decodeURIComponent\n \n Only URIErrors are a 400\n \n \n Fix using * before params in routes\n Fix using capture groups before params in routes\n Simplify res.cookie to call res.append\n Use array-flatten module for flattening arrays\n deps: accepts@~1.2.9\n \n deps: mime-types@~2.1.1\n perf: avoid argument reassignment & argument slice\n perf: avoid negotiator recursive construction\n perf: enable strict mode\n perf: remove unnecessary bitwise operator\n \n \n deps: cookie@0.1.3\n \n perf: deduce the scope of try-catch deopt\n perf: remove argument reassignments\n \n \n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n \n Always include entity length in ETags for hash length extensions\n Generate non-Stats ETags using MD5 only (no longer CRC32)\n Improve stat performance by removing hashing\n Improve support for JXcore\n Remove base64 padding in ETags to shorten\n Support “fake” stats objects in environments without fs\n Use MD5 instead of MD4 in weak ETags over 1KB\n \n \n deps: finalhandler@0.4.0\n \n Fix a false-positive when unpiping in Node.js 0.8\n Support statusCode property on Error objects\n Use unpipe module for unpiping requests\n deps: escape-html@1.0.2\n deps: on-finished@~2.3.0\n perf: enable strict mode\n perf: remove argument reassignment\n \n \n deps: fresh@0.3.0\n \n Add weak ETag matching support\n \n \n deps: on-finished@~2.3.0\n \n Add defined behavior for HTTP CONNECT requests\n Add defined behavior for HTTP Upgrade requests\n deps: ee-first@1.1.1\n \n \n deps: path-to-regexp@0.1.6\n deps: send@0.13.0\n \n Allow Node.js HTTP server to set Date response header\n Fix incorrectly removing Content-Location on 304 response\n Improve the default redirect response headers\n Send appropriate headers on default error response\n Use http-errors for standard emitted errors\n Use statuses instead of http module for status messages\n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n deps: fresh@0.3.0\n deps: on-finished@~2.3.0\n perf: enable strict mode\n perf: remove unnecessary array allocations\n \n \n deps: serve-static@~1.10.0\n \n Add fallthrough option\n Fix reading options from options prototype\n Improve the default redirect response headers\n Malformed URLs now next() instead of 400\n deps: escape-html@1.0.2\n deps: send@0.13.0\n perf: enable strict mode\n perf: remove argument reassignment\n \n \n deps: type-is@~1.6.3\n \n deps: mime-types@~2.1.1\n perf: reduce try block size\n perf: remove bitwise operations\n \n \n perf: enable strict mode\n perf: isolate app.render try block\n perf: remove argument reassignments in application\n perf: remove argument reassignments in request prototype\n perf: remove argument reassignments in response prototype\n perf: remove argument reassignments in routing\n perf: remove argument reassignments in View\n perf: skip attempting to decode zero length string\n perf: use saved reference to http.STATUS_CODES\n\n\n4.12.4 / 2015-05-17\n\n\n deps: accepts@~1.2.7\n \n deps: mime-types@~2.0.11\n deps: negotiator@0.5.3\n \n \n deps: debug@~2.2.0\n \n deps: ms@0.7.1\n \n \n deps: depd@~1.0.1\n deps: etag@~1.6.0\n \n Improve support for JXcore\n Support “fake” stats objects in environments without fs\n \n \n deps: finalhandler@0.3.6\n \n deps: debug@~2.2.0\n deps: on-finished@~2.2.1\n \n \n deps: on-finished@~2.2.1\n \n Fix isFinished(req) when data buffered\n \n \n deps: proxy-addr@~1.0.8\n \n deps: ipaddr.js@1.0.1\n \n \n deps: qs@2.4.2\n Fix allowing parameters like constructor\n deps: send@0.12.3\n \n deps: debug@~2.2.0\n deps: depd@~1.0.1\n deps: etag@~1.6.0\n deps: ms@0.7.1\n deps: on-finished@~2.2.1\n \n \n deps: serve-static@~1.9.3\n \n deps: send@0.12.3\n \n \n deps: type-is@~1.6.2\n \n deps: mime-types@~2.0.11\n \n \n\n\n4.12.3 / 2015-03-17\n\n\n deps: accepts@~1.2.5\n \n deps: mime-types@~2.0.10\n \n \n deps: debug@~2.1.3\n \n Fix high intensity foreground color for bold\n deps: ms@0.7.0\n \n \n deps: finalhandler@0.3.4\n \n deps: debug@~2.1.3\n \n \n deps: proxy-addr@~1.0.7\n \n deps: ipaddr.js@0.1.9\n \n \n deps: qs@2.4.1\n \n Fix error when parameter hasOwnProperty is present\n \n \n deps: send@0.12.2\n \n Throw errors early for invalid extensions or index options\n deps: debug@~2.1.3\n \n \n deps: serve-static@~1.9.2\n \n deps: send@0.12.2\n \n \n deps: type-is@~1.6.1\n \n deps: mime-types@~2.0.10\n \n \n\n\n4.12.2 / 2015-03-02\n\n\n Fix regression where \"Request aborted\" is logged using res.sendFile\n\n\n4.12.1 / 2015-03-01\n\n\n Fix constructing application with non-configurable prototype properties\n Fix ECONNRESET errors from res.sendFile usage\n Fix req.host when using “trust proxy” hops count\n Fix req.protocol/req.secure when using “trust proxy” hops count\n Fix wrong code on aborted connections from res.sendFile\n deps: merge-descriptors@1.0.0\n\n\n4.12.0 / 2015-02-23\n\n\n Fix \"trust proxy\" setting to inherit when app is mounted\n Generate ETags for all request responses\n \n No longer restricted to only responses for GET and HEAD requests\n \n \n Use content-type to parse Content-Type headers\n deps: accepts@~1.2.4\n \n Fix preference sorting to be stable for long acceptable lists\n deps: mime-types@~2.0.9\n deps: negotiator@0.5.1\n \n \n deps: cookie-signature@1.0.6\n deps: send@0.12.1\n \n Always read the stat size from the file\n Fix mutating passed-in options\n deps: mime@1.3.4\n \n \n deps: serve-static@~1.9.1\n \n deps: send@0.12.1\n \n \n deps: type-is@~1.6.0\n \n fix argument reassignment\n fix false-positives in hasBody Transfer-Encoding check\n support wildcard for both type and subtype (*/*)\n deps: mime-types@~2.0.9\n \n \n\n\n4.11.2 / 2015-02-01\n\n\n Fix res.redirect double-calling res.end for HEAD requests\n deps: accepts@~1.2.3\n \n deps: mime-types@~2.0.8\n \n \n deps: proxy-addr@~1.0.6\n \n deps: ipaddr.js@0.1.8\n \n \n deps: type-is@~1.5.6\n \n deps: mime-types@~2.0.8\n \n \n\n\n4.11.1 / 2015-01-20\n\n\n deps: send@0.11.1\n \n Fix root path disclosure\n \n \n deps: serve-static@~1.8.1\n \n Fix redirect loop in Node.js 0.11.14\n Fix root path disclosure\n deps: send@0.11.1\n \n \n\n\n4.11.0 / 2015-01-13\n\n\n Add res.append(field, val) to append headers\n Deprecate leading : in name for app.param(name, fn)\n Deprecate req.param() – use req.params, req.body, or req.query instead\n Deprecate app.param(fn)\n Fix OPTIONS responses to include the HEAD method properly\n Fix res.sendFile not always detecting aborted connection\n Match routes iteratively to prevent stack overflows\n deps: accepts@~1.2.2\n \n deps: mime-types@~2.0.7\n deps: negotiator@0.5.0\n \n \n deps: send@0.11.0\n \n deps: debug@~2.1.1\n deps: etag@~1.5.1\n deps: ms@0.7.0\n deps: on-finished@~2.2.0\n \n \n deps: serve-static@~1.8.0\n \n deps: send@0.11.0\n \n \n\n\n4.10.8 / 2015-01-13\n\n\n Fix crash from error within OPTIONS response handler\n deps: proxy-addr@~1.0.5\n \n deps: ipaddr.js@0.1.6\n \n \n\n\n4.10.7 / 2015-01-04\n\n\n Fix Allow header for OPTIONS to not contain duplicate methods\n Fix incorrect “Request aborted” for res.sendFile when HEAD or 304\n deps: debug@~2.1.1\n deps: finalhandler@0.3.3\n \n deps: debug@~2.1.1\n deps: on-finished@~2.2.0\n \n \n deps: methods@~1.1.1\n deps: on-finished@~2.2.0\n deps: serve-static@~1.7.2\n \n Fix potential open redirect when mounted at root\n \n \n deps: type-is@~1.5.5\n \n deps: mime-types@~2.0.7\n \n \n\n\n4.10.6 / 2014-12-12\n\n\n Fix exception in req.fresh/req.stale without response headers\n\n\n4.10.5 / 2014-12-10\n\n\n Fix res.send double-calling res.end for HEAD requests\n deps: accepts@~1.1.4\n \n deps: mime-types@~2.0.4\n \n \n deps: type-is@~1.5.4\n \n deps: mime-types@~2.0.4\n \n \n\n\n4.10.4 / 2014-11-24\n\n\n Fix res.sendfile logging standard write errors\n\n\n4.10.3 / 2014-11-23\n\n\n Fix res.sendFile logging standard write errors\n deps: etag@~1.5.1\n deps: proxy-addr@~1.0.4\n \n deps: ipaddr.js@0.1.5\n \n \n deps: qs@2.3.3\n \n Fix arrayLimit behavior\n \n \n\n\n4.10.2 / 2014-11-09\n\n\n Correctly invoke async router callback asynchronously\n deps: accepts@~1.1.3\n \n deps: mime-types@~2.0.3\n \n \n deps: type-is@~1.5.3\n \n deps: mime-types@~2.0.3\n \n \n\n\n4.10.1 / 2014-10-28\n\n\n Fix handling of URLs containing :// in the path\n deps: qs@2.3.2\n \n Fix parsing of mixed objects and values\n \n \n\n\n4.10.0 / 2014-10-23\n\n\n Add support for app.set('views', array)\n \n Views are looked up in sequence in array of directories\n \n \n Fix res.send(status) to mention res.sendStatus(status)\n Fix handling of invalid empty URLs\n Use content-disposition module for res.attachment/res.download\n \n Sends standards-compliant Content-Disposition header\n Full Unicode support\n \n \n Use path.resolve in view lookup\n deps: debug@~2.1.0\n \n Implement DEBUG_FD env variable support\n \n \n deps: depd@~1.0.0\n deps: etag@~1.5.0\n \n Improve string performance\n Slightly improve speed for weak ETags over 1KB\n \n \n deps: finalhandler@0.3.2\n \n Terminate in progress response only on error\n Use on-finished to determine request status\n deps: debug@~2.1.0\n deps: on-finished@~2.1.1\n \n \n deps: on-finished@~2.1.1\n \n Fix handling of pipelined requests\n \n \n deps: qs@2.3.0\n \n Fix parsing of mixed implicit and explicit arrays\n \n \n deps: send@0.10.1\n \n deps: debug@~2.1.0\n deps: depd@~1.0.0\n deps: etag@~1.5.0\n deps: on-finished@~2.1.1\n \n \n deps: serve-static@~1.7.1\n \n deps: send@0.10.1\n \n \n\n\n4.9.8 / 2014-10-17\n\n\n Fix res.redirect body when redirect status specified\n deps: accepts@~1.1.2\n \n Fix error when media type has invalid parameter\n deps: negotiator@0.4.9\n \n \n\n\n4.9.7 / 2014-10-10\n\n\n Fix using same param name in array of paths\n\n\n4.9.6 / 2014-10-08\n\n\n deps: accepts@~1.1.1\n \n deps: mime-types@~2.0.2\n deps: negotiator@0.4.8\n \n \n deps: serve-static@~1.6.4\n \n Fix redirect loop when index file serving disabled\n \n \n deps: type-is@~1.5.2\n \n deps: mime-types@~2.0.2\n \n \n\n\n4.9.5 / 2014-09-24\n\n\n deps: etag@~1.4.0\n deps: proxy-addr@~1.0.3\n \n Use forwarded npm module\n \n \n deps: send@0.9.3\n \n deps: etag@~1.4.0\n \n \n deps: serve-static@~1.6.3\n \n deps: send@0.9.3\n \n \n\n\n4.9.4 / 2014-09-19\n\n\n deps: qs@2.2.4\n \n Fix issue with object keys starting with numbers truncated\n \n \n\n\n4.9.3 / 2014-09-18\n\n\n deps: proxy-addr@~1.0.2\n \n Fix a global leak when multiple subnets are trusted\n deps: ipaddr.js@0.1.3\n \n \n\n\n4.9.2 / 2014-09-17\n\n\n Fix regression for empty string path in app.use\n Fix router.use to accept array of middleware without path\n Improve error message for bad app.use arguments\n\n\n4.9.1 / 2014-09-16\n\n\n Fix app.use to accept array of middleware without path\n deps: depd@0.4.5\n deps: etag@~1.3.1\n deps: send@0.9.2\n \n deps: depd@0.4.5\n deps: etag@~1.3.1\n deps: range-parser@~1.0.2\n \n \n deps: serve-static@~1.6.2\n \n deps: send@0.9.2\n \n \n\n\n4.9.0 / 2014-09-08\n\n\n Add res.sendStatus\n Invoke callback for sendfile when client aborts\n \n Applies to res.sendFile, res.sendfile, and res.download\n err will be populated with request aborted error\n \n \n Support IP address host in req.subdomains\n Use etag to generate ETag headers\n deps: accepts@~1.1.0\n \n update mime-types\n \n \n deps: cookie-signature@1.0.5\n deps: debug@~2.0.0\n deps: finalhandler@0.2.0\n \n Set X-Content-Type-Options: nosniff header\n deps: debug@~2.0.0\n \n \n deps: fresh@0.2.4\n deps: media-typer@0.3.0\n \n Throw error when parameter format invalid on parse\n \n \n deps: qs@2.2.3\n \n Fix issue where first empty value in array is discarded\n \n \n deps: range-parser@~1.0.2\n deps: send@0.9.1\n \n Add lastModified option\n Use etag to generate ETag header\n deps: debug@~2.0.0\n deps: fresh@0.2.4\n \n \n deps: serve-static@~1.6.1\n \n Add lastModified option\n deps: send@0.9.1\n \n \n deps: type-is@~1.5.1\n \n fix hasbody to be true for content-length: 0\n deps: media-typer@0.3.0\n deps: mime-types@~2.0.1\n \n \n deps: vary@~1.0.0\n \n Accept valid Vary header string as field\n \n \n\n\n4.8.8 / 2014-09-04\n\n\n deps: send@0.8.5\n \n Fix a path traversal issue when using root\n Fix malicious path detection for empty string path\n \n \n deps: serve-static@~1.5.4\n \n deps: send@0.8.5\n \n \n\n\n4.8.7 / 2014-08-29\n\n\n deps: qs@2.2.2\n \n Remove unnecessary cloning\n \n \n\n\n4.8.6 / 2014-08-27\n\n\n deps: qs@2.2.0\n \n Array parsing fix\n Performance improvements\n \n \n\n\n4.8.5 / 2014-08-18\n\n\n deps: send@0.8.3\n \n deps: destroy@1.0.3\n deps: on-finished@2.1.0\n \n \n deps: serve-static@~1.5.3\n \n deps: send@0.8.3\n \n \n\n\n4.8.4 / 2014-08-14\n\n\n deps: qs@1.2.2\n deps: send@0.8.2\n \n Work around fd leak in Node.js 0.10 for fs.ReadStream\n \n \n deps: serve-static@~1.5.2\n \n deps: send@0.8.2\n \n \n\n\n4.8.3 / 2014-08-10\n\n\n deps: parseurl@~1.3.0\n deps: qs@1.2.1\n deps: serve-static@~1.5.1\n \n Fix parsing of weird req.originalUrl values\n deps: parseurl@~1.3.0\n deps: utils-merge@1.0.0\n \n \n\n\n4.8.2 / 2014-08-07\n\n\n deps: qs@1.2.0\n \n Fix parsing array of objects\n \n \n\n\n4.8.1 / 2014-08-06\n\n\n fix incorrect deprecation warnings on res.download\n deps: qs@1.1.0\n \n Accept urlencoded square brackets\n Accept empty values in implicit array notation\n \n \n\n\n4.8.0 / 2014-08-05\n\n\n add res.sendFile\n \n accepts a file system path instead of a URL\n requires an absolute path or root option specified\n \n \n deprecate res.sendfile – use res.sendFile instead\n support mounted app as any argument to app.use()\n deps: qs@1.0.2\n \n Complete rewrite\n Limits array length to 20\n Limits object depth to 5\n Limits parameters to 1,000\n \n \n deps: send@0.8.1\n \n Add extensions option\n \n \n deps: serve-static@~1.5.0\n \n Add extensions option\n deps: send@0.8.1\n \n \n\n\n4.7.4 / 2014-08-04\n\n\n fix res.sendfile regression for serving directory index files\n deps: send@0.7.4\n \n Fix incorrect 403 on Windows and Node.js 0.11\n Fix serving index files without root dir\n \n \n deps: serve-static@~1.4.4\n \n deps: send@0.7.4\n \n \n\n\n4.7.3 / 2014-08-04\n\n\n deps: send@0.7.3\n \n Fix incorrect 403 on Windows and Node.js 0.11\n \n \n deps: serve-static@~1.4.3\n \n Fix incorrect 403 on Windows and Node.js 0.11\n deps: send@0.7.3\n \n \n\n\n4.7.2 / 2014-07-27\n\n\n deps: depd@0.4.4\n \n Work-around v8 generating empty stack traces\n \n \n deps: send@0.7.2\n \n deps: depd@0.4.4\n \n \n deps: serve-static@~1.4.2\n\n\n4.7.1 / 2014-07-26\n\n\n deps: depd@0.4.3\n \n Fix exception when global Error.stackTraceLimit is too low\n \n \n deps: send@0.7.1\n \n deps: depd@0.4.3\n \n \n deps: serve-static@~1.4.1\n\n\n4.7.0 / 2014-07-25\n\n\n fix req.protocol for proxy-direct connections\n configurable query parser with app.set('query parser', parser)\n \n app.set('query parser', 'extended') parse with “qs” module\n app.set('query parser', 'simple') parse with “querystring” core module\n app.set('query parser', false) disable query string parsing\n app.set('query parser', true) enable simple parsing\n \n \n deprecate res.json(status, obj) – use res.status(status).json(obj) instead\n deprecate res.jsonp(status, obj) – use res.status(status).jsonp(obj) instead\n deprecate res.send(status, body) – use res.status(status).send(body) instead\n deps: debug@1.0.4\n deps: depd@0.4.2\n \n Add TRACE_DEPRECATION environment variable\n Remove non-standard grey color from color output\n Support --no-deprecation argument\n Support --trace-deprecation argument\n \n \n deps: finalhandler@0.1.0\n \n Respond after request fully read\n deps: debug@1.0.4\n \n \n deps: parseurl@~1.2.0\n \n Cache URLs based on original value\n Remove no-longer-needed URL mis-parse work-around\n Simplify the “fast-path” RegExp\n \n \n deps: send@0.7.0\n \n Add dotfiles option\n Cap maxAge value to 1 year\n deps: debug@1.0.4\n deps: depd@0.4.2\n \n \n deps: serve-static@~1.4.0\n \n deps: parseurl@~1.2.0\n deps: send@0.7.0\n \n \n perf: prevent multiple Buffer creation in res.send\n\n\n4.6.1 / 2014-07-12\n\n\n fix subapp.mountpath regression for app.use(subapp)\n\n\n4.6.0 / 2014-07-11\n\n\n accept multiple callbacks to app.use()\n add explicit “Rosetta Flash JSONP abuse” protection\n \n previous versions are not vulnerable; this is just explicit protection\n \n \n catch errors in multiple req.param(name, fn) handlers\n deprecate res.redirect(url, status) – use res.redirect(status, url) instead\n fix res.send(status, num) to send num as json (not error)\n remove unnecessary escaping when res.jsonp returns JSON response\n support non-string path in app.use(path, fn)\n \n supports array of paths\n supports RegExp\n \n \n router: fix optimization on router exit\n router: refactor location of try blocks\n router: speed up standard app.use(fn)\n deps: debug@1.0.3\n \n Add support for multiple wildcards in namespaces\n \n \n deps: finalhandler@0.0.3\n \n deps: debug@1.0.3\n \n \n deps: methods@1.1.0\n \n add CONNECT\n \n \n deps: parseurl@~1.1.3\n \n faster parsing of href-only URLs\n \n \n deps: path-to-regexp@0.1.3\n deps: send@0.6.0\n \n deps: debug@1.0.3\n \n \n deps: serve-static@~1.3.2\n \n deps: parseurl@~1.1.3\n deps: send@0.6.0\n \n \n perf: fix arguments reassign deopt in some res methods\n\n\n4.5.1 / 2014-07-06\n\n\n fix routing regression when altering req.method\n\n\n4.5.0 / 2014-07-04\n\n\n add deprecation message to non-plural req.accepts*\n add deprecation message to res.send(body, status)\n add deprecation message to res.vary()\n add headers option to res.sendfile\n \n use to set headers on successful file transfer\n \n \n add mergeParams option to Router\n \n merges req.params from parent routes\n \n \n add req.hostname – correct name for what req.host returns\n deprecate things with depd module\n deprecate req.host – use req.hostname instead\n fix behavior when handling request without routes\n fix handling when route.all is only route\n invoke router.param() only when route matches\n restore req.params after invoking router\n use finalhandler for final response handling\n use media-typer to alter content-type charset\n deps: accepts@~1.0.7\n deps: send@0.5.0\n \n Accept string for maxage (converted by ms)\n Include link in default redirect response\n \n \n deps: serve-static@~1.3.0\n \n Accept string for maxAge (converted by ms)\n Add setHeaders option\n Include HTML link in redirect response\n deps: send@0.5.0\n \n \n deps: type-is@~1.3.2\n\n\n4.4.5 / 2014-06-26\n\n\n deps: cookie-signature@1.0.4\n \n fix for timing attacks\n \n \n\n\n4.4.4 / 2014-06-20\n\n\n fix res.attachment Unicode filenames in Safari\n fix “trim prefix” debug message in express:router\n deps: accepts@~1.0.5\n deps: buffer-crc32@0.2.3\n\n\n4.4.3 / 2014-06-11\n\n\n fix persistence of modified req.params[name] from app.param()\n deps: accepts@1.0.3\n \n deps: negotiator@0.4.6\n \n \n deps: debug@1.0.2\n deps: send@0.4.3\n \n Do not throw uncatchable error on file open race condition\n Use escape-html for HTML escaping\n deps: debug@1.0.2\n deps: finished@1.2.2\n deps: fresh@0.2.2\n \n \n deps: serve-static@1.2.3\n \n Do not throw uncatchable error on file open race condition\n deps: send@0.4.3\n \n \n\n\n4.4.2 / 2014-06-09\n\n\n fix catching errors from top-level handlers\n use vary module for res.vary\n deps: debug@1.0.1\n deps: proxy-addr@1.0.1\n deps: send@0.4.2\n \n fix “event emitter leak” warnings\n deps: debug@1.0.1\n deps: finished@1.2.1\n \n \n deps: serve-static@1.2.2\n \n fix “event emitter leak” warnings\n deps: send@0.4.2\n \n \n deps: type-is@1.2.1\n\n\n4.4.1 / 2014-06-02\n\n\n deps: methods@1.0.1\n deps: send@0.4.1\n \n Send max-age in Cache-Control in correct format\n \n \n deps: serve-static@1.2.1\n \n use escape-html for escaping\n deps: send@0.4.1\n \n \n\n\n4.4.0 / 2014-05-30\n\n\n custom etag control with app.set('etag', val)\n \n app.set('etag', function(body, encoding){ return '\"etag\"' }) custom etag generation\n app.set('etag', 'weak') weak tag\n app.set('etag', 'strong') strong etag\n app.set('etag', false) turn off\n app.set('etag', true) standard etag\n \n \n mark res.send ETag as weak and reduce collisions\n update accepts to 1.0.2\n \n Fix interpretation when header not in request\n \n \n update send to 0.4.0\n \n Calculate ETag with md5 for reduced collisions\n Ignore stream errors after request ends\n deps: debug@0.8.1\n \n \n update serve-static to 1.2.0\n \n Calculate ETag with md5 for reduced collisions\n Ignore stream errors after request ends\n deps: send@0.4.0\n \n \n\n\n4.3.2 / 2014-05-28\n\n\n fix handling of errors from router.param() callbacks\n\n\n4.3.1 / 2014-05-23\n\n\n revert “fix behavior of multiple app.VERB for the same path”\n \n this caused a regression in the order of route execution\n \n \n\n\n4.3.0 / 2014-05-21\n\n\n add req.baseUrl to access the path stripped from req.url in routes\n fix behavior of multiple app.VERB for the same path\n fix issue routing requests among sub routers\n invoke router.param() only when necessary instead of every match\n proper proxy trust with app.set('trust proxy', trust)\n \n app.set('trust proxy', 1) trust first hop\n app.set('trust proxy', 'loopback') trust loopback addresses\n app.set('trust proxy', '10.0.0.1') trust single IP\n app.set('trust proxy', '10.0.0.1/16') trust subnet\n app.set('trust proxy', '10.0.0.1, 10.0.0.2') trust list\n app.set('trust proxy', false) turn off\n app.set('trust proxy', true) trust everything\n \n \n set proper charset in Content-Type for res.send\n update type-is to 1.2.0\n \n support suffix matching\n \n \n\n\n4.2.0 / 2014-05-11\n\n\n deprecate app.del() – use app.delete() instead\n deprecate res.json(obj, status) – use res.json(status, obj) instead\n \n the edge-case res.json(status, num) requires res.status(status).json(num)\n \n \n deprecate res.jsonp(obj, status) – use res.jsonp(status, obj) instead\n \n the edge-case res.jsonp(status, num) requires res.status(status).jsonp(num)\n \n \n fix req.next when inside router instance\n include ETag header in HEAD requests\n keep previous Content-Type for res.jsonp\n support PURGE method\n \n add app.purge\n add router.purge\n include PURGE in app.all\n \n \n update debug to 0.8.0\n \n add enable() method\n change from stderr to stdout\n \n \n update methods to 1.0.0\n \n add PURGE\n \n \n\n\n4.1.2 / 2014-05-08\n\n\n fix req.host for IPv6 literals\n fix res.jsonp error if callback param is object\n\n\n4.1.1 / 2014-04-27\n\n\n fix package.json to reflect supported node version\n\n\n4.1.0 / 2014-04-24\n\n\n pass options from res.sendfile to send\n preserve casing of headers in res.header and res.set\n support unicode file names in res.attachment and res.download\n update accepts to 1.0.1\n \n deps: negotiator@0.4.0\n \n \n update cookie to 0.1.2\n \n Fix for maxAge == 0\n made compat with expires field\n \n \n update send to 0.3.0\n \n Accept API options in options object\n Coerce option types\n Control whether to generate etags\n Default directory access to 403 when index disabled\n Fix sending files with dots without root set\n Include file path in etag\n Make “Can’t set headers after they are sent.” catchable\n Send full entity-body for multi range requests\n Set etags to “weak”\n Support “If-Range” header\n Support multiple index paths\n deps: mime@1.2.11\n \n \n update serve-static to 1.1.0\n \n Accept options directly to send module\n Resolve relative paths at middleware setup\n Use parseurl to parse the URL from request\n deps: send@0.3.0\n \n \n update type-is to 1.1.0\n \n add non-array values support\n add multipart as a shorthand\n \n \n\n\n4.0.0 / 2014-04-09\n\n\n remove:\n \n node 0.8 support\n connect and connect’s patches except for charset handling\n express(1) - moved to express-generator\n express.createServer() - it has been deprecated for a long time. Use express()\n app.configure - use logic in your own app code\n app.router - is removed\n req.auth - use basic-auth instead\n req.accepted* - use req.accepts*() instead\n res.location - relative URL resolution is removed\n res.charset - include the charset in the content type when using res.set()\n all bundled middleware except static\n \n \n change:\n \n app.route -> app.mountpath when mounting an express app in another express app\n json spaces no longer enabled by default in development\n req.accepts* -> req.accepts*s - i.e. req.acceptsEncoding -> req.acceptsEncodings\n req.params is now an object instead of an array\n res.locals is no longer a function. It is a plain js object. Treat it as such.\n res.headerSent -> res.headersSent to match node.js ServerResponse object\n \n \n refactor:\n \n req.accepts* with accepts\n req.is with type-is\n path-to-regexp\n \n \n add:\n \n app.router() - returns the app Router instance\n app.route() - Proxy to the app’s Router#route() method to create a new route\n Router & Route - public API\n \n \n\n\n3.21.2 / 2015-07-31\n\n\n deps: connect@2.30.2\n \n deps: body-parser@~1.13.3\n deps: compression@~1.5.2\n deps: errorhandler@~1.4.2\n deps: method-override@~2.3.5\n deps: serve-index@~1.7.2\n deps: type-is@~1.6.6\n deps: vhost@~3.0.1\n \n \n deps: vary@~1.0.1\n \n Fix setting empty header from empty field\n perf: enable strict mode\n perf: remove argument reassignments\n \n \n\n\n3.21.1 / 2015-07-05\n\n\n deps: basic-auth@~1.0.3\n deps: connect@2.30.1\n \n deps: body-parser@~1.13.2\n deps: compression@~1.5.1\n deps: errorhandler@~1.4.1\n deps: morgan@~1.6.1\n deps: pause@0.1.0\n deps: qs@4.0.0\n deps: serve-index@~1.7.1\n deps: type-is@~1.6.4\n \n \n\n\n3.21.0 / 2015-06-18\n\n\n deps: basic-auth@1.0.2\n \n perf: enable strict mode\n perf: hoist regular expression\n perf: parse with regular expressions\n perf: remove argument reassignment\n \n \n deps: connect@2.30.0\n \n deps: body-parser@~1.13.1\n deps: bytes@2.1.0\n deps: compression@~1.5.0\n deps: cookie@0.1.3\n deps: cookie-parser@~1.3.5\n deps: csurf@~1.8.3\n deps: errorhandler@~1.4.0\n deps: express-session@~1.11.3\n deps: finalhandler@0.4.0\n deps: fresh@0.3.0\n deps: morgan@~1.6.0\n deps: serve-favicon@~2.3.0\n deps: serve-index@~1.7.0\n deps: serve-static@~1.10.0\n deps: type-is@~1.6.3\n \n \n deps: cookie@0.1.3\n \n perf: deduce the scope of try-catch deopt\n perf: remove argument reassignments\n \n \n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n \n Always include entity length in ETags for hash length extensions\n Generate non-Stats ETags using MD5 only (no longer CRC32)\n Improve stat performance by removing hashing\n Improve support for JXcore\n Remove base64 padding in ETags to shorten\n Support “fake” stats objects in environments without fs\n Use MD5 instead of MD4 in weak ETags over 1KB\n \n \n deps: fresh@0.3.0\n \n Add weak ETag matching support\n \n \n deps: mkdirp@0.5.1\n \n Work in global strict mode\n \n \n deps: send@0.13.0\n \n Allow Node.js HTTP server to set Date response header\n Fix incorrectly removing Content-Location on 304 response\n Improve the default redirect response headers\n Send appropriate headers on default error response\n Use http-errors for standard emitted errors\n Use statuses instead of http module for status messages\n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n deps: fresh@0.3.0\n deps: on-finished@~2.3.0\n perf: enable strict mode\n perf: remove unnecessary array allocations\n \n \n\n\n3.20.3 / 2015-05-17\n\n\n deps: connect@2.29.2\n \n deps: body-parser@~1.12.4\n deps: compression@~1.4.4\n deps: connect-timeout@~1.6.2\n deps: debug@~2.2.0\n deps: depd@~1.0.1\n deps: errorhandler@~1.3.6\n deps: finalhandler@0.3.6\n deps: method-override@~2.3.3\n deps: morgan@~1.5.3\n deps: qs@2.4.2\n deps: response-time@~2.3.1\n deps: serve-favicon@~2.2.1\n deps: serve-index@~1.6.4\n deps: serve-static@~1.9.3\n deps: type-is@~1.6.2\n \n \n deps: debug@~2.2.0\n \n deps: ms@0.7.1\n \n \n deps: depd@~1.0.1\n deps: proxy-addr@~1.0.8\n \n deps: ipaddr.js@1.0.1\n \n \n deps: send@0.12.3\n \n deps: debug@~2.2.0\n deps: depd@~1.0.1\n deps: etag@~1.6.0\n deps: ms@0.7.1\n deps: on-finished@~2.2.1\n \n \n\n\n3.20.2 / 2015-03-16\n\n\n deps: connect@2.29.1\n \n deps: body-parser@~1.12.2\n deps: compression@~1.4.3\n deps: connect-timeout@~1.6.1\n deps: debug@~2.1.3\n deps: errorhandler@~1.3.5\n deps: express-session@~1.10.4\n deps: finalhandler@0.3.4\n deps: method-override@~2.3.2\n deps: morgan@~1.5.2\n deps: qs@2.4.1\n deps: serve-index@~1.6.3\n deps: serve-static@~1.9.2\n deps: type-is@~1.6.1\n \n \n deps: debug@~2.1.3\n \n Fix high intensity foreground color for bold\n deps: ms@0.7.0\n \n \n deps: merge-descriptors@1.0.0\n deps: proxy-addr@~1.0.7\n \n deps: ipaddr.js@0.1.9\n \n \n deps: send@0.12.2\n \n Throw errors early for invalid extensions or index options\n deps: debug@~2.1.3\n \n \n\n\n3.20.1 / 2015-02-28\n\n\n Fix req.host when using “trust proxy” hops count\n Fix req.protocol/req.secure when using “trust proxy” hops count\n\n\n3.20.0 / 2015-02-18\n\n\n Fix \"trust proxy\" setting to inherit when app is mounted\n Generate ETags for all request responses\n \n No longer restricted to only responses for GET and HEAD requests\n \n \n Use content-type to parse Content-Type headers\n deps: connect@2.29.0\n \n Use content-type to parse Content-Type headers\n deps: body-parser@~1.12.0\n deps: compression@~1.4.1\n deps: connect-timeout@~1.6.0\n deps: cookie-parser@~1.3.4\n deps: cookie-signature@1.0.6\n deps: csurf@~1.7.0\n deps: errorhandler@~1.3.4\n deps: express-session@~1.10.3\n deps: http-errors@~1.3.1\n deps: response-time@~2.3.0\n deps: serve-index@~1.6.2\n deps: serve-static@~1.9.1\n deps: type-is@~1.6.0\n \n \n deps: cookie-signature@1.0.6\n deps: send@0.12.1\n \n Always read the stat size from the file\n Fix mutating passed-in options\n deps: mime@1.3.4\n \n \n\n\n3.19.2 / 2015-02-01\n\n\n deps: connect@2.28.3\n \n deps: compression@~1.3.1\n deps: csurf@~1.6.6\n deps: errorhandler@~1.3.3\n deps: express-session@~1.10.2\n deps: serve-index@~1.6.1\n deps: type-is@~1.5.6\n \n \n deps: proxy-addr@~1.0.6\n \n deps: ipaddr.js@0.1.8\n \n \n\n\n3.19.1 / 2015-01-20\n\n\n deps: connect@2.28.2\n \n deps: body-parser@~1.10.2\n deps: serve-static@~1.8.1\n \n \n deps: send@0.11.1\n \n Fix root path disclosure\n \n \n\n\n3.19.0 / 2015-01-09\n\n\n Fix OPTIONS responses to include the HEAD method property\n Use readline for prompt in express(1)\n deps: commander@2.6.0\n deps: connect@2.28.1\n \n deps: body-parser@~1.10.1\n deps: compression@~1.3.0\n deps: connect-timeout@~1.5.0\n deps: csurf@~1.6.4\n deps: debug@~2.1.1\n deps: errorhandler@~1.3.2\n deps: express-session@~1.10.1\n deps: finalhandler@0.3.3\n deps: method-override@~2.3.1\n deps: morgan@~1.5.1\n deps: serve-favicon@~2.2.0\n deps: serve-index@~1.6.0\n deps: serve-static@~1.8.0\n deps: type-is@~1.5.5\n \n \n deps: debug@~2.1.1\n deps: methods@~1.1.1\n deps: proxy-addr@~1.0.5\n \n deps: ipaddr.js@0.1.6\n \n \n deps: send@0.11.0\n \n deps: debug@~2.1.1\n deps: etag@~1.5.1\n deps: ms@0.7.0\n deps: on-finished@~2.2.0\n \n \n\n\n3.18.6 / 2014-12-12\n\n\n Fix exception in req.fresh/req.stale without response headers\n\n\n3.18.5 / 2014-12-11\n\n\n deps: connect@2.27.6\n \n deps: compression@~1.2.2\n deps: express-session@~1.9.3\n deps: http-errors@~1.2.8\n deps: serve-index@~1.5.3\n deps: type-is@~1.5.4\n \n \n\n\n3.18.4 / 2014-11-23\n\n\n deps: connect@2.27.4\n \n deps: body-parser@~1.9.3\n deps: compression@~1.2.1\n deps: errorhandler@~1.2.3\n deps: express-session@~1.9.2\n deps: qs@2.3.3\n deps: serve-favicon@~2.1.7\n deps: serve-static@~1.5.1\n deps: type-is@~1.5.3\n \n \n deps: etag@~1.5.1\n deps: proxy-addr@~1.0.4\n \n deps: ipaddr.js@0.1.5\n \n \n\n\n3.18.3 / 2014-11-09\n\n\n deps: connect@2.27.3\n \n Correctly invoke async callback asynchronously\n deps: csurf@~1.6.3\n \n \n\n\n3.18.2 / 2014-10-28\n\n\n deps: connect@2.27.2\n \n Fix handling of URLs containing :// in the path\n deps: body-parser@~1.9.2\n deps: qs@2.3.2\n \n \n\n\n3.18.1 / 2014-10-22\n\n\n Fix internal utils.merge deprecation warnings\n deps: connect@2.27.1\n \n deps: body-parser@~1.9.1\n deps: express-session@~1.9.1\n deps: finalhandler@0.3.2\n deps: morgan@~1.4.1\n deps: qs@2.3.0\n deps: serve-static@~1.7.1\n \n \n deps: send@0.10.1\n \n deps: on-finished@~2.1.1\n \n \n\n\n3.18.0 / 2014-10-17\n\n\n Use content-disposition module for res.attachment/res.download\n \n Sends standards-compliant Content-Disposition header\n Full Unicode support\n \n \n Use etag module to generate ETag headers\n deps: connect@2.27.0\n \n Use http-errors module for creating errors\n Use utils-merge module for merging objects\n deps: body-parser@~1.9.0\n deps: compression@~1.2.0\n deps: connect-timeout@~1.4.0\n deps: debug@~2.1.0\n deps: depd@~1.0.0\n deps: express-session@~1.9.0\n deps: finalhandler@0.3.1\n deps: method-override@~2.3.0\n deps: morgan@~1.4.0\n deps: response-time@~2.2.0\n deps: serve-favicon@~2.1.6\n deps: serve-index@~1.5.0\n deps: serve-static@~1.7.0\n \n \n deps: debug@~2.1.0\n \n Implement DEBUG_FD env variable support\n \n \n deps: depd@~1.0.0\n deps: send@0.10.0\n \n deps: debug@~2.1.0\n deps: depd@~1.0.0\n deps: etag@~1.5.0\n \n \n\n\n3.17.8 / 2014-10-15\n\n\n deps: connect@2.26.6\n \n deps: compression@~1.1.2\n deps: csurf@~1.6.2\n deps: errorhandler@~1.2.2\n \n \n\n\n3.17.7 / 2014-10-08\n\n\n deps: connect@2.26.5\n \n Fix accepting non-object arguments to logger\n deps: serve-static@~1.6.4\n \n \n\n\n3.17.6 / 2014-10-02\n\n\n deps: connect@2.26.4\n \n deps: morgan@~1.3.2\n deps: type-is@~1.5.2\n \n \n\n\n3.17.5 / 2014-09-24\n\n\n deps: connect@2.26.3\n \n deps: body-parser@~1.8.4\n deps: serve-favicon@~2.1.5\n deps: serve-static@~1.6.3\n \n \n deps: proxy-addr@~1.0.3\n \n Use forwarded npm module\n \n \n deps: send@0.9.3\n \n deps: etag@~1.4.0\n \n \n\n\n3.17.4 / 2014-09-19\n\n\n deps: connect@2.26.2\n \n deps: body-parser@~1.8.3\n deps: qs@2.2.4\n \n \n\n\n3.17.3 / 2014-09-18\n\n\n deps: proxy-addr@~1.0.2\n \n Fix a global leak when multiple subnets are trusted\n deps: ipaddr.js@0.1.3\n \n \n\n\n3.17.2 / 2014-09-15\n\n\n Use crc instead of buffer-crc32 for speed\n deps: connect@2.26.1\n \n deps: body-parser@~1.8.2\n deps: depd@0.4.5\n deps: express-session@~1.8.2\n deps: morgan@~1.3.1\n deps: serve-favicon@~2.1.3\n deps: serve-static@~1.6.2\n \n \n deps: depd@0.4.5\n deps: send@0.9.2\n \n deps: depd@0.4.5\n deps: etag@~1.3.1\n deps: range-parser@~1.0.2\n \n \n\n\n3.17.1 / 2014-09-08\n\n\n Fix error in req.subdomains on empty host\n\n\n3.17.0 / 2014-09-08\n\n\n Support X-Forwarded-Host in req.subdomains\n Support IP address host in req.subdomains\n deps: connect@2.26.0\n \n deps: body-parser@~1.8.1\n deps: compression@~1.1.0\n deps: connect-timeout@~1.3.0\n deps: cookie-parser@~1.3.3\n deps: cookie-signature@1.0.5\n deps: csurf@~1.6.1\n deps: debug@~2.0.0\n deps: errorhandler@~1.2.0\n deps: express-session@~1.8.1\n deps: finalhandler@0.2.0\n deps: fresh@0.2.4\n deps: media-typer@0.3.0\n deps: method-override@~2.2.0\n deps: morgan@~1.3.0\n deps: qs@2.2.3\n deps: serve-favicon@~2.1.3\n deps: serve-index@~1.2.1\n deps: serve-static@~1.6.1\n deps: type-is@~1.5.1\n deps: vhost@~3.0.0\n \n \n deps: cookie-signature@1.0.5\n deps: debug@~2.0.0\n deps: fresh@0.2.4\n deps: media-typer@0.3.0\n \n Throw error when parameter format invalid on parse\n \n \n deps: range-parser@~1.0.2\n deps: send@0.9.1\n \n Add lastModified option\n Use etag to generate ETag header\n deps: debug@~2.0.0\n deps: fresh@0.2.4\n \n \n deps: vary@~1.0.0\n \n Accept valid Vary header string as field\n \n \n\n\n3.16.10 / 2014-09-04\n\n\n deps: connect@2.25.10\n \n deps: serve-static@~1.5.4\n \n \n deps: send@0.8.5\n \n Fix a path traversal issue when using root\n Fix malicious path detection for empty string path\n \n \n\n\n3.16.9 / 2014-08-29\n\n\n deps: connect@2.25.9\n \n deps: body-parser@~1.6.7\n deps: qs@2.2.2\n \n \n\n\n3.16.8 / 2014-08-27\n\n\n deps: connect@2.25.8\n \n deps: body-parser@~1.6.6\n deps: csurf@~1.4.1\n deps: qs@2.2.0\n \n \n\n\n3.16.7 / 2014-08-18\n\n\n deps: connect@2.25.7\n \n deps: body-parser@~1.6.5\n deps: express-session@~1.7.6\n deps: morgan@~1.2.3\n deps: serve-static@~1.5.3\n \n \n deps: send@0.8.3\n \n deps: destroy@1.0.3\n deps: on-finished@2.1.0\n \n \n\n\n3.16.6 / 2014-08-14\n\n\n deps: connect@2.25.6\n \n deps: body-parser@~1.6.4\n deps: qs@1.2.2\n deps: serve-static@~1.5.2\n \n \n deps: send@0.8.2\n \n Work around fd leak in Node.js 0.10 for fs.ReadStream\n \n \n\n\n3.16.5 / 2014-08-11\n\n\n deps: connect@2.25.5\n \n Fix backwards compatibility in logger\n \n \n\n\n3.16.4 / 2014-08-10\n\n\n Fix original URL parsing in res.location\n deps: connect@2.25.4\n \n Fix query middleware breaking with argument\n deps: body-parser@~1.6.3\n deps: compression@~1.0.11\n deps: connect-timeout@~1.2.2\n deps: express-session@~1.7.5\n deps: method-override@~2.1.3\n deps: on-headers@~1.0.0\n deps: parseurl@~1.3.0\n deps: qs@1.2.1\n deps: response-time@~2.0.1\n deps: serve-index@~1.1.6\n deps: serve-static@~1.5.1\n \n \n deps: parseurl@~1.3.0\n\n\n3.16.3 / 2014-08-07\n\n\n deps: connect@2.25.3\n \n deps: multiparty@3.3.2\n \n \n\n\n3.16.2 / 2014-08-07\n\n\n deps: connect@2.25.2\n \n deps: body-parser@~1.6.2\n deps: qs@1.2.0\n \n \n\n\n3.16.1 / 2014-08-06\n\n\n deps: connect@2.25.1\n \n deps: body-parser@~1.6.1\n deps: qs@1.1.0\n \n \n\n\n3.16.0 / 2014-08-05\n\n\n deps: connect@2.25.0\n \n deps: body-parser@~1.6.0\n deps: compression@~1.0.10\n deps: csurf@~1.4.0\n deps: express-session@~1.7.4\n deps: qs@1.0.2\n deps: serve-static@~1.5.0\n \n \n deps: send@0.8.1\n \n Add extensions option\n \n \n\n\n3.15.3 / 2014-08-04\n\n\n fix res.sendfile regression for serving directory index files\n deps: connect@2.24.3\n \n deps: serve-index@~1.1.5\n deps: serve-static@~1.4.4\n \n \n deps: send@0.7.4\n \n Fix incorrect 403 on Windows and Node.js 0.11\n Fix serving index files without root dir\n \n \n\n\n3.15.2 / 2014-07-27\n\n\n deps: connect@2.24.2\n \n deps: body-parser@~1.5.2\n deps: depd@0.4.4\n deps: express-session@~1.7.2\n deps: morgan@~1.2.2\n deps: serve-static@~1.4.2\n \n \n deps: depd@0.4.4\n \n Work-around v8 generating empty stack traces\n \n \n deps: send@0.7.2\n \n deps: depd@0.4.4\n \n \n\n\n3.15.1 / 2014-07-26\n\n\n deps: connect@2.24.1\n \n deps: body-parser@~1.5.1\n deps: depd@0.4.3\n deps: express-session@~1.7.1\n deps: morgan@~1.2.1\n deps: serve-index@~1.1.4\n deps: serve-static@~1.4.1\n \n \n deps: depd@0.4.3\n \n Fix exception when global Error.stackTraceLimit is too low\n \n \n deps: send@0.7.1\n \n deps: depd@0.4.3\n \n \n\n\n3.15.0 / 2014-07-22\n\n\n Fix req.protocol for proxy-direct connections\n Pass options from res.sendfile to send\n deps: connect@2.24.0\n \n deps: body-parser@~1.5.0\n deps: compression@~1.0.9\n deps: connect-timeout@~1.2.1\n deps: debug@1.0.4\n deps: depd@0.4.2\n deps: express-session@~1.7.0\n deps: finalhandler@0.1.0\n deps: method-override@~2.1.2\n deps: morgan@~1.2.0\n deps: multiparty@3.3.1\n deps: parseurl@~1.2.0\n deps: serve-static@~1.4.0\n \n \n deps: debug@1.0.4\n deps: depd@0.4.2\n \n Add TRACE_DEPRECATION environment variable\n Remove non-standard grey color from color output\n Support --no-deprecation argument\n Support --trace-deprecation argument\n \n \n deps: parseurl@~1.2.0\n \n Cache URLs based on original value\n Remove no-longer-needed URL mis-parse work-around\n Simplify the “fast-path” RegExp\n \n \n deps: send@0.7.0\n \n Add dotfiles option\n Cap maxAge value to 1 year\n deps: debug@1.0.4\n deps: depd@0.4.2\n \n \n\n\n3.14.0 / 2014-07-11\n\n\n add explicit “Rosetta Flash JSONP abuse” protection\n \n previous versions are not vulnerable; this is just explicit protection\n \n \n deprecate res.redirect(url, status) – use res.redirect(status, url) instead\n fix res.send(status, num) to send num as json (not error)\n remove unnecessary escaping when res.jsonp returns JSON response\n deps: basic-auth@1.0.0\n \n support empty password\n support empty username\n \n \n deps: connect@2.23.0\n \n deps: debug@1.0.3\n deps: express-session@~1.6.4\n deps: method-override@~2.1.0\n deps: parseurl@~1.1.3\n deps: serve-static@~1.3.1\n \n \n deps: debug@1.0.3\n \n Add support for multiple wildcards in namespaces\n \n \n deps: methods@1.1.0\n \n add CONNECT\n \n \n deps: parseurl@~1.1.3\n \n faster parsing of href-only URLs\n \n \n\n\n3.13.0 / 2014-07-03\n\n\n add deprecation message to app.configure\n add deprecation message to req.auth\n use basic-auth to parse Authorization header\n deps: connect@2.22.0\n \n deps: csurf@~1.3.0\n deps: express-session@~1.6.1\n deps: multiparty@3.3.0\n deps: serve-static@~1.3.0\n \n \n deps: send@0.5.0\n \n Accept string for maxage (converted by ms)\n Include link in default redirect response\n \n \n\n\n3.12.1 / 2014-06-26\n\n\n deps: connect@2.21.1\n \n deps: cookie-parser@1.3.2\n deps: cookie-signature@1.0.4\n deps: express-session@~1.5.2\n deps: type-is@~1.3.2\n \n \n deps: cookie-signature@1.0.4\n \n fix for timing attacks\n \n \n\n\n3.12.0 / 2014-06-21\n\n\n use media-typer to alter content-type charset\n deps: connect@2.21.0\n \n deprecate connect(middleware) – use app.use(middleware) instead\n deprecate connect.createServer() – use connect() instead\n fix res.setHeader() patch to work with with get -> append -> set pattern\n deps: compression@~1.0.8\n deps: errorhandler@~1.1.1\n deps: express-session@~1.5.0\n deps: serve-index@~1.1.3\n \n \n\n\n3.11.0 / 2014-06-19\n\n\n deprecate things with depd module\n deps: buffer-crc32@0.2.3\n deps: connect@2.20.2\n \n deprecate verify option to json – use body-parser npm module instead\n deprecate verify option to urlencoded – use body-parser npm module instead\n deprecate things with depd module\n use finalhandler for final response handling\n use media-typer to parse content-type for charset\n deps: body-parser@1.4.3\n deps: connect-timeout@1.1.1\n deps: cookie-parser@1.3.1\n deps: csurf@1.2.2\n deps: errorhandler@1.1.0\n deps: express-session@1.4.0\n deps: multiparty@3.2.9\n deps: serve-index@1.1.2\n deps: type-is@1.3.1\n deps: vhost@2.0.0\n \n \n\n\n3.10.5 / 2014-06-11\n\n\n deps: connect@2.19.6\n \n deps: body-parser@1.3.1\n deps: compression@1.0.7\n deps: debug@1.0.2\n deps: serve-index@1.1.1\n deps: serve-static@1.2.3\n \n \n deps: debug@1.0.2\n deps: send@0.4.3\n \n Do not throw uncatchable error on file open race condition\n Use escape-html for HTML escaping\n deps: debug@1.0.2\n deps: finished@1.2.2\n deps: fresh@0.2.2\n \n \n\n\n3.10.4 / 2014-06-09\n\n\n deps: connect@2.19.5\n \n fix “event emitter leak” warnings\n deps: csurf@1.2.1\n deps: debug@1.0.1\n deps: serve-static@1.2.2\n deps: type-is@1.2.1\n \n \n deps: debug@1.0.1\n deps: send@0.4.2\n \n fix “event emitter leak” warnings\n deps: finished@1.2.1\n deps: debug@1.0.1\n \n \n\n\n3.10.3 / 2014-06-05\n\n\n use vary module for res.vary\n deps: connect@2.19.4\n \n deps: errorhandler@1.0.2\n deps: method-override@2.0.2\n deps: serve-favicon@2.0.1\n \n \n deps: debug@1.0.0\n\n\n3.10.2 / 2014-06-03\n\n\n deps: connect@2.19.3\n \n deps: compression@1.0.6\n \n \n\n\n3.10.1 / 2014-06-03\n\n\n deps: connect@2.19.2\n \n deps: compression@1.0.4\n \n \n deps: proxy-addr@1.0.1\n\n\n3.10.0 / 2014-06-02\n\n\n deps: connect@2.19.1\n \n deprecate methodOverride() – use method-override npm module instead\n deps: body-parser@1.3.0\n deps: method-override@2.0.1\n deps: multiparty@3.2.8\n deps: response-time@2.0.0\n deps: serve-static@1.2.1\n \n \n deps: methods@1.0.1\n deps: send@0.4.1\n \n Send max-age in Cache-Control in correct format\n \n \n\n\n3.9.0 / 2014-05-30\n\n\n custom etag control with app.set('etag', val)\n \n app.set('etag', function(body, encoding){ return '\"etag\"' }) custom etag generation\n app.set('etag', 'weak') weak tag\n app.set('etag', 'strong') strong etag\n app.set('etag', false) turn off\n app.set('etag', true) standard etag\n \n \n Include ETag in HEAD requests\n mark res.send ETag as weak and reduce collisions\n update connect to 2.18.0\n \n deps: compression@1.0.3\n deps: serve-index@1.1.0\n deps: serve-static@1.2.0\n \n \n update send to 0.4.0\n \n Calculate ETag with md5 for reduced collisions\n Ignore stream errors after request ends\n deps: debug@0.8.1\n \n \n\n\n3.8.1 / 2014-05-27\n\n\n update connect to 2.17.3\n \n deps: body-parser@1.2.2\n deps: express-session@1.2.1\n deps: method-override@1.0.2\n \n \n\n\n3.8.0 / 2014-05-21\n\n\n keep previous Content-Type for res.jsonp\n set proper charset in Content-Type for res.send\n update connect to 2.17.1\n \n fix res.charset appending charset when content-type has one\n deps: express-session@1.2.0\n deps: morgan@1.1.1\n deps: serve-index@1.0.3\n \n \n\n\n3.7.0 / 2014-05-18\n\n\n proper proxy trust with app.set('trust proxy', trust)\n \n app.set('trust proxy', 1) trust first hop\n app.set('trust proxy', 'loopback') trust loopback addresses\n app.set('trust proxy', '10.0.0.1') trust single IP\n app.set('trust proxy', '10.0.0.1/16') trust subnet\n app.set('trust proxy', '10.0.0.1, 10.0.0.2') trust list\n app.set('trust proxy', false) turn off\n app.set('trust proxy', true) trust everything\n \n \n update connect to 2.16.2\n \n deprecate res.headerSent – use res.headersSent\n deprecate res.on(\"header\") – use on-headers module instead\n fix edge-case in res.appendHeader that would append in wrong order\n json: use body-parser\n urlencoded: use body-parser\n dep: bytes@1.0.0\n dep: cookie-parser@1.1.0\n dep: csurf@1.2.0\n dep: express-session@1.1.0\n dep: method-override@1.0.1\n \n \n\n\n3.6.0 / 2014-05-09\n\n\n deprecate app.del() – use app.delete() instead\n deprecate res.json(obj, status) – use res.json(status, obj) instead\n \n the edge-case res.json(status, num) requires res.status(status).json(num)\n \n \n deprecate res.jsonp(obj, status) – use res.jsonp(status, obj) instead\n \n the edge-case res.jsonp(status, num) requires res.status(status).jsonp(num)\n \n \n support PURGE method\n \n add app.purge\n add router.purge\n include PURGE in app.all\n \n \n update connect to 2.15.0\n \n Add res.appendHeader\n Call error stack even when response has been sent\n Patch res.headerSent to return Boolean\n Patch res.headersSent for node.js 0.8\n Prevent default 404 handler after response sent\n dep: compression@1.0.2\n dep: connect-timeout@1.1.0\n dep: debug@^0.8.0\n dep: errorhandler@1.0.1\n dep: express-session@1.0.4\n dep: morgan@1.0.1\n dep: serve-favicon@2.0.0\n dep: serve-index@1.0.2\n \n \n update debug to 0.8.0\n \n add enable() method\n change from stderr to stdout\n \n \n update methods to 1.0.0\n \n add PURGE\n \n \n update mkdirp to 0.5.0\n\n\n3.5.3 / 2014-05-08\n\n\n fix req.host for IPv6 literals\n fix res.jsonp error if callback param is object\n\n\n3.5.2 / 2014-04-24\n\n\n update connect to 2.14.5\n update cookie to 0.1.2\n update mkdirp to 0.4.0\n update send to 0.3.0\n\n\n3.5.1 / 2014-03-25\n\n\n pin less-middleware in generated app\n\n\n3.5.0 / 2014-03-06\n\n\n bump deps\n\n\n3.4.8 / 2014-01-13\n\n\n prevent incorrect automatic OPTIONS responses #1868 @dpatti\n update binary and examples for jade 1.0 #1876 @yossi, #1877 @reqshark, #1892 @matheusazzi\n throw 400 in case of malformed paths @rlidwka\n\n\n3.4.7 / 2013-12-10\n\n\n update connect\n\n\n3.4.6 / 2013-12-01\n\n\n update connect (raw-body)\n\n\n3.4.5 / 2013-11-27\n\n\n update connect\n res.location: remove leading ./ #1802 @kapouer\n res.redirect: fix `res.redirect(‘toString’) #1829 @michaelficarra\n res.send: always send ETag when content-length > 0\n router: add Router.all() method\n\n\n3.4.4 / 2013-10-29\n\n\n update connect\n update supertest\n update methods\n express(1): replace bodyParser() with urlencoded() and json() #1795 @chirag04\n\n\n3.4.3 / 2013-10-23\n\n\n update connect\n\n\n3.4.2 / 2013-10-18\n\n\n update connect\n downgrade commander\n\n\n3.4.1 / 2013-10-15\n\n\n update connect\n update commander\n jsonp: check if callback is a function\n router: wrap encodeURIComponent in a try/catch #1735 (@lxe)\n res.format: now includes charset @1747 (@sorribas)\n res.links: allow multiple calls @1746 (@sorribas)\n\n\n3.4.0 / 2013-09-07\n\n\n add res.vary(). Closes #1682\n update connect\n\n\n3.3.8 / 2013-09-02\n\n\n update connect\n\n\n3.3.7 / 2013-08-28\n\n\n update connect\n\n\n3.3.6 / 2013-08-27\n\n\n Revert “remove charset from json responses. Closes #1631” (causes issues in some clients)\n add: req.accepts take an argument list\n\n\n3.3.4 / 2013-07-08\n\n\n update send and connect\n\n\n3.3.3 / 2013-07-04\n\n\n update connect\n\n\n3.3.2 / 2013-07-03\n\n\n update connect\n update send\n remove .version export\n\n\n3.3.1 / 2013-06-27\n\n\n update connect\n\n\n3.3.0 / 2013-06-26\n\n\n update connect\n add support for multiple X-Forwarded-Proto values. Closes #1646\n change: remove charset from json responses. Closes #1631\n change: return actual booleans from req.accept* functions\n fix jsonp callback array throw\n\n\n3.2.6 / 2013-06-02\n\n\n update connect\n\n\n3.2.5 / 2013-05-21\n\n\n update connect\n update node-cookie\n add: throw a meaningful error when there is no default engine\n change generation of ETags with res.send() to GET requests only. Closes #1619\n\n\n3.2.4 / 2013-05-09\n\n\n fix req.subdomains when no Host is present\n fix req.host when no Host is present, return undefined\n\n\n3.2.3 / 2013-05-07\n\n\n update connect / qs\n\n\n3.2.2 / 2013-05-03\n\n\n update qs\n\n\n3.2.1 / 2013-04-29\n\n\n add app.VERB() paths array deprecation warning\n update connect\n update qs and remove all ~ semver crap\n fix: accept number as value of Signed Cookie\n\n\n3.2.0 / 2013-04-15\n\n\n add “view” constructor setting to override view behaviour\n add req.acceptsEncoding(name)\n add req.acceptedEncodings\n revert cookie signature change causing session race conditions\n fix sorting of Accept values of the same quality\n\n\n3.1.2 / 2013-04-12\n\n\n add support for custom Accept parameters\n update cookie-signature\n\n\n3.1.1 / 2013-04-01\n\n\n add X-Forwarded-Host support to req.host\n fix relative redirects\n update mkdirp\n update buffer-crc32\n remove legacy app.configure() method from app template.\n\n\n3.1.0 / 2013-01-25\n\n\n add support for leading “.” in “view engine” setting\n add array support to res.set()\n add node 0.8.x to travis.yml\n add “subdomain offset” setting for tweaking req.subdomains\n add res.location(url) implementing res.redirect()-like setting of Location\n use app.get() for x-powered-by setting for inheritance\n fix colons in passwords for req.auth\n\n\n3.0.6 / 2013-01-04\n\n\n add http verb methods to Router\n update connect\n fix mangling of the res.cookie() options object\n fix jsonp whitespace escape. Closes #1132\n\n\n3.0.5 / 2012-12-19\n\n\n add throwing when a non-function is passed to a route\n fix: explicitly remove Transfer-Encoding header from 204 and 304 responses\n revert “add ‘etag’ option”\n\n\n3.0.4 / 2012-12-05\n\n\n add ‘etag’ option to disable res.send() Etags\n add escaping of urls in text/plain in res.redirect()\nfor old browsers interpreting as html\n change crc32 module for a more liberal license\n update connect\n\n\n3.0.3 / 2012-11-13\n\n\n update connect\n update cookie module\n fix cookie max-age\n\n\n3.0.2 / 2012-11-08\n\n\n add OPTIONS to cors example. Closes #1398\n fix route chaining regression. Closes #1397\n\n\n3.0.1 / 2012-11-01\n\n\n update connect\n\n\n3.0.0 / 2012-10-23\n\n\n add make clean\n add “Basic” check to req.auth\n add req.auth test coverage\n add cb && cb(payload) to res.jsonp(). Closes #1374\n add backwards compat for res.redirect() status. Closes #1336\n add support for res.json() to retain previously defined Content-Types. Closes #1349\n update connect\n change res.redirect() to utilize a pathname-relative Location again. Closes #1382\n remove non-primitive string support for res.send()\n fix view-locals example. Closes #1370\n fix route-separation example\n\n\n3.0.0rc5 / 2012-09-18\n\n\n update connect\n add redis search example\n add static-files example\n add “x-powered-by” setting (app.disable('x-powered-by'))\n add “application/octet-stream” redirect Accept test case. Closes #1317\n\n\n3.0.0rc4 / 2012-08-30\n\n\n add res.jsonp(). Closes #1307\n add “verbose errors” option to error-pages example\n add another route example to express(1) so people are not so confused\n add redis online user activity tracking example\n update connect dep\n fix etag quoting. Closes #1310\n fix error-pages 404 status\n fix jsonp callback char restrictions\n remove old OPTIONS default response\n\n\n3.0.0rc3 / 2012-08-13\n\n\n update connect dep\n fix signed cookies to work with connect.cookieParser() (“s:” prefix was missing) [tnydwrds]\n fix res.render() clobbering of “locals”\n\n\n3.0.0rc2 / 2012-08-03\n\n\n add CORS example\n update connect dep\n deprecate .createServer() & remove old stale examples\n fix: escape res.redirect() link\n fix vhost example\n\n\n3.0.0rc1 / 2012-07-24\n\n\n add more examples to view-locals\n add scheme-relative redirects (res.redirect(\"//foo.com\")) support\n update cookie dep\n update connect dep\n update send dep\n fix express(1) -h flag, use -H for hogan. Closes #1245\n fix res.sendfile() socket error handling regression\n\n\n3.0.0beta7 / 2012-07-16\n\n\n update connect dep for send() root normalization regression\n\n\n3.0.0beta6 / 2012-07-13\n\n\n add err.view property for view errors. Closes #1226\n add “jsonp callback name” setting\n add support for “/foo/:bar*” non-greedy matches\n change res.sendfile() to use send() module\n change res.send to use “response-send” module\n remove app.locals.use and res.locals.use, use regular middleware\n\n\n3.0.0beta5 / 2012-07-03\n\n\n add “make check” support\n add route-map example\n add res.json(obj, status) support back for BC\n add “methods” dep, remove internal methods module\n update connect dep\n update auth example to utilize cores pbkdf2\n updated tests to use “supertest”\n\n\n3.0.0beta4 / 2012-06-25\n\n\n Added req.auth\n Added req.range(size)\n Added res.links(obj)\n Added res.send(body, status) support back for backwards compat\n Added .default() support to res.format()\n Added 2xx / 304 check to req.fresh\n Revert “Added + support to the router”\n Fixed res.send() freshness check, respect res.statusCode\n\n\n3.0.0beta3 / 2012-06-15\n\n\n Added hogan --hjs to express(1) [nullfirm]\n Added another example to content-negotiation\n Added fresh dep\n Changed: res.send() always checks freshness\n Fixed: expose connects mime module. Closes #1165\n\n\n3.0.0beta2 / 2012-06-06\n\n\n Added + support to the router\n Added req.host\n Changed req.param() to check route first\n Update connect dep\n\n\n3.0.0beta1 / 2012-06-01\n\n\n Added res.format() callback to override default 406 behaviour\n Fixed res.redirect() 406. Closes #1154\n\n\n3.0.0alpha5 / 2012-05-30\n\n\n Added req.ip\n Added { signed: true } option to res.cookie()\n Removed res.signedCookie()\n Changed: dont reverse req.ips\n Fixed “trust proxy” setting check for req.ips\n\n\n3.0.0alpha4 / 2012-05-09\n\n\n Added: allow [] in jsonp callback. Closes #1128\n Added PORT env var support in generated template. Closes #1118 [benatkin]\n Updated: connect 2.2.2\n\n\n3.0.0alpha3 / 2012-05-04\n\n\n Added public app.routes. Closes #887\n Added view-locals example\n Added mvc example\n Added res.locals.use(). Closes #1120\n Added conditional-GET support to res.send()\n Added: coerce res.set() values to strings\n Changed: moved static() in generated apps below router\n Changed: res.send() only set ETag when not previously set\n Changed connect 2.2.1 dep\n Changed: make test now runs unit / acceptance tests\n Fixed req/res proto inheritance\n\n\n3.0.0alpha2 / 2012-04-26\n\n\n Added make benchmark back\n Added res.send() support for String objects\n Added client-side data exposing example\n Added res.header() and req.header() aliases for BC\n Added express.createServer() for BC\n Perf: memoize parsed urls\n Perf: connect 2.2.0 dep\n Changed: make expressInit() middleware self-aware\n Fixed: use app.get() for all core settings\n Fixed redis session example\n Fixed session example. Closes #1105\n Fixed generated express dep. Closes #1078\n\n\n3.0.0alpha1 / 2012-04-15\n\n\n Added app.locals.use(callback)\n Added app.locals object\n Added app.locals(obj)\n Added res.locals object\n Added res.locals(obj)\n Added res.format() for content-negotiation\n Added app.engine()\n Added res.cookie() JSON cookie support\n Added “trust proxy” setting\n Added req.subdomains\n Added req.protocol\n Added req.secure\n Added req.path\n Added req.ips\n Added req.fresh\n Added req.stale\n Added comma-delimited / array support for req.accepts()\n Added debug instrumentation\n Added res.set(obj)\n Added res.set(field, value)\n Added res.get(field)\n Added app.get(setting). Closes #842\n Added req.acceptsLanguage()\n Added req.acceptsCharset()\n Added req.accepted\n Added req.acceptedLanguages\n Added req.acceptedCharsets\n Added “json replacer” setting\n Added “json spaces” setting\n Added X-Forwarded-Proto support to res.redirect(). Closes #92\n Added --less support to express(1)\n Added express.response prototype\n Added express.request prototype\n Added express.application prototype\n Added app.path()\n Added app.render()\n Added res.type() to replace res.contentType()\n Changed: res.redirect() to add relative support\n Changed: enable “jsonp callback” by default\n Changed: renamed “case sensitive routes” to “case sensitive routing”\n Rewrite of all tests with mocha\n Removed “root” setting\n Removed res.redirect('home') support\n Removed req.notify()\n Removed app.register()\n Removed app.redirect()\n Removed app.is()\n Removed app.helpers()\n Removed app.dynamicHelpers()\n Fixed res.sendfile() with non-GET. Closes #723\n Fixed express(1) public dir for windows. Closes #866\n\n\n2.5.9/ 2012-04-02\n\n\n Added support for PURGE request method [pbuyle]\n Fixed express(1) generated app app.address() before listening [mmalecki]\n\n\n2.5.8 / 2012-02-08\n\n\n Update mkdirp dep. Closes #991\n\n\n2.5.7 / 2012-02-06\n\n\n Fixed app.all duplicate DELETE requests [mscdex]\n\n\n2.5.6 / 2012-01-13\n\n\n Updated hamljs dev dep. Closes #953\n\n\n2.5.5 / 2012-01-08\n\n\n Fixed: set filename on cached templates [matthewleon]\n\n\n2.5.4 / 2012-01-02\n\n\n Fixed express(1) eol on 0.4.x. Closes #947\n\n\n2.5.3 / 2011-12-30\n\n\n Fixed req.is() when a charset is present\n\n\n2.5.2 / 2011-12-10\n\n\n Fixed: express(1) LF -> CRLF for windows\n\n\n2.5.1 / 2011-11-17\n\n\n Changed: updated connect to 1.8.x\n Removed sass.js support from express(1)\n\n\n2.5.0 / 2011-10-24\n\n\n Added ./routes dir for generated app by default\n Added npm install reminder to express(1) app gen\n Added 0.5.x support\n Removed make test-cov since it wont work with node 0.5.x\n Fixed express(1) public dir for windows. Closes #866\n\n\n2.4.7 / 2011-10-05\n\n\n Added mkdirp to express(1). Closes #795\n Added simple json-config example\n Added shorthand for the parsed request’s pathname via req.path\n Changed connect dep to 1.7.x to fix npm issue…\n Fixed res.redirect() HEAD support. [reported by xerox]\n Fixed req.flash(), only escape args\n Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie]\n\n\n2.4.6 / 2011-08-22\n\n\n Fixed multiple param callback regression. Closes #824 [reported by TroyGoode]\n\n\n2.4.5 / 2011-08-19\n\n\n Added support for routes to handle errors. Closes #809\n Added app.routes.all(). Closes #803\n Added “basepath” setting to work in conjunction with reverse proxies etc.\n Refactored Route to use a single array of callbacks\n Added support for multiple callbacks for app.param(). Closes #801\nCloses #805\n Changed: removed .call(self) for route callbacks\n Dependency: qs >= 0.3.1\n Fixed res.redirect() on windows due to join() usage. Closes #808\n\n\n2.4.4 / 2011-08-05\n\n\n Fixed res.header() intention of a set, even when undefined\n Fixed *, value no longer required\n Fixed res.send(204) support. Closes #771\n\n\n2.4.3 / 2011-07-14\n\n\n Added docs for status option special-case. Closes #739\n Fixed options.filename, exposing the view path to template engines\n\n\n2.4.2. / 2011-07-06\n\n\n Revert “removed jsonp stripping” for XSS\n\n\n2.4.1 / 2011-07-06\n\n\n Added res.json() JSONP support. Closes #737\n Added extending-templates example. Closes #730\n Added “strict routing” setting for trailing slashes\n Added support for multiple envs in app.configure() calls. Closes #735\n Changed: res.send() using res.json()\n Changed: when cookie path === null don’t default it\n Changed; default cookie path to “home” setting. Closes #731\n Removed pids/logs creation from express(1)\n\n\n2.4.0 / 2011-06-28\n\n\n Added chainable res.status(code)\n Added res.json(), an explicit version of res.send(obj)\n Added simple web-service example\n\n\n2.3.12 / 2011-06-22\n\n\n #express is now on freenode! come join!\n Added req.get(field, param)\n Added links to Japanese documentation, thanks @hideyukisaito!\n Added; the express(1) generated app outputs the env\n Added content-negotiation example\n Dependency: connect >= 1.5.1 < 2.0.0\n Fixed view layout bug. Closes #720\n Fixed; ignore body on 304. Closes #701\n\n\n2.3.11 / 2011-06-04\n\n\n Added npm test\n Removed generation of dummy test file from express(1)\n Fixed; express(1) adds express as a dep\n Fixed; prune on prepublish\n\n\n2.3.10 / 2011-05-27\n\n\n Added req.route, exposing the current route\n Added package.json generation support to express(1)\n Fixed call to app.param() function for optional params. Closes #682\n\n\n2.3.9 / 2011-05-25\n\n\n Fixed bug-ish with ../' in res.partial()` calls\n\n\n2.3.8 / 2011-05-24\n\n\n Fixed app.options()\n\n\n2.3.7 / 2011-05-23\n\n\n Added route Collection, ex: app.get('/user/:id').remove();\n Added support for app.param(fn) to define param logic\n Removed app.param() support for callback with return value\n Removed module.parent check from express(1) generated app. Closes #670\n Refactored router. Closes #639\n\n\n2.3.6 / 2011-05-20\n\n\n Changed; using devDependencies instead of git submodules\n Fixed redis session example\n Fixed markdown example\n Fixed view caching, should not be enabled in development\n\n\n2.3.5 / 2011-05-20\n\n\n Added export .view as alias for .View\n\n\n2.3.4 / 2011-05-08\n\n\n Added ./examples/say\n Fixed res.sendfile() bug preventing the transfer of files with spaces\n\n\n2.3.3 / 2011-05-03\n\n\n Added “case sensitive routes” option.\n Changed; split methods supported per rfc [slaskis]\n Fixed route-specific middleware when using the same callback function several times\n\n\n2.3.2 / 2011-04-27\n\n\n Fixed view hints\n\n\n2.3.1 / 2011-04-26\n\n\n Added app.match() as app.match.all()\n Added app.lookup() as app.lookup.all()\n Added app.remove() for app.remove.all()\n Added app.remove.VERB()\n Fixed template caching collision issue. Closes #644\n Moved router over from connect and started refactor\n\n\n2.3.0 / 2011-04-25\n\n\n Added options support to res.clearCookie()\n Added res.helpers() as alias of res.locals()\n Added; json defaults to UTF-8 with res.send(). Closes #632. [Daniel * Dependency connect >= 1.4.0\n Changed; auto set Content-Type in res.attachement [Aaron Heckmann]\n Renamed “cache views” to “view cache”. Closes #628\n Fixed caching of views when using several apps. Closes #637\n Fixed gotcha invoking app.param() callbacks once per route middleware.\nCloses #638\n Fixed partial lookup precedence. Closes #631\nShaw]\n\n\n2.2.2 / 2011-04-12\n\n\n Added second callback support for res.download() connection errors\n Fixed filename option passing to template engine\n\n\n2.2.1 / 2011-04-04\n\n\n Added layout(path) helper to change the layout within a view. Closes #610\n \n Fixed partial() collection object support.\nPreviously only anything with .length would work.\nWhen .length is present one must still be aware of holes,\nhowever now { collection: {foo: 'bar'}} is valid, exposes\nkeyInCollection and keysInCollection.\n \n Performance improved with better view caching\n Removed request and response locals\n Changed; errorHandler page title is now Express instead of Connect\n\n\n2.2.0 / 2011-03-30\n\n\n Added app.lookup.VERB(), ex app.lookup.put('/user/:id'). Closes #606\n Added app.match.VERB(), ex app.match.put('/user/12'). Closes #606\n Added app.VERB(path) as alias of app.lookup.VERB().\n Dependency connect >= 1.2.0\n\n\n2.1.1 / 2011-03-29\n\n\n Added; expose err.view object when failing to locate a view\n Fixed res.partial() call next(err) when no callback is given [reported by aheckmann]\n Fixed; res.send(undefined) responds with 204 [aheckmann]\n\n\n2.1.0 / 2011-03-24\n\n\n Added <root>/_?<name> partial lookup support. Closes #447\n Added request, response, and app local variables\n Added settings local variable, containing the app’s settings\n Added req.flash() exception if req.session is not available\n Added res.send(bool) support (json response)\n Fixed stylus example for latest version\n Fixed; wrap try/catch around res.render()\n\n\n2.0.0 / 2011-03-17\n\n\n Fixed up index view path alternative.\n Changed; res.locals() without object returns the locals\n\n\n2.0.0rc3 / 2011-03-17\n\n\n Added res.locals(obj) to compliment res.local(key, val)\n Added res.partial() callback support\n Fixed recursive error reporting issue in res.render()\n\n\n2.0.0rc2 / 2011-03-17\n\n\n Changed; partial() “locals” are now optional\n Fixed SlowBuffer support. Closes #584 [reported by tyrda01]\n Fixed .filename view engine option [reported by drudge]\n Fixed blog example\n Fixed {req,res}.app reference when mounting [Ben Weaver]\n\n\n2.0.0rc / 2011-03-14\n\n\n Fixed; expose HTTPSServer constructor\n Fixed express(1) default test charset. Closes #579 [reported by secoif]\n Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP]\n\n\n2.0.0beta3 / 2011-03-09\n\n\n Added support for res.contentType() literal\nThe original res.contentType('.json'),\nres.contentType('application/json'), and res.contentType('json')\nwill work now.\n Added res.render() status option support back\n Added charset option for res.render()\n Added .charset support (via connect 1.0.4)\n Added view resolution hints when in development and a lookup fails\n Added layout lookup support relative to the page view.\nFor example while rendering ./views/user/index.jade if you create\n./views/user/layout.jade it will be used in favour of the root layout.\n Fixed res.redirect(). RFC states absolute url [reported by unlink]\n Fixed; default res.send() string charset to utf8\n Removed Partial constructor (not currently used)\n\n\n2.0.0beta2 / 2011-03-07\n\n\n Added res.render() .locals support back to aid in migration process\n Fixed flash example\n\n\n2.0.0beta / 2011-03-03\n\n\n Added HTTPS support\n Added res.cookie() maxAge support\n Added req.header() Referrer / Referer special-case, either works\n Added mount support for res.redirect(), now respects the mount-point\n Added union() util, taking place of merge(clone()) combo\n Added stylus support to express(1) generated app\n Added secret to session middleware used in examples and generated app\n Added res.local(name, val) for progressive view locals\n Added default param support to req.param(name, default)\n Added app.disabled() and app.enabled()\n Added app.register() support for omitting leading “.”, either works\n Added res.partial(), using the same interface as partial() within a view. Closes #539\n Added app.param() to map route params to async/sync logic\n Added; aliased app.helpers() as app.locals(). Closes #481\n Added extname with no leading “.” support to res.contentType()\n Added cache views setting, defaulting to enabled in “production” env\n Added index file partial resolution, eg: partial(‘user’) may try views/user/index.jade.\n Added req.accepts() support for extensions\n Changed; res.download() and res.sendfile() now utilize Connect’s\nstatic file server connect.static.send().\n Changed; replaced connect.utils.mime() with npm mime module\n Changed; allow req.query to be pre-defined (via middleware or other parent\n Changed view partial resolution, now relative to parent view\n Changed view engine signature. no longer engine.render(str, options, callback), now engine.compile(str, options) -> Function, the returned function accepts fn(locals).\n Fixed req.param() bug returning Array.prototype methods. Closes #552\n Fixed; using Stream#pipe() instead of sys.pump() in res.sendfile()\n Fixed; using qs module instead of querystring\n Fixed; strip unsafe chars from jsonp callbacks\n Removed “stream threshold” setting\n\n\n1.0.8 / 2011-03-01\n\n\n Allow req.query to be pre-defined (via middleware or other parent app)\n “connect”: “>= 0.5.0 < 1.0.0”. Closes #547\n Removed the long deprecated EXPRESS_ENV support\n\n\n1.0.7 / 2011-02-07\n\n\n Fixed render() setting inheritance.\nMounted apps would not inherit “view engine”\n\n\n1.0.6 / 2011-02-07\n\n\n Fixed view engine setting bug when period is in dirname\n\n\n1.0.5 / 2011-02-05\n\n\n Added secret to generated app session() call\n\n\n1.0.4 / 2011-02-05\n\n\n Added qs dependency to package.json\n Fixed namespaced require()s for latest connect support\n\n\n1.0.3 / 2011-01-13\n\n\n Remove unsafe characters from JSONP callback names [Ryan Grove]\n\n\n1.0.2 / 2011-01-10\n\n\n Removed nested require, using connect.router\n\n\n1.0.1 / 2010-12-29\n\n\n Fixed for middleware stacked via createServer()\npreviously the foo middleware passed to createServer(foo)\nwould not have access to Express methods such as res.send()\nor props like req.query etc.\n\n\n1.0.0 / 2010-11-16\n\n\n Added; deduce partial object names from the last segment.\nFor example by default partial('forum/post', postObject) will\ngive you the post object, providing a meaningful default.\n Added http status code string representation to res.redirect() body\n Added; res.redirect() supporting text/plain and text/html via Accept.\n Added req.is() to aid in content negotiation\n Added partial local inheritance [suggested by masylum]. Closes #102\nproviding access to parent template locals.\n Added -s, –session[s] flag to express(1) to add session related middleware\n Added –template flag to express(1) to specify the\ntemplate engine to use.\n Added –css flag to express(1) to specify the\nstylesheet engine to use (or just plain css by default).\n Added app.all() support [thanks aheckmann]\n Added partial direct object support.\nYou may now partial('user', user) providing the “user” local,\nvs previously partial('user', { object: user }).\n Added route-separation example since many people question ways\nto do this with CommonJS modules. Also view the blog example for\nan alternative.\n Performance; caching view path derived partial object names\n Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454\n Fixed jsonp support; text/javascript as per mailinglist discussion\n\n\n1.0.0rc4 / 2010-10-14\n\n\n Added NODE_ENV support, EXPRESS_ENV is deprecated and will be removed in 1.0.0\n Added route-middleware support (very helpful, see the docs)\n Added jsonp callback setting to enable/disable jsonp autowrapping [Dav Glass]\n Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass]\n Added partial() support for array-like collections. Closes #434\n Added support for swappable querystring parsers\n Added session usage docs. Closes #443\n Added dynamic helper caching. Closes #439 [suggested by maritz]\n Added authentication example\n Added basic Range support to res.sendfile() (and res.download() etc)\n Changed; express(1) generated app using 2 spaces instead of 4\n Default env to “development” again [aheckmann]\n Removed context option is no more, use “scope”\n Fixed; exposing ./support libs to examples so they can run without installs\n Fixed mvc example\n\n\n1.0.0rc3 / 2010-09-20\n\n\n Added confirmation for express(1) app generation. Closes #391\n Added extending of flash formatters via app.flashFormatters\n Added flash formatter support. Closes #411\n Added streaming support to res.sendfile() using sys.pump() when >= “stream threshold”\n Added stream threshold setting for res.sendfile()\n Added res.send() HEAD support\n Added res.clearCookie()\n Added res.cookie()\n Added res.render() headers option\n Added res.redirect() response bodies\n Added res.render() status option support. Closes #425 [thanks aheckmann]\n Fixed res.sendfile() responding with 403 on malicious path\n Fixed res.download() bug; when an error occurs remove Content-Disposition\n Fixed; mounted apps settings now inherit from parent app [aheckmann]\n Fixed; stripping Content-Length / Content-Type when 204\n Fixed res.send() 204. Closes #419\n Fixed multiple Set-Cookie headers via res.header(). Closes #402\n Fixed bug messing with error handlers when listenFD() is called instead of listen(). [thanks guillermo]\n\n\n1.0.0rc2 / 2010-08-17\n\n\n Added app.register() for template engine mapping. Closes #390\n Added res.render() callback support as second argument (no options)\n Added callback support to res.download()\n Added callback support for res.sendfile()\n Added support for middleware access via express.middlewareName() vs connect.middlewareName()\n Added “partials” setting to docs\n Added default expresso tests to express(1) generated app. Closes #384\n Fixed res.sendfile() error handling, defer via next()\n Fixed res.render() callback when a layout is used [thanks guillermo]\n Fixed; make install creating ~/.node_libraries when not present\n Fixed issue preventing error handlers from being defined anywhere. Closes #387\n\n\n1.0.0rc / 2010-07-28\n\n\n Added mounted hook. Closes #369\n \n Added connect dependency to package.json\n \n \n Removed “reload views” setting and support code\ndevelopment env never caches, production always caches.\n \n \n Removed param in route callbacks, signature is now\nsimply (req, res, next), previously (req, res, params, next).\nUse req.params for path captures, req.query for GET params.\n \n Fixed “home” setting\n Fixed middleware/router precedence issue. Closes #366\n Fixed; configure() callbacks called immediately. Closes #368\n\n\n1.0.0beta2 / 2010-07-23\n\n\n Added more examples\n Added; exporting Server constructor\n Added Server#helpers() for view locals\n Added Server#dynamicHelpers() for dynamic view locals. Closes #349\n Added support for absolute view paths\n Added; home setting defaults to Server#route for mounted apps. Closes #363\n Added Guillermo Rauch to the contributor list\n Added support for “as” for non-collection partials. Closes #341\n Fixed install.sh, ensuring ~/.node_libraries exists. Closes #362 [thanks jf]\n Fixed res.render() exceptions, now passed to next() when no callback is given [thanks guillermo]\n Fixed instanceof Array checks, now Array.isArray()\n Fixed express(1) expansion of public dirs. Closes #348\n Fixed middleware precedence. Closes #345\n Fixed view watcher, now async [thanks aheckmann]\n\n\n1.0.0beta / 2010-07-15\n\n\n Re-write\n \n much faster\n much lighter\n Check ExpressJS.com for migration guide and updated docs\n \n \n\n\n0.14.0 / 2010-06-15\n\n\n Utilize relative requires\n Added Static bufferSize option [aheckmann]\n Fixed caching of view and partial subdirectories [aheckmann]\n Fixed mime.type() comments now that “.ext” is not supported\n Updated haml submodule\n Updated class submodule\n Removed bin/express\n\n\n0.13.0 / 2010-06-01\n\n\n Added node v0.1.97 compatibility\n Added support for deleting cookies via Request#cookie(‘key’, null)\n Updated haml submodule\n Fixed not-found page, now using using charset utf-8\n Fixed show-exceptions page, now using using charset utf-8\n Fixed view support due to fs.readFile Buffers\n Changed; mime.type() no longer accepts “.type” due to node extname() changes\n\n\n0.12.0 / 2010-05-22\n\n\n Added node v0.1.96 compatibility\n Added view helpers export which act as additional local variables\n Updated haml submodule\n Changed ETag; removed inode, modified time only\n Fixed LF to CRLF for setting multiple cookies\n Fixed cookie compilation; values are now urlencoded\n Fixed cookies parsing; accepts quoted values and url escaped cookies\n\n\n0.11.0 / 2010-05-06\n\n\n Added support for layouts using different engines\n \n this.render(‘page.html.haml’, { layout: ‘super-cool-layout.html.ejs’ })\n this.render(‘page.html.haml’, { layout: ‘foo’ }) // assumes ‘foo.html.haml’\n this.render(‘page.html.haml’, { layout: false }) // no layout\n \n \n Updated ext submodule\n Updated haml submodule\n Fixed EJS partial support by passing along the context. Issue #307\n\n\n0.10.1 / 2010-05-03\n\n\n Fixed binary uploads.\n\n\n0.10.0 / 2010-04-30\n\n\n Added charset support via Request#charset (automatically assigned to ‘UTF-8’ when respond()’s\nencoding is set to ‘utf8’ or ‘utf-8’.\n Added “encoding” option to Request#render(). Closes #299\n Added “dump exceptions” setting, which is enabled by default.\n Added simple ejs template engine support\n Added error response support for text/plain, application/json. Closes #297\n Added callback function param to Request#error()\n Added Request#sendHead()\n Added Request#stream()\n Added support for Request#respond(304, null) for empty response bodies\n Added ETag support to Request#sendfile()\n Added options to Request#sendfile(), passed to fs.createReadStream()\n Added filename arg to Request#download()\n Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request\n Performance enhanced by preventing several calls to toLowerCase() in Router#match()\n Changed; Request#sendfile() now streams\n Changed; Renamed Request#halt() to Request#respond(). Closes #289\n Changed; Using sys.inspect() instead of JSON.encode() for error output\n Changed; run() returns the http.Server instance. Closes #298\n Changed; Defaulting Server#host to null (INADDR_ANY)\n Changed; Logger “common” format scale of 0.4f\n Removed Logger “request” format\n Fixed; Catching ENOENT in view caching, preventing error when “views/partials” is not found\n Fixed several issues with http client\n Fixed Logger Content-Length output\n Fixed bug preventing Opera from retaining the generated session id. Closes #292\n\n\n0.9.0 / 2010-04-14\n\n\n Added DSL level error() route support\n Added DSL level notFound() route support\n Added Request#error()\n Added Request#notFound()\n Added Request#render() callback function. Closes #258\n Added “max upload size” setting\n Added “magic” variables to collection partials (__index__, __length__, __isFirst__, __isLast__). Closes #254\n Added haml.js submodule; removed haml-js\n Added callback function support to Request#halt() as 3rd/4th arg\n Added preprocessing of route param wildcards using param(). Closes #251\n Added view partial support (with collections etc)\n Fixed bug preventing falsey params (such as ?page=0). Closes #286\n Fixed setting of multiple cookies. Closes #199\n Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml)\n Changed; session cookie is now httpOnly\n Changed; Request is no longer global\n Changed; Event is no longer global\n Changed; “sys” module is no longer global\n Changed; moved Request#download to Static plugin where it belongs\n Changed; Request instance created before body parsing. Closes #262\n Changed; Pre-caching views in memory when “cache view contents” is enabled. Closes #253\n Changed; Pre-caching view partials in memory when “cache view partials” is enabled\n Updated support to node –version 0.1.90\n Updated dependencies\n Removed set(“session cookie”) in favour of use(Session, { cookie: { … }})\n Removed utils.mixin(); use Object#mergeDeep()\n\n\n0.8.0 / 2010-03-19\n\n\n Added coffeescript example app. Closes #242\n Changed; cache api now async friendly. Closes #240\n Removed deprecated ‘express/static’ support. Use ‘express/plugins/static’\n\n\n0.7.6 / 2010-03-19\n\n\n Added Request#isXHR. Closes #229\n Added make install (for the executable)\n Added express executable for setting up simple app templates\n Added “GET /public/*” to Static plugin, defaulting to /public\n Added Static plugin\n Fixed; Request#render() only calls cache.get() once\n Fixed; Namespacing View caches with “view:”\n Fixed; Namespacing Static caches with “static:”\n Fixed; Both example apps now use the Static plugin\n Fixed set(“views”). Closes #239\n Fixed missing space for combined log format\n Deprecated Request#sendfile() and ‘express/static’\n Removed Server#running\n\n\n0.7.5 / 2010-03-16\n\n\n Added Request#flash() support without args, now returns all flashes\n Updated ext submodule\n\n\n0.7.4 / 2010-03-16\n\n\n Fixed session reaper\n Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft)\n\n\n0.7.3 / 2010-03-16\n\n\n Added package.json\n Fixed requiring of haml / sass due to kiwi removal\n\n\n0.7.2 / 2010-03-16\n\n\n Fixed GIT submodules (HAH!)\n\n\n0.7.1 / 2010-03-16\n\n\n Changed; Express now using submodules again until a PM is adopted\n Changed; chat example using millisecond conversions from ext\n\n\n0.7.0 / 2010-03-15\n\n\n Added Request#pass() support (finds the next matching route, or the given path)\n Added Logger plugin (default “common” format replaces CommonLogger)\n Removed Profiler plugin\n Removed CommonLogger plugin\n\n\n0.6.0 / 2010-03-11\n\n\n Added seed.yml for kiwi package management support\n \n Added HTTP client query string support when method is GET. Closes #205\n \n \n Added support for arbitrary view engines.\nFor example “foo.engine.html” will now require(‘engine’),\nthe exports from this module are cached after the first require().\n \n \n Added async plugin support\n \n \n Removed usage of RESTful route funcs as http client\nget() etc, use http.get() and friends\n \n Removed custom exceptions\n\n\n0.5.0 / 2010-03-10\n\n\n Added ext dependency (library of js extensions)\n Removed extname() / basename() utils. Use path module\n Removed toArray() util. Use arguments.values\n Removed escapeRegexp() util. Use RegExp.escape()\n Removed process.mixin() dependency. Use utils.mixin()\n Removed Collection\n Removed ElementCollection\n Shameless self promotion of ebook “Advanced JavaScript” (http://dev-mag.com) ;)\n\n\n0.4.0 / 2010-02-11\n\n\n Added flash() example to sample upload app\n Added high level restful http client module (express/http)\n Changed; RESTful route functions double as HTTP clients. Closes #69\n Changed; throwing error when routes are added at runtime\n Changed; defaulting render() context to the current Request. Closes #197\n Updated haml submodule\n\n\n0.3.0 / 2010-02-11\n\n\n Updated haml / sass submodules. Closes #200\n Added flash message support. Closes #64\n Added accepts() now allows multiple args. fixes #117\n Added support for plugins to halt. Closes #189\n Added alternate layout support. Closes #119\n Removed Route#run(). Closes #188\n Fixed broken specs due to use(Cookie) missing\n\n\n0.2.1 / 2010-02-05\n\n\n Added “plot” format option for Profiler (for gnuplot processing)\n Added request number to Profiler plugin\n Fixed binary encoding for multipart file uploads, was previously defaulting to UTF8\n Fixed issue with routes not firing when not files are present. Closes #184\n Fixed process.Promise -> events.Promise\n\n\n0.2.0 / 2010-02-03\n\n\n Added parseParam() support for name[] etc. (allows for file inputs with “multiple” attr) Closes #180\n Added Both Cache and Session option “reapInterval” may be “reapEvery”. Closes #174\n Added expiration support to cache api with reaper. Closes #133\n Added cache Store.Memory#reap()\n Added Cache; cache api now uses first class Cache instances\n Added abstract session Store. Closes #172\n Changed; cache Memory.Store#get() utilizing Collection\n Renamed MemoryStore -> Store.Memory\n Fixed use() of the same plugin several time will always use latest options. Closes #176\n\n\n0.1.0 / 2010-02-03\n\n\n Changed; Hooks (before / after) pass request as arg as well as evaluated in their context\n Updated node support to 0.1.27 Closes #169\n Updated dirname(__filename) -> __dirname\n Updated libxmljs support to v0.2.0\n Added session support with memory store / reaping\n Added quick uid() helper\n Added multi-part upload support\n Added Sass.js support / submodule\n Added production env caching view contents and static files\n Added static file caching. Closes #136\n Added cache plugin with memory stores\n Added support to StaticFile so that it works with non-textual files.\n Removed dirname() helper\n Removed several globals (now their modules must be required)\n\n\n0.0.2 / 2010-01-10\n\n\n Added view benchmarks; currently haml vs ejs\n Added Request#attachment() specs. Closes #116\n Added use of node’s parseQuery() util. Closes #123\n Added make init for submodules\n Updated Haml\n Updated sample chat app to show messages on load\n Updated libxmljs parseString -> parseHtmlString\n Fixed make init to work with older versions of git\n Fixed specs can now run independent specs for those who can’t build deps. Closes #127\n Fixed issues introduced by the node url module changes. Closes 126.\n Fixed two assertions failing due to Collection#keys() returning strings\n Fixed faulty Collection#toArray() spec due to keys() returning strings\n Fixed make test now builds libxmljs.node before testing\n\n\n0.0.1 / 2010-01-03\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/express/History.html" }, { "title": "1.1.2 / 2019-05-09", "excerpt": "\n", "content": "1.1.2 / 2019-05-09\n\n\n Set stricter Content-Security-Policy header\n deps: parseurl@~1.3.3\n deps: statuses@~1.5.0\n\n\n1.1.1 / 2018-03-06\n\n\n Fix 404 output for bad / missing pathnames\n deps: encodeurl@~1.0.2\n \n Fix encoding % as last character\n \n \n deps: statuses@~1.4.0\n\n\n1.1.0 / 2017-09-24\n\n\n Use res.headersSent when available\n\n\n1.0.6 / 2017-09-22\n\n\n deps: debug@2.6.9\n\n\n1.0.5 / 2017-09-15\n\n\n deps: parseurl@~1.3.2\n \n perf: reduce overhead for full URLs\n perf: unroll the “fast-path” RegExp\n \n \n\n\n1.0.4 / 2017-08-03\n\n\n deps: debug@2.6.8\n\n\n1.0.3 / 2017-05-16\n\n\n deps: debug@2.6.7\n \n deps: ms@2.0.0\n \n \n\n\n1.0.2 / 2017-04-22\n\n\n deps: debug@2.6.4\n \n deps: ms@0.7.3\n \n \n\n\n1.0.1 / 2017-03-21\n\n\n Fix missing </html> in HTML document\n deps: debug@2.6.3\n \n Fix: DEBUG_MAX_ARRAY_LENGTH\n \n \n\n\n1.0.0 / 2017-02-15\n\n\n Fix exception when err cannot be converted to a string\n Fully URL-encode the pathname in the 404 message\n Only include the pathname in the 404 message\n Send complete HTML document\n Set Content-Security-Policy: default-src 'self' header\n deps: debug@2.6.1\n \n Allow colors in workers\n Deprecated DEBUG_FD environment variable set to 3 or higher\n Fix error when running under React Native\n Use same color for same namespace\n deps: ms@0.7.2\n \n \n\n\n0.5.1 / 2016-11-12\n\n\n Fix exception when err.headers is not an object\n deps: statuses@~1.3.1\n perf: hoist regular expressions\n perf: remove duplicate validation path\n\n\n0.5.0 / 2016-06-15\n\n\n Change invalid or non-numeric status code to 500\n Overwrite status message to match set status code\n Prefer err.statusCode if err.status is invalid\n Set response headers from err.headers object\n Use statuses instead of http module for status messages\n \n Includes all defined status messages\n \n \n\n\n0.4.1 / 2015-12-02\n\n\n deps: escape-html@~1.0.3\n \n perf: enable strict mode\n perf: optimize string replacement\n perf: use faster string coercion\n \n \n\n\n0.4.0 / 2015-06-14\n\n\n Fix a false-positive when unpiping in Node.js 0.8\n Support statusCode property on Error objects\n Use unpipe module for unpiping requests\n deps: escape-html@1.0.2\n deps: on-finished@~2.3.0\n \n Add defined behavior for HTTP CONNECT requests\n Add defined behavior for HTTP Upgrade requests\n deps: ee-first@1.1.1\n \n \n perf: enable strict mode\n perf: remove argument reassignment\n\n\n0.3.6 / 2015-05-11\n\n\n deps: debug@~2.2.0\n \n deps: ms@0.7.1\n \n \n\n\n0.3.5 / 2015-04-22\n\n\n deps: on-finished@~2.2.1\n \n Fix isFinished(req) when data buffered\n \n \n\n\n0.3.4 / 2015-03-15\n\n\n deps: debug@~2.1.3\n \n Fix high intensity foreground color for bold\n deps: ms@0.7.0\n \n \n\n\n0.3.3 / 2015-01-01\n\n\n deps: debug@~2.1.1\n deps: on-finished@~2.2.0\n\n\n0.3.2 / 2014-10-22\n\n\n deps: on-finished@~2.1.1\n \n Fix handling of pipelined requests\n \n \n\n\n0.3.1 / 2014-10-16\n\n\n deps: debug@~2.1.0\n \n Implement DEBUG_FD env variable support\n \n \n\n\n0.3.0 / 2014-09-17\n\n\n Terminate in progress response only on error\n Use on-finished to determine request status\n\n\n0.2.0 / 2014-09-03\n\n\n Set X-Content-Type-Options: nosniff header\n deps: debug@~2.0.0\n\n\n0.1.0 / 2014-07-16\n\n\n Respond after request fully read\n \n prevents hung responses and socket hang ups\n \n \n deps: debug@1.0.4\n\n\n0.0.3 / 2014-07-11\n\n\n deps: debug@1.0.3\n \n Add support for multiple wildcards in namespaces\n \n \n\n\n0.0.2 / 2014-06-19\n\n\n Handle invalid status codes\n\n\n0.0.1 / 2014-06-05\n\n\n deps: debug@1.0.2\n\n\n0.0.0 / 2014-06-05\n\n\n Extracted from connect/express\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/finalhandler/HISTORY.html" }, { "title": "0.1.2 / 2017-09-14", "excerpt": "\n", "content": "0.1.2 / 2017-09-14\n\n\n perf: improve header parsing\n perf: reduce overhead when no X-Forwarded-For header\n\n\n0.1.1 / 2017-09-10\n\n\n Fix trimming leading / trailing OWS\n perf: hoist regular expression\n\n\n0.1.0 / 2014-09-21\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/forwarded/HISTORY.html" }, { "title": "0.5.2 / 2017-09-13", "excerpt": "\n", "content": "0.5.2 / 2017-09-13\n\n\n Fix regression matching multiple ETags in If-None-Match\n perf: improve If-None-Match token parsing\n\n\n0.5.1 / 2017-09-11\n\n\n Fix handling of modified headers with invalid dates\n perf: improve ETag match loop\n\n\n0.5.0 / 2017-02-21\n\n\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n perf: delay reading header values until needed\n perf: skip checking modified time if ETag check failed\n perf: skip parsing If-None-Match when no ETag header\n perf: use Date.parse instead of new Date\n\n\n0.4.0 / 2017-02-05\n\n\n Fix false detection of no-cache request directive\n perf: enable strict mode\n perf: hoist regular expressions\n perf: remove duplicate conditional\n perf: remove unnecessary boolean coercions\n\n\n0.3.0 / 2015-05-12\n\n\n Add weak ETag matching support\n\n\n0.2.4 / 2014-09-07\n\n\n Support Node.js 0.6\n\n\n0.2.3 / 2014-09-07\n\n\n Move repository to jshttp\n\n\n0.2.2 / 2014-02-19\n\n\n Revert “Fix for blank page on Safari reload”\n\n\n0.2.1 / 2014-01-29\n\n\n Fix for blank page on Safari reload\n\n\n0.2.0 / 2013-08-11\n\n\n Return stale for Cache-Control: no-cache\n\n\n0.1.0 / 2012-06-15\n\n\n Add If-None-Match: * support\n\n\n0.0.1 / 2012-06-10\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/fresh/HISTORY.html" }, { "title": "2019-02-18 / 1.7.2", "excerpt": "\n", "content": "2019-02-18 / 1.7.2\n\n\n deps: setprototypeof@1.1.1\n\n\n2018-09-08 / 1.7.1\n\n\n Fix error creating objects in some environments\n\n\n2018-07-30 / 1.7.0\n\n\n Set constructor name when possible\n Use toidentifier module to make class names\n deps: statuses@’>= 1.5.0 < 2’\n\n\n2018-03-29 / 1.6.3\n\n\n deps: depd@~1.1.2\n \n perf: remove argument reassignment\n \n \n deps: setprototypeof@1.1.0\n deps: statuses@’>= 1.4.0 < 2’\n\n\n2017-08-04 / 1.6.2\n\n\n deps: depd@1.1.1\n \n Remove unnecessary Buffer loading\n \n \n\n\n2017-02-20 / 1.6.1\n\n\n deps: setprototypeof@1.0.3\n \n Fix shim for old browsers\n \n \n\n\n2017-02-14 / 1.6.0\n\n\n Accept custom 4xx and 5xx status codes in factory\n Add deprecation message to \"I'mateapot\" export\n Deprecate passing status code as anything except first argument in factory\n Deprecate using non-error status codes\n Make message property enumerable for HttpErrors\n\n\n2016-11-16 / 1.5.1\n\n\n deps: inherits@2.0.3\n \n Fix issue loading in browser\n \n \n deps: setprototypeof@1.0.2\n deps: statuses@’>= 1.3.1 < 2’\n\n\n2016-05-18 / 1.5.0\n\n\n Support new code 421 Misdirected Request\n Use setprototypeof module to replace __proto__ setting\n deps: statuses@’>= 1.3.0 < 2’\n \n Add 421 Misdirected Request\n perf: enable strict mode\n \n \n perf: enable strict mode\n\n\n2016-01-28 / 1.4.0\n\n\n Add HttpError export, for err instanceof createError.HttpError\n deps: inherits@2.0.1\n deps: statuses@’>= 1.2.1 < 2’\n \n Fix message for status 451\n Remove incorrect nginx status code\n \n \n\n\n2015-02-02 / 1.3.1\n\n\n Fix regression where status can be overwritten in createError props\n\n\n2015-02-01 / 1.3.0\n\n\n Construct errors using defined constructors from createError\n Fix error names that are not identifiers\n \n createError[\"I'mateapot\"] is now createError.ImATeapot\n \n \n Set a meaningful name property on constructed errors\n\n\n2014-12-09 / 1.2.8\n\n\n Fix stack trace from exported function\n Remove arguments.callee usage\n\n\n2014-10-14 / 1.2.7\n\n\n Remove duplicate line\n\n\n2014-10-02 / 1.2.6\n\n\n Fix expose to be true for ClientError constructor\n\n\n2014-09-28 / 1.2.5\n\n\n deps: statuses@1\n\n\n2014-09-21 / 1.2.4\n\n\n Fix dependency version to work with old npms\n\n\n2014-09-21 / 1.2.3\n\n\n deps: statuses@~1.1.0\n\n\n2014-09-21 / 1.2.2\n\n\n Fix publish error\n\n\n2014-09-21 / 1.2.1\n\n\n Support Node.js 0.6\n Use inherits instead of util\n\n\n2014-09-09 / 1.2.0\n\n\n Fix the way inheriting functions\n Support expose being provided in properties argument\n\n\n2014-09-08 / 1.1.0\n\n\n Default status to 500\n Support provided error to extend\n\n\n2014-09-08 / 1.0.1\n\n\n Fix accepting string message\n\n\n2014-09-08 / 1.0.0\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/http-errors/HISTORY.html" }, { "title": "0.4.24 / 2018-08-22", "excerpt": "\n", "content": "0.4.24 / 2018-08-22\n\n\n Added MIK encoding (#196, by @Ivan-Kalatchev)\n\n\n0.4.23 / 2018-05-07\n\n\n Fix deprecation warning in Node v10 due to the last usage of new Buffer (#185, by @felixbuenemann)\n Switched from NodeBuffer to Buffer in typings (#155 by @felixfbecker, #186 by @larssn)\n\n\n0.4.22 / 2018-05-05\n\n\n Use older semver style for dependencies to be compatible with Node version 0.10 (#182, by @dougwilson)\n Fix tests to accomodate fixes in Node v10 (#182, by @dougwilson)\n\n\n0.4.21 / 2018-04-06\n\n\n Fix encoding canonicalization (#156)\n Fix the paths in the “browser” field in package.json (#174 by @LMLB)\n Removed “contributors” section in package.json - see Git history instead.\n\n\n0.4.20 / 2018-04-06\n\n\n Updated new Buffer() usages with recommended replacements as it’s being deprecated in Node v10 (#176, #178 by @ChALkeR)\n\n\n0.4.19 / 2017-09-09\n\n\n Fixed iso8859-1 codec regression in handling untranslatable characters (#162, caused by #147)\n Re-generated windows1255 codec, because it was updated in iconv project\n Fixed grammar in error message when iconv-lite is loaded with encoding other than utf8\n\n\n0.4.18 / 2017-06-13\n\n\n Fixed CESU-8 regression in Node v8.\n\n\n0.4.17 / 2017-04-22\n\n\n Updated typescript definition file to support Angular 2 AoT mode (#153 by @larssn)\n\n\n0.4.16 / 2017-04-22\n\n\n Added support for React Native (#150)\n Changed iso8859-1 encoding to usine internal ‘binary’ encoding, as it’s the same thing (#147 by @mscdex)\n Fixed typo in Readme (#138 by @jiangzhuo)\n Fixed build for Node v6.10+ by making correct version comparison\n Added a warning if iconv-lite is loaded not as utf-8 (see #142)\n\n\n0.4.15 / 2016-11-21\n\n\n Fixed typescript type definition (#137)\n\n\n0.4.14 / 2016-11-20\n\n\n Preparation for v1.0\n Added Node v6 and latest Node versions to Travis CI test rig\n Deprecated Node v0.8 support\n Typescript typings (@larssn)\n Fix encoding of Euro character in GB 18030 (inspired by @lygstate)\n Add ms prefix to dbcs windows encodings (@rokoroku)\n\n\n0.4.13 / 2015-10-01\n\n\n Fix silly mistake in deprecation notice.\n\n\n0.4.12 / 2015-09-26\n\n\n Node v4 support:\n \n Added CESU-8 decoding (#106)\n Added deprecation notice for extendNodeEncodings\n Added Travis tests for Node v4 and io.js latest (#105 by @Mithgol)\n \n \n\n\n0.4.11 / 2015-07-03\n\n\n Added CESU-8 encoding.\n\n\n0.4.10 / 2015-05-26\n\n\n Changed UTF-16 endianness heuristic to take into account any ASCII chars, not\njust spaces. This should minimize the importance of “default” endianness.\n\n\n0.4.9 / 2015-05-24\n\n\n Streamlined BOM handling: strip BOM by default, add BOM when encoding if \naddBOM: true. Added docs to Readme.\n UTF16 now uses UTF16-LE by default.\n Fixed minor issue with big5 encoding.\n Added io.js testing on Travis; updated node-iconv version to test against.\nNow we just skip testing SBCS encodings that node-iconv doesn’t support.\n (internal refactoring) Updated codec interface to use classes.\n Use strict mode in all files.\n\n\n0.4.8 / 2015-04-14\n\n\n added alias UNICODE-1-1-UTF-7 for UTF-7 encoding (#94)\n\n\n0.4.7 / 2015-02-05\n\n\n stop official support of Node.js v0.8. Should still work, but no guarantees.\nreason: Packages needed for testing are hard to get on Travis CI.\n work in environment where Object.prototype is monkey patched with enumerable \nprops (#89).\n\n\n0.4.6 / 2015-01-12\n\n\n fix rare aliases of single-byte encodings (thanks @mscdex)\n double the timeout for dbcs tests to make them less flaky on travis\n\n\n0.4.5 / 2014-11-20\n\n\n fix windows-31j and x-sjis encoding support (@nleush)\n minor fix: undefined variable reference when internal error happens\n\n\n0.4.4 / 2014-07-16\n\n\n added encodings UTF-7 (RFC2152) and UTF-7-IMAP (RFC3501 Section 5.1.3)\n fixed streaming base64 encoding\n\n\n0.4.3 / 2014-06-14\n\n\n added encodings UTF-16BE and UTF-16 with BOM\n\n\n0.4.2 / 2014-06-12\n\n\n don’t throw exception if extendNodeEncodings() is called more than once\n\n\n0.4.1 / 2014-06-11\n\n\n codepage 808 added\n\n\n0.4.0 / 2014-06-10\n\n\n code is rewritten from scratch\n all widespread encodings are supported\n streaming interface added\n browserify compatibility added\n (optional) extend core primitive encodings to make usage even simpler\n moved from vows to mocha as the testing framework\n\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/iconv-lite/Changelog.html" }, { "title": "0.3.0 / 2014-09-07", "excerpt": "\n", "content": "0.3.0 / 2014-09-07\n\n\n Support Node.js 0.6\n Throw error when parameter format invalid on parse\n\n\n0.2.0 / 2014-06-18\n\n\n Add typer.format() to format media types\n\n\n0.1.0 / 2014-06-17\n\n\n Accept req as argument to parse\n Accept res as argument to parse\n Parse media type with extra LWS between type and first parameter\n\n\n0.0.0 / 2014-06-13\n\n\n Initial implementation\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/media-typer/HISTORY.html" }, { "title": "1.0.1 / 2016-01-17", "excerpt": "\n", "content": "1.0.1 / 2016-01-17\n\n\n perf: enable strict mode\n\n\n1.0.0 / 2015-03-01\n\n\n Add option to only add new descriptors\n Add simple argument validation\n Add jsdoc to source file\n\n\n0.0.2 / 2013-12-14\n\n\n Move repository to component organization\n\n\n0.0.1 / 2013-10-29\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/merge-descriptors/HISTORY.html" }, { "title": "1.1.2 / 2016-01-17", "excerpt": "\n", "content": "1.1.2 / 2016-01-17\n\n\n perf: enable strict mode\n\n\n1.1.1 / 2014-12-30\n\n\n Improve browserify support\n\n\n1.1.0 / 2014-07-05\n\n\n Add CONNECT method\n\n\n1.0.1 / 2014-06-02\n\n\n Fix module to work with harmony transform\n\n\n1.0.0 / 2014-05-08\n\n\n Add PURGE method\n\n\n0.1.0 / 2013-10-28\n\n\n Add http.METHODS support\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/methods/HISTORY.html" }, { "title": "1.40.0 / 2019-04-20", "excerpt": "\n", "content": "1.40.0 / 2019-04-20\n\n\n Add extensions from IANA for model/* types\n Add text/mdx with extension .mdx\n\n\n1.39.0 / 2019-04-04\n\n\n Add extensions .siv and .sieve to application/sieve\n Add new upstream MIME types\n\n\n1.38.0 / 2019-02-04\n\n\n Add extension .nq to application/n-quads\n Add extension .nt to application/n-triples\n Add new upstream MIME types\n Mark text/less as compressible\n\n\n1.37.0 / 2018-10-19\n\n\n Add extensions to HEIC image types\n Add new upstream MIME types\n\n\n1.36.0 / 2018-08-20\n\n\n Add Apple file extensions from IANA\n Add extensions from IANA for image/* types\n Add new upstream MIME types\n\n\n1.35.0 / 2018-07-15\n\n\n Add extension .owl to application/rdf+xml\n Add new upstream MIME types\n \n Removes extension .woff from application/font-woff\n \n \n\n\n1.34.0 / 2018-06-03\n\n\n Add extension .csl to application/vnd.citationstyles.style+xml\n Add extension .es to application/ecmascript\n Add new upstream MIME types\n Add UTF-8 as default charset for text/turtle\n Mark all XML-derived types as compressible\n\n\n1.33.0 / 2018-02-15\n\n\n Add extensions from IANA for message/* types\n Add new upstream MIME types\n Fix some incorrect OOXML types\n Remove application/font-woff2\n\n\n1.32.0 / 2017-11-29\n\n\n Add new upstream MIME types\n Update text/hjson to registered application/hjson\n Add text/shex with extension .shex\n\n\n1.31.0 / 2017-10-25\n\n\n Add application/raml+yaml with extension .raml\n Add application/wasm with extension .wasm\n Add new font type from IANA\n Add new upstream font extensions\n Add new upstream MIME types\n Add extensions for JPEG-2000 images\n\n\n1.30.0 / 2017-08-27\n\n\n Add application/vnd.ms-outlook\n Add application/x-arj\n Add extension .mjs to application/javascript\n Add glTF types and extensions\n Add new upstream MIME types\n Add text/x-org\n Add VirtualBox MIME types\n Fix source records for video/* types that are IANA\n Update font/opentype to registered font/otf\n\n\n1.29.0 / 2017-07-10\n\n\n Add application/fido.trusted-apps+json\n Add extension .wadl to application/vnd.sun.wadl+xml\n Add new upstream MIME types\n Add UTF-8 as default charset for text/css\n\n\n1.28.0 / 2017-05-14\n\n\n Add new upstream MIME types\n Add extension .gz to application/gzip\n Update extensions .md and .markdown to be text/markdown\n\n\n1.27.0 / 2017-03-16\n\n\n Add new upstream MIME types\n Add image/apng with extension .apng\n\n\n1.26.0 / 2017-01-14\n\n\n Add new upstream MIME types\n Add extension .geojson to application/geo+json\n\n\n1.25.0 / 2016-11-11\n\n\n Add new upstream MIME types\n\n\n1.24.0 / 2016-09-18\n\n\n Add audio/mp3\n Add new upstream MIME types\n\n\n1.23.0 / 2016-05-01\n\n\n Add new upstream MIME types\n Add extension .3gpp to audio/3gpp\n\n\n1.22.0 / 2016-02-15\n\n\n Add text/slim\n Add extension .rng to application/xml\n Add new upstream MIME types\n Fix extension of application/dash+xml to be .mpd\n Update primary extension to .m4a for audio/mp4\n\n\n1.21.0 / 2016-01-06\n\n\n Add Google document types\n Add new upstream MIME types\n\n\n1.20.0 / 2015-11-10\n\n\n Add text/x-suse-ymp\n Add new upstream MIME types\n\n\n1.19.0 / 2015-09-17\n\n\n Add application/vnd.apple.pkpass\n Add new upstream MIME types\n\n\n1.18.0 / 2015-09-03\n\n\n Add new upstream MIME types\n\n\n1.17.0 / 2015-08-13\n\n\n Add application/x-msdos-program\n Add audio/g711-0\n Add image/vnd.mozilla.apng\n Add extension .exe to application/x-msdos-program\n\n\n1.16.0 / 2015-07-29\n\n\n Add application/vnd.uri-map\n\n\n1.15.0 / 2015-07-13\n\n\n Add application/x-httpd-php\n\n\n1.14.0 / 2015-06-25\n\n\n Add application/scim+json\n Add application/vnd.3gpp.ussd+xml\n Add application/vnd.biopax.rdf+xml\n Add text/x-processing\n\n\n1.13.0 / 2015-06-07\n\n\n Add nginx as a source\n Add application/x-cocoa\n Add application/x-java-archive-diff\n Add application/x-makeself\n Add application/x-perl\n Add application/x-pilot\n Add application/x-redhat-package-manager\n Add application/x-sea\n Add audio/x-m4a\n Add audio/x-realaudio\n Add image/x-jng\n Add text/mathml\n\n\n1.12.0 / 2015-06-05\n\n\n Add application/bdoc\n Add application/vnd.hyperdrive+json\n Add application/x-bdoc\n Add extension .rtf to text/rtf\n\n\n1.11.0 / 2015-05-31\n\n\n Add audio/wav\n Add audio/wave\n Add extension .litcoffee to text/coffeescript\n Add extension .sfd-hdstx to application/vnd.hydrostatix.sof-data\n Add extension .n-gage to application/vnd.nokia.n-gage.symbian.install\n\n\n1.10.0 / 2015-05-19\n\n\n Add application/vnd.balsamiq.bmpr\n Add application/vnd.microsoft.portable-executable\n Add application/x-ns-proxy-autoconfig\n\n\n1.9.1 / 2015-04-19\n\n\n Remove .json extension from application/manifest+json\n \n This is causing bugs downstream\n \n \n\n\n1.9.0 / 2015-04-19\n\n\n Add application/manifest+json\n Add application/vnd.micro+json\n Add image/vnd.zbrush.pcx\n Add image/x-ms-bmp\n\n\n1.8.0 / 2015-03-13\n\n\n Add application/vnd.citationstyles.style+xml\n Add application/vnd.fastcopy-disk-image\n Add application/vnd.gov.sk.xmldatacontainer+xml\n Add extension .jsonld to application/ld+json\n\n\n1.7.0 / 2015-02-08\n\n\n Add application/vnd.gerber\n Add application/vnd.msa-disk-image\n\n\n1.6.1 / 2015-02-05\n\n\n Community extensions ownership transferred from node-mime\n\n\n1.6.0 / 2015-01-29\n\n\n Add application/jose\n Add application/jose+json\n Add application/json-seq\n Add application/jwk+json\n Add application/jwk-set+json\n Add application/jwt\n Add application/rdap+json\n Add application/vnd.gov.sk.e-form+xml\n Add application/vnd.ims.imsccv1p3\n\n\n1.5.0 / 2014-12-30\n\n\n Add application/vnd.oracle.resource+json\n Fix various invalid MIME type entries\n \n application/mbox+xml\n application/oscp-response\n application/vwg-multiplexed\n audio/g721\n \n \n\n\n1.4.0 / 2014-12-21\n\n\n Add application/vnd.ims.imsccv1p2\n Fix various invalid MIME type entries\n \n application/vnd-acucobol\n application/vnd-curl\n application/vnd-dart\n application/vnd-dxr\n application/vnd-fdf\n application/vnd-mif\n application/vnd-sema\n application/vnd-wap-wmlc\n application/vnd.adobe.flash-movie\n application/vnd.dece-zip\n application/vnd.dvb_service\n application/vnd.micrografx-igx\n application/vnd.sealed-doc\n application/vnd.sealed-eml\n application/vnd.sealed-mht\n application/vnd.sealed-ppt\n application/vnd.sealed-tiff\n application/vnd.sealed-xls\n application/vnd.sealedmedia.softseal-html\n application/vnd.sealedmedia.softseal-pdf\n application/vnd.wap-slc\n application/vnd.wap-wbxml\n audio/vnd.sealedmedia.softseal-mpeg\n image/vnd-djvu\n image/vnd-svf\n image/vnd-wap-wbmp\n image/vnd.sealed-png\n image/vnd.sealedmedia.softseal-gif\n image/vnd.sealedmedia.softseal-jpg\n model/vnd-dwf\n model/vnd.parasolid.transmit-binary\n model/vnd.parasolid.transmit-text\n text/vnd-a\n text/vnd-curl\n text/vnd.wap-wml\n \n \n Remove example template MIME types\n \n application/example\n audio/example\n image/example\n message/example\n model/example\n multipart/example\n text/example\n video/example\n \n \n\n\n1.3.1 / 2014-12-16\n\n\n Fix missing extensions\n \n application/json5\n text/hjson\n \n \n\n\n1.3.0 / 2014-12-07\n\n\n Add application/a2l\n Add application/aml\n Add application/atfx\n Add application/atxml\n Add application/cdfx+xml\n Add application/dii\n Add application/json5\n Add application/lxf\n Add application/mf4\n Add application/vnd.apache.thrift.compact\n Add application/vnd.apache.thrift.json\n Add application/vnd.coffeescript\n Add application/vnd.enphase.envoy\n Add application/vnd.ims.imsccv1p1\n Add text/csv-schema\n Add text/hjson\n Add text/markdown\n Add text/yaml\n\n\n1.2.0 / 2014-11-09\n\n\n Add application/cea\n Add application/dit\n Add application/vnd.gov.sk.e-form+zip\n Add application/vnd.tmd.mediaflex.api+xml\n Type application/epub+zip is now IANA-registered\n\n\n1.1.2 / 2014-10-23\n\n\n Rebuild database for application/x-www-form-urlencoded change\n\n\n1.1.1 / 2014-10-20\n\n\n Mark application/x-www-form-urlencoded as compressible.\n\n\n1.1.0 / 2014-09-28\n\n\n Add application/font-woff2\n\n\n1.0.3 / 2014-09-25\n\n\n Fix engine requirement in package\n\n\n1.0.2 / 2014-09-25\n\n\n Add application/coap-group+json\n Add application/dcd\n Add application/vnd.apache.thrift.binary\n Add image/vnd.tencent.tap\n Mark all JSON-derived types as compressible\n Update text/vtt data\n\n\n1.0.1 / 2014-08-30\n\n\n Fix extension ordering\n\n\n1.0.0 / 2014-08-30\n\n\n Add application/atf\n Add application/merge-patch+json\n Add multipart/x-mixed-replace\n Add source: 'apache' metadata\n Add source: 'iana' metadata\n Remove badly-assumed charset data\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/mime-db/HISTORY.html" }, { "title": "2.1.24 / 2019-04-20", "excerpt": "\n", "content": "2.1.24 / 2019-04-20\n\n\n deps: mime-db@1.40.0\n \n Add extensions from IANA for model/* types\n Add text/mdx with extension .mdx\n \n \n\n\n2.1.23 / 2019-04-17\n\n\n deps: mime-db@~1.39.0\n \n Add extensions .siv and .sieve to application/sieve\n Add new upstream MIME types\n \n \n\n\n2.1.22 / 2019-02-14\n\n\n deps: mime-db@~1.38.0\n \n Add extension .nq to application/n-quads\n Add extension .nt to application/n-triples\n Add new upstream MIME types\n Mark text/less as compressible\n \n \n\n\n2.1.21 / 2018-10-19\n\n\n deps: mime-db@~1.37.0\n \n Add extensions to HEIC image types\n Add new upstream MIME types\n \n \n\n\n2.1.20 / 2018-08-26\n\n\n deps: mime-db@~1.36.0\n \n Add Apple file extensions from IANA\n Add extensions from IANA for image/* types\n Add new upstream MIME types\n \n \n\n\n2.1.19 / 2018-07-17\n\n\n deps: mime-db@~1.35.0\n \n Add extension .csl to application/vnd.citationstyles.style+xml\n Add extension .es to application/ecmascript\n Add extension .owl to application/rdf+xml\n Add new upstream MIME types\n Add UTF-8 as default charset for text/turtle\n \n \n\n\n2.1.18 / 2018-02-16\n\n\n deps: mime-db@~1.33.0\n \n Add application/raml+yaml with extension .raml\n Add application/wasm with extension .wasm\n Add text/shex with extension .shex\n Add extensions for JPEG-2000 images\n Add extensions from IANA for message/* types\n Add new upstream MIME types\n Update font MIME types\n Update text/hjson to registered application/hjson\n \n \n\n\n2.1.17 / 2017-09-01\n\n\n deps: mime-db@~1.30.0\n \n Add application/vnd.ms-outlook\n Add application/x-arj\n Add extension .mjs to application/javascript\n Add glTF types and extensions\n Add new upstream MIME types\n Add text/x-org\n Add VirtualBox MIME types\n Fix source records for video/* types that are IANA\n Update font/opentype to registered font/otf\n \n \n\n\n2.1.16 / 2017-07-24\n\n\n deps: mime-db@~1.29.0\n \n Add application/fido.trusted-apps+json\n Add extension .wadl to application/vnd.sun.wadl+xml\n Add extension .gz to application/gzip\n Add new upstream MIME types\n Update extensions .md and .markdown to be text/markdown\n \n \n\n\n2.1.15 / 2017-03-23\n\n\n deps: mime-db@~1.27.0\n \n Add new mime types\n Add image/apng\n \n \n\n\n2.1.14 / 2017-01-14\n\n\n deps: mime-db@~1.26.0\n \n Add new mime types\n \n \n\n\n2.1.13 / 2016-11-18\n\n\n deps: mime-db@~1.25.0\n \n Add new mime types\n \n \n\n\n2.1.12 / 2016-09-18\n\n\n deps: mime-db@~1.24.0\n \n Add new mime types\n Add audio/mp3\n \n \n\n\n2.1.11 / 2016-05-01\n\n\n deps: mime-db@~1.23.0\n \n Add new mime types\n \n \n\n\n2.1.10 / 2016-02-15\n\n\n deps: mime-db@~1.22.0\n \n Add new mime types\n Fix extension of application/dash+xml\n Update primary extension for audio/mp4\n \n \n\n\n2.1.9 / 2016-01-06\n\n\n deps: mime-db@~1.21.0\n \n Add new mime types\n \n \n\n\n2.1.8 / 2015-11-30\n\n\n deps: mime-db@~1.20.0\n \n Add new mime types\n \n \n\n\n2.1.7 / 2015-09-20\n\n\n deps: mime-db@~1.19.0\n \n Add new mime types\n \n \n\n\n2.1.6 / 2015-09-03\n\n\n deps: mime-db@~1.18.0\n \n Add new mime types\n \n \n\n\n2.1.5 / 2015-08-20\n\n\n deps: mime-db@~1.17.0\n \n Add new mime types\n \n \n\n\n2.1.4 / 2015-07-30\n\n\n deps: mime-db@~1.16.0\n \n Add new mime types\n \n \n\n\n2.1.3 / 2015-07-13\n\n\n deps: mime-db@~1.15.0\n \n Add new mime types\n \n \n\n\n2.1.2 / 2015-06-25\n\n\n deps: mime-db@~1.14.0\n \n Add new mime types\n \n \n\n\n2.1.1 / 2015-06-08\n\n\n perf: fix deopt during mapping\n\n\n2.1.0 / 2015-06-07\n\n\n Fix incorrectly treating extension-less file name as extension\n \n i.e. 'path/to/json' will no longer return application/json\n \n \n Fix .charset(type) to accept parameters\n Fix .charset(type) to match case-insensitive\n Improve generation of extension to MIME mapping\n Refactor internals for readability and no argument reassignment\n Prefer application/* MIME types from the same source\n Prefer any type over application/octet-stream\n deps: mime-db@~1.13.0\n \n Add nginx as a source\n Add new mime types\n \n \n\n\n2.0.14 / 2015-06-06\n\n\n deps: mime-db@~1.12.0\n \n Add new mime types\n \n \n\n\n2.0.13 / 2015-05-31\n\n\n deps: mime-db@~1.11.0\n \n Add new mime types\n \n \n\n\n2.0.12 / 2015-05-19\n\n\n deps: mime-db@~1.10.0\n \n Add new mime types\n \n \n\n\n2.0.11 / 2015-05-05\n\n\n deps: mime-db@~1.9.1\n \n Add new mime types\n \n \n\n\n2.0.10 / 2015-03-13\n\n\n deps: mime-db@~1.8.0\n \n Add new mime types\n \n \n\n\n2.0.9 / 2015-02-09\n\n\n deps: mime-db@~1.7.0\n \n Add new mime types\n Community extensions ownership transferred from node-mime\n \n \n\n\n2.0.8 / 2015-01-29\n\n\n deps: mime-db@~1.6.0\n \n Add new mime types\n \n \n\n\n2.0.7 / 2014-12-30\n\n\n deps: mime-db@~1.5.0\n \n Add new mime types\n Fix various invalid MIME type entries\n \n \n\n\n2.0.6 / 2014-12-30\n\n\n deps: mime-db@~1.4.0\n \n Add new mime types\n Fix various invalid MIME type entries\n Remove example template MIME types\n \n \n\n\n2.0.5 / 2014-12-29\n\n\n deps: mime-db@~1.3.1\n \n Fix missing extensions\n \n \n\n\n2.0.4 / 2014-12-10\n\n\n deps: mime-db@~1.3.0\n \n Add new mime types\n \n \n\n\n2.0.3 / 2014-11-09\n\n\n deps: mime-db@~1.2.0\n \n Add new mime types\n \n \n\n\n2.0.2 / 2014-09-28\n\n\n deps: mime-db@~1.1.0\n \n Add new mime types\n Add additional compressible\n Update charsets\n \n \n\n\n2.0.1 / 2014-09-07\n\n\n Support Node.js 0.6\n\n\n2.0.0 / 2014-09-02\n\n\n Use mime-db\n Remove .define()\n\n\n1.0.2 / 2014-08-04\n\n\n Set charset=utf-8 for text/javascript\n\n\n1.0.1 / 2014-06-24\n\n\n Add text/jsx type\n\n\n1.0.0 / 2014-05-12\n\n\n Return false for unknown types\n Set charset=utf-8 for application/json\n\n\n0.1.0 / 2014-05-02\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/mime-types/HISTORY.html" }, { "title": "Changelog", "excerpt": "\n", "content": "Changelog\n\nv1.6.0 (24/11/2017)\nNo changelog for this release.\n\n\n\nv2.0.4 (24/11/2017)\n\n [closed] Switch to mime-score module for resolving extension contention issues. #182\n [closed] Update mime-db to 1.31.0 in v1.x branch #181\n\n\n\n\nv1.5.0 (22/11/2017)\n\n [closed] need ES5 version ready in npm package #179\n [closed] mime-db no trace of iWork - pages / numbers / etc. #178\n [closed] How it works in brownser ? #176\n [closed] Missing ./Mime #175\n [closed] Vulnerable Regular Expression #167\n\n\n\n\nv2.0.3 (25/09/2017)\nNo changelog for this release.\n\n\n\nv1.4.1 (25/09/2017)\n\n [closed] Issue when bundling with webpack #172\n\n\n\n\nv2.0.2 (15/09/2017)\n\n [V2] fs.readFileSync is not a function #165\n [closed] The extension for video/quicktime should map to .mov, not .qt #164\n [V2] [v2 Feedback request] Mime class API #163\n [V2] [v2 Feedback request] Resolving conflicts over extensions #162\n [V2] Allow callers to load module with official, full, or no defined types. #161\n [V2] Use “facets” to resolve extension conflicts #160\n [V2] Remove fs and path dependencies #152\n [V2] Default content-type should not be application/octet-stream #139\n [V2] reset mime-types #124\n [V2] Extensionless paths should return null or false #113\n\n\n\n\nv2.0.1 (14/09/2017)\n\n [closed] Changelog for v2.0 does not mention breaking changes #171\n [closed] MIME breaking with ‘class’ declaration as it is without ‘use strict mode’ #170\n\n\n\n\nv2.0.0 (12/09/2017)\n\n [closed] woff and woff2 #168\n\n\n\n\nv1.4.0 (28/08/2017)\n\n [closed] support for ac3 voc files #159\n [closed] Help understanding change from application/xml to text/xml #158\n [closed] no longer able to override mimetype #157\n [closed] application/vnd.adobe.photoshop #147\n [closed] Directories should appear as something other than application/octet-stream #135\n [closed] requested features #131\n [closed] Make types.json loading optional? #129\n [closed] Cannot find module ‘./types.json’ #120\n [V2] .wav files show up as “audio/x-wav” instead of “audio/x-wave” #118\n [closed] Don’t be a pain in the ass for node community #108\n [closed] don’t make default_type global #78\n [closed] mime.extension() fails if the content-type is parameterized #74\n\n\n\n\nv1.3.6 (11/05/2017)\n\n [closed] .md should be text/markdown as of March 2016 #154\n [closed] Error while installing mime #153\n [closed] application/manifest+json #149\n [closed] Dynamic adaptive streaming over HTTP (DASH) file extension typo #141\n [closed] charsets image/png undefined #140\n [closed] Mime-db dependency out of date #130\n [closed] how to support plist? #126\n [closed] how does .types file format look like? #123\n [closed] Feature: support for expanding MIME patterns #121\n [closed] DEBUG_MIME doesn’t work #117\n\n\n\n\nv1.3.4 (06/02/2015)\nNo changelog for this release.\n\n\n\nv1.3.3 (06/02/2015)\nNo changelog for this release.\n\n\n\nv1.3.1 (05/02/2015)\n\n [closed] Consider adding support for Handlebars .hbs file ending #111\n [closed] Consider adding support for hjson. #110\n [closed] Add mime type for Opus audio files #94\n [closed] Consider making the Requesting New Types information more visible #77\n\n\n\n\nv1.3.0 (05/02/2015)\n\n [closed] Add common name? #114\n [closed] application/x-yaml #104\n [closed] Add mime type for WOFF file format 2.0 #102\n [closed] application/x-msi for .msi #99\n [closed] Add mimetype for gettext translation files #98\n [closed] collaborators #88\n [closed] getting errot in installation of mime module…any1 can help? #87\n [closed] should application/json’s charset be utf8? #86\n [closed] Add “license” and “licenses” to package.json #81\n [closed] lookup with extension-less file on Windows returns wrong type #68\n\n\n\n\nv1.2.11 (15/08/2013)\n\n [closed] Update mime.types #65\n [closed] Publish a new version #63\n [closed] README should state upfront that “application/octet-stream” is default for unknown extension #55\n [closed] Suggested improvement to the charset API #52\n\n\n\n\nv1.2.10 (25/07/2013)\n\n [closed] Mime type for woff files should be application/font-woff and not application/x-font-woff #62\n [closed] node.types in conflict with mime.types #51\n\n\n\n\nv1.2.9 (17/01/2013)\n\n [closed] Please update “mime” NPM #49\n [closed] Please add semicolon #46\n [closed] parse full mime types #43\n\n\n\n\nv1.2.8 (10/01/2013)\n\n [closed] /js directory mime is application/javascript. Is it correct? #47\n [closed] Add mime types for lua code. #45\n\n\n\n\nv1.2.7 (19/10/2012)\n\n [closed] cannot install 1.2.7 via npm #41\n [closed] Transfer ownership to @broofa #36\n [closed] it’s wrong to set charset to UTF-8 for text #30\n [closed] Allow multiple instances of MIME types container #27\n\n\n\n\nv1.2.5 (16/02/2012)\n\n [closed] When looking up a types, check hasOwnProperty #23\n [closed] Bump version to 1.2.2 #18\n [closed] No license #16\n [closed] Some types missing that are used by html5/css3 #13\n [closed] npm install fails for 1.2.1 #12\n [closed] image/pjpeg + image/x-png #10\n [closed] symlink #8\n [closed] gzip #2\n [closed] ALL CAPS filenames return incorrect mime type #1\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/mime/CHANGELOG.html" }, { "title": "0.6.2 / 2019-04-29", "excerpt": "\n", "content": "0.6.2 / 2019-04-29\n\n\n Fix sorting charset, encoding, and language with extra parameters\n\n\n0.6.1 / 2016-05-02\n\n\n perf: improve Accept parsing speed\n perf: improve Accept-Charset parsing speed\n perf: improve Accept-Encoding parsing speed\n perf: improve Accept-Language parsing speed\n\n\n0.6.0 / 2015-09-29\n\n\n Fix including type extensions in parameters in Accept parsing\n Fix parsing Accept parameters with quoted equals\n Fix parsing Accept parameters with quoted semicolons\n Lazy-load modules from main entry point\n perf: delay type concatenation until needed\n perf: enable strict mode\n perf: hoist regular expressions\n perf: remove closures getting spec properties\n perf: remove a closure from media type parsing\n perf: remove property delete from media type parsing\n\n\n0.5.3 / 2015-05-10\n\n\n Fix media type parameter matching to be case-insensitive\n\n\n0.5.2 / 2015-05-06\n\n\n Fix comparing media types with quoted values\n Fix splitting media types with quoted commas\n\n\n0.5.1 / 2015-02-14\n\n\n Fix preference sorting to be stable for long acceptable lists\n\n\n0.5.0 / 2014-12-18\n\n\n Fix list return order when large accepted list\n Fix missing identity encoding when q=0 exists\n Remove dynamic building of Negotiator class\n\n\n0.4.9 / 2014-10-14\n\n\n Fix error when media type has invalid parameter\n\n\n0.4.8 / 2014-09-28\n\n\n Fix all negotiations to be case-insensitive\n Stable sort preferences of same quality according to client order\n Support Node.js 0.6\n\n\n0.4.7 / 2014-06-24\n\n\n Handle invalid provided languages\n Handle invalid provided media types\n\n\n0.4.6 / 2014-06-11\n\n\n Order by specificity when quality is the same\n\n\n0.4.5 / 2014-05-29\n\n\n Fix regression in empty header handling\n\n\n0.4.4 / 2014-05-29\n\n\n Fix behaviors when headers are not present\n\n\n0.4.3 / 2014-04-16\n\n\n Handle slashes on media params correctly\n\n\n0.4.2 / 2014-02-28\n\n\n Fix media type sorting\n Handle media types params strictly\n\n\n0.4.1 / 2014-01-16\n\n\n Use most specific matches\n\n\n0.4.0 / 2014-01-09\n\n\n Remove preferred prefix from methods\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/negotiator/HISTORY.html" }, { "title": "2.3.0 / 2015-05-26", "excerpt": "\n", "content": "2.3.0 / 2015-05-26\n\n\n Add defined behavior for HTTP CONNECT requests\n Add defined behavior for HTTP Upgrade requests\n deps: ee-first@1.1.1\n\n\n2.2.1 / 2015-04-22\n\n\n Fix isFinished(req) when data buffered\n\n\n2.2.0 / 2014-12-22\n\n\n Add message object to callback arguments\n\n\n2.1.1 / 2014-10-22\n\n\n Fix handling of pipelined requests\n\n\n2.1.0 / 2014-08-16\n\n\n Check if socket is detached\n Return undefined for isFinished if state unknown\n\n\n2.0.0 / 2014-08-16\n\n\n Add isFinished function\n Move to jshttp organization\n Remove support for plain socket argument\n Rename to on-finished\n Support both req and res as arguments\n deps: ee-first@1.0.5\n\n\n1.2.2 / 2014-06-10\n\n\n Reduce listeners added to emitters\n \n avoids “event emitter leak” warnings when used multiple times on same request\n \n \n\n\n1.2.1 / 2014-06-08\n\n\n Fix returned value when already finished\n\n\n1.2.0 / 2014-06-05\n\n\n Call callback when called on already-finished socket\n\n\n1.1.4 / 2014-05-27\n\n\n Support node.js 0.8\n\n\n1.1.3 / 2014-04-30\n\n\n Make sure errors passed as instanceof Error\n\n\n1.1.2 / 2014-04-18\n\n\n Default the socket to passed-in object\n\n\n1.1.1 / 2014-01-16\n\n\n Rename module to finished\n\n\n1.1.0 / 2013-12-25\n\n\n Call callback when called on already-errored socket\n\n\n1.0.1 / 2013-12-20\n\n\n Actually pass the error to the callback\n\n\n1.0.0 / 2013-12-20\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/on-finished/HISTORY.html" }, { "title": "1.3.3 / 2019-04-15", "excerpt": "\n", "content": "1.3.3 / 2019-04-15\n\n\n Fix Node.js 0.8 return value inconsistencies\n\n\n1.3.2 / 2017-09-09\n\n\n perf: reduce overhead for full URLs\n perf: unroll the “fast-path” RegExp\n\n\n1.3.1 / 2016-01-17\n\n\n perf: enable strict mode\n\n\n1.3.0 / 2014-08-09\n\n\n Add parseurl.original for parsing req.originalUrl with fallback\n Return undefined if req.url is undefined\n\n\n1.2.0 / 2014-07-21\n\n\n Cache URLs based on original value\n Remove no-longer-needed URL mis-parse work-around\n Simplify the “fast-path” RegExp\n\n\n1.1.3 / 2014-07-08\n\n\n Fix typo\n\n\n1.1.2 / 2014-07-08\n\n\n Seriously fix Node.js 0.8 compatibility\n\n\n1.1.1 / 2014-07-08\n\n\n Fix Node.js 0.8 compatibility\n\n\n1.1.0 / 2014-07-08\n\n\n Incorporate URL href-only parse fast-path\n\n\n1.0.1 / 2014-03-08\n\n\n Add missing require\n\n\n1.0.0 / 2014-03-08\n\n\n Genesis from connect\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/parseurl/HISTORY.html" }, { "title": "0.1.7 / 2015-07-28", "excerpt": "\n", "content": "0.1.7 / 2015-07-28\n\n\n Fixed regression with escaped round brackets and matching groups.\n\n\n0.1.6 / 2015-06-19\n\n\n Replace index feature by outputting all parameters, unnamed and named.\n\n\n0.1.5 / 2015-05-08\n\n\n Add an index property for position in match result.\n\n\n0.1.4 / 2015-03-05\n\n\n Add license information\n\n\n0.1.3 / 2014-07-06\n\n\n Better array support\n Improved support for trailing slash in non-ending mode\n\n\n0.1.0 / 2014-03-06\n\n\n add options.end\n\n\n0.0.2 / 2013-02-10\n\n\n Update to match current express\n add .license property to component.json\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/path-to-regexp/History.html" }, { "title": "2.0.5 / 2019-04-16", "excerpt": "\n", "content": "2.0.5 / 2019-04-16\n\n\n deps: ipaddr.js@1.9.0\n\n\n2.0.4 / 2018-07-26\n\n\n deps: ipaddr.js@1.8.0\n\n\n2.0.3 / 2018-02-19\n\n\n deps: ipaddr.js@1.6.0\n\n\n2.0.2 / 2017-09-24\n\n\n deps: forwarded@~0.1.2\n \n perf: improve header parsing\n perf: reduce overhead when no X-Forwarded-For header\n \n \n\n\n2.0.1 / 2017-09-10\n\n\n deps: forwarded@~0.1.1\n \n Fix trimming leading / trailing OWS\n perf: hoist regular expression\n \n \n deps: ipaddr.js@1.5.2\n\n\n2.0.0 / 2017-08-08\n\n\n Drop support for Node.js below 0.10\n\n\n1.1.5 / 2017-07-25\n\n\n Fix array argument being altered\n deps: ipaddr.js@1.4.0\n\n\n1.1.4 / 2017-03-24\n\n\n deps: ipaddr.js@1.3.0\n\n\n1.1.3 / 2017-01-14\n\n\n deps: ipaddr.js@1.2.0\n\n\n1.1.2 / 2016-05-29\n\n\n deps: ipaddr.js@1.1.1\n \n Fix IPv6-mapped IPv4 validation edge cases\n \n \n\n\n1.1.1 / 2016-05-03\n\n\n Fix regression matching mixed versions against multiple subnets\n\n\n1.1.0 / 2016-05-01\n\n\n Fix accepting various invalid netmasks\n \n IPv4 netmasks must be contingous\n IPv6 addresses cannot be used as a netmask\n \n \n deps: ipaddr.js@1.1.0\n\n\n1.0.10 / 2015-12-09\n\n\n deps: ipaddr.js@1.0.5\n \n Fix regression in isValid with non-string arguments\n \n \n\n\n1.0.9 / 2015-12-01\n\n\n deps: ipaddr.js@1.0.4\n \n Fix accepting some invalid IPv6 addresses\n Reject CIDRs with negative or overlong masks\n \n \n perf: enable strict mode\n\n\n1.0.8 / 2015-05-10\n\n\n deps: ipaddr.js@1.0.1\n\n\n1.0.7 / 2015-03-16\n\n\n deps: ipaddr.js@0.1.9\n \n Fix OOM on certain inputs to isValid\n \n \n\n\n1.0.6 / 2015-02-01\n\n\n deps: ipaddr.js@0.1.8\n\n\n1.0.5 / 2015-01-08\n\n\n deps: ipaddr.js@0.1.6\n\n\n1.0.4 / 2014-11-23\n\n\n deps: ipaddr.js@0.1.5\n \n Fix edge cases with isValid\n \n \n\n\n1.0.3 / 2014-09-21\n\n\n Use forwarded npm module\n\n\n1.0.2 / 2014-09-18\n\n\n Fix a global leak when multiple subnets are trusted\n Support Node.js 0.6\n deps: ipaddr.js@0.1.3\n\n\n1.0.1 / 2014-06-03\n\n\n Fix links in npm package\n\n\n1.0.0 / 2014-05-08\n\n\n Add trust argument to determine proxy trust on\n \n Accepts custom function\n Accepts IPv4/IPv6 address(es)\n Accepts subnets\n Accepts pre-defined names\n \n \n Add optional trust argument to proxyaddr.all to\nstop at first untrusted\n Add proxyaddr.compile to pre-compile trust function\nto make subsequent calls faster\n\n\n0.0.1 / 2014-05-04\n\n\n Fix bad npm publish\n\n\n0.0.0 / 2014-05-04\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/proxy-addr/HISTORY.html" }, { "title": "6.7.0", "excerpt": "\n", "content": "6.7.0\n\n [New] stringify/parse: add comma as an arrayFormat option (#276, #219)\n [Fix] correctly parse nested arrays (#212)\n [Fix] utils.merge: avoid a crash with a null target and a truthy non-array source, also with an array source\n [Robustness] stringify: cache Object.prototype.hasOwnProperty\n [Refactor] utils: isBuffer: small tweak; add tests\n [Refactor] use cached Array.isArray\n [Refactor] parse/stringify: make a function to normalize the options\n [Refactor] utils: reduce observable [[Get]]s\n [Refactor] stringify/utils: cache Array.isArray\n [Tests] always use String(x) over x.toString()\n [Tests] fix Buffer tests to work in node < 4.5 and node < 5.10\n [Tests] temporarily allow coverage to fail\n\n\n6.6.0\n\n [New] Add support for iso-8859-1, utf8 “sentinel” and numeric entities (#268)\n [New] move two-value combine to a utils function (#189)\n [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)\n [Fix] when parseArrays is false, properly handle keys ending in [] (#260)\n [Fix] stringify: do not crash in an obscure combo of interpretNumericEntities, a bad custom decoder, & iso-8859-1\n [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided\n [refactor] stringify: Avoid arr = arr.concat(…), push to the existing instance (#269)\n [Refactor] parse: only need to reassign the var once\n [Refactor] parse/stringify: clean up charset options checking; fix defaults\n [Refactor] add missing defaults\n [Refactor] parse: one less concat call\n [Refactor] utils: compactQueue: make it explicitly side-effecting\n [Dev Deps] update browserify, eslint, @ljharb/eslint-config, iconv-lite, safe-publish-latest, tape\n [Tests] up to node v10.10, v9.11, v8.12, v6.14, v4.9; pin included builds to LTS\n\n\n6.5.2\n\n [Fix] use safer-buffer instead of Buffer constructor\n [Refactor] utils: module.exports one thing, instead of mutating exports (#230)\n [Dev Deps] update browserify, eslint, iconv-lite, safer-buffer, tape, browserify\n\n\n6.5.1\n\n [Fix] Fix parsing & compacting very deep objects (#224)\n [Refactor] name utils functions\n [Dev Deps] update eslint, @ljharb/eslint-config, tape\n [Tests] up to node v8.4; use nvm install-latest-npm so newer npm doesn’t break older node\n [Tests] Use precise dist for Node.js 0.6 runtime (#225)\n [Tests] make 0.6 required, now that it’s passing\n [Tests] on node v8.2; fix npm on node 0.6\n\n\n6.5.0\n\n [New] add utils.assign\n [New] pass default encoder/decoder to custom encoder/decoder functions (#206)\n [New] parse/stringify: add ignoreQueryPrefix/addQueryPrefix options, respectively (#213)\n [Fix] Handle stringifying empty objects with addQueryPrefix (#217)\n [Fix] do not mutate options argument (#207)\n [Refactor] parse: cache index to reuse in else statement (#182)\n [Docs] add various badges to readme (#208)\n [Dev Deps] update eslint, browserify, iconv-lite, tape\n [Tests] up to node v8.1, v7.10, v6.11; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4\n [Tests] add editorconfig-tools\n\n\n6.4.0\n\n [New] qs.stringify: add encodeValuesOnly option\n [Fix] follow allowPrototypes option during merge (#201, #201)\n [Fix] support keys starting with brackets (#202, #200)\n [Fix] chmod a-x\n [Dev Deps] update eslint\n [Tests] up to node v7.7, v6.10, v4.8; disable osx builds since they block linux builds\n [eslint] reduce warnings\n\n\n6.3.2\n\n [Fix] follow allowPrototypes option during merge (#201, #200)\n [Dev Deps] update eslint\n [Fix] chmod a-x\n [Fix] support keys starting with brackets (#202, #200)\n [Tests] up to node v7.7, v6.10, v4.8; disable osx builds since they block linux builds\n\n\n6.3.1\n\n [Fix] ensure that allowPrototypes: false does not ever shadow Object.prototype properties (thanks, @snyk!)\n [Dev Deps] update eslint, @ljharb/eslint-config, browserify, iconv-lite, qs-iconv, tape\n [Tests] on all node minors; improve test matrix\n [Docs] document stringify option allowDots (#195)\n [Docs] add empty object and array values example (#195)\n [Docs] Fix minor inconsistency/typo (#192)\n [Docs] document stringify option sort (#191)\n [Refactor] stringify: throw faster with an invalid encoder\n [Refactor] remove unnecessary escapes (#184)\n Remove contributing.md, since qs is no longer part of hapi (#183)\n\n\n6.3.0\n\n [New] Add support for RFC 1738 (#174, #173)\n [New] stringify: Add serializeDate option to customize Date serialization (#159)\n [Fix] ensure utils.merge handles merging two arrays\n [Refactor] only constructors should be capitalized\n [Refactor] capitalized var names are for constructors only\n [Refactor] avoid using a sparse array\n [Robustness] formats: cache String#replace\n [Dev Deps] update browserify, eslint, @ljharb/eslint-config; add safe-publish-latest\n [Tests] up to node v6.8, v4.6; improve test matrix\n [Tests] flesh out arrayLimit/arrayFormat tests (#107)\n [Tests] skip Object.create tests when null objects are not available\n [Tests] Turn on eslint for test files (#175)\n\n\n6.2.3\n\n [Fix] follow allowPrototypes option during merge (#201, #200)\n [Fix] chmod a-x\n [Fix] support keys starting with brackets (#202, #200)\n [Tests] up to node v7.7, v6.10, v4.8; disable osx builds since they block linux builds\n\n\n6.2.2\n\n [Fix] ensure that allowPrototypes: false does not ever shadow Object.prototype properties\n\n\n6.2.1\n\n [Fix] ensure key[]=x&key[]&key[]=y results in 3, not 2, values\n [Refactor] Be explicit and use Object.prototype.hasOwnProperty.call\n [Tests] remove parallelshell since it does not reliably report failures\n [Tests] up to node v6.3, v5.12\n [Dev Deps] update tape, eslint, @ljharb/eslint-config, qs-iconv\n\n\n6.2.0\n\n [New] pass Buffers to the encoder/decoder directly (#161)\n [New] add “encoder” and “decoder” options, for custom param encoding/decoding (#160)\n [Fix] fix compacting of nested sparse arrays (#150)\n\n\n**6.1.2\n\n [Fix] follow allowPrototypes option during merge (#201, #200)\n [Fix] chmod a-x\n [Fix] support keys starting with brackets (#202, #200)\n [Tests] up to node v7.7, v6.10, v4.8; disable osx builds since they block linux builds\n\n\n6.1.1\n\n [Fix] ensure that allowPrototypes: false does not ever shadow Object.prototype properties\n\n\n6.1.0\n\n [New] allowDots option for stringify (#151)\n [Fix] “sort” option should work at a depth of 3 or more (#151)\n [Fix] Restore dist directory; will be removed in v7 (#148)\n\n\n6.0.4\n\n [Fix] follow allowPrototypes option during merge (#201, #200)\n [Fix] chmod a-x\n [Fix] support keys starting with brackets (#202, #200)\n [Tests] up to node v7.7, v6.10, v4.8; disable osx builds since they block linux builds\n\n\n6.0.3\n\n [Fix] ensure that allowPrototypes: false does not ever shadow Object.prototype properties\n [Fix] Restore dist directory; will be removed in v7 (#148)\n\n\n6.0.2\n\n Revert ES6 requirement and restore support for node down to v0.8.\n\n\n6.0.1\n\n #127 Fix engines definition in package.json\n\n\n6.0.0\n\n #124 Use ES6 and drop support for node < v4\n\n\n5.2.1\n\n [Fix] ensure key[]=x&key[]&key[]=y results in 3, not 2, values\n\n\n5.2.0\n\n #64 Add option to sort object keys in the query string\n\n\n5.1.0\n\n #117 make URI encoding stringified results optional\n #106 Add flag skipNulls to optionally skip null values in stringify\n\n\n5.0.0\n\n #114 default allowDots to false\n #100 include dist to npm\n\n\n4.0.0\n\n #98 make returning plain objects and allowing prototype overwriting properties optional\n\n\n3.1.0\n\n #89 Add option to disable “Transform dot notation to bracket notation”\n\n\n3.0.0\n\n #80 qs.parse silently drops properties\n #77 Perf boost\n #60 Add explicit option to disable array parsing\n #74 Bad parse when turning array into object\n #81 Add a filter option\n #68 Fixed issue with recursion and passing strings into objects.\n #66 Add mixed array and object dot notation support Closes: #47\n #76 RFC 3986\n #85 No equal sign\n #84 update license attribute\n\n\n2.4.1\n\n #73 Property ‘hasOwnProperty’ of object # is not a function\n\n\n2.4.0\n\n #70 Add arrayFormat option\n\n\n2.3.3\n\n #59 make sure array indexes are >= 0, closes #57\n #58 make qs usable for browser loader\n\n\n2.3.2\n\n #55 allow merging a string into an object\n\n\n2.3.1\n\n #52 Return “undefined” and “false” instead of throwing “TypeError”.\n\n\n2.3.0\n\n #50 add option to omit array indices, closes #46\n\n\n2.2.5\n\n #39 Is there an alternative to Buffer.isBuffer?\n #49 refactor utils.merge, fixes #45\n #41 avoid browserifying Buffer, for #39\n\n\n2.2.4\n\n #38 how to handle object keys beginning with a number\n\n\n2.2.3\n\n #37 parser discards first empty value in array\n #36 Update to lab 4.x\n\n\n2.2.2\n\n #33 Error when plain object in a value\n #34 use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty\n #24 Changelog? Semver?\n\n\n2.2.1\n\n #32 account for circular references properly, closes #31\n #31 qs.parse stackoverflow on circular objects\n\n\n2.2.0\n\n #26 Don’t use Buffer global if it’s not present\n #30 Bug when merging non-object values into arrays\n #29 Don’t call Utils.clone at the top of Utils.merge\n #23 Ability to not limit parameters?\n\n\n2.1.0\n\n #22 Enable using a RegExp as delimiter\n\n\n2.0.0\n\n #18 Why is there arrayLimit?\n #20 Configurable parametersLimit\n #21 make all limits optional, for #18, for #20\n\n\n1.2.2\n\n #19 Don’t overwrite null values\n\n\n1.2.1\n\n #16 ignore non-string delimiters\n #15 Close code block\n\n\n1.2.0\n\n #12 Add optional delim argument\n #13 fix #11: flattened keys in array are now correctly parsed\n\n\n1.1.0\n\n #7 Empty values of a POST array disappear after being submitted\n #9 Should not omit equals signs (=) when value is null\n #6 Minor grammar fix in README\n\n\n1.0.2\n\n #5 array holes incorrectly copied into object on large index\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/qs/CHANGELOG.html" }, { "title": "1.2.1 / 2019-05-10", "excerpt": "\n", "content": "1.2.1 / 2019-05-10\n\n\n Improve error when str is not a string\n\n\n1.2.0 / 2016-06-01\n\n\n Add combine option to combine overlapping ranges\n\n\n1.1.0 / 2016-05-13\n\n\n Fix incorrectly returning -1 when there is at least one valid range\n perf: remove internal function\n\n\n1.0.3 / 2015-10-29\n\n\n perf: enable strict mode\n\n\n1.0.2 / 2014-09-08\n\n\n Support Node.js 0.6\n\n\n1.0.1 / 2014-09-07\n\n\n Move repository to jshttp\n\n\n1.0.0 / 2013-12-11\n\n\n Add repository to package.json\n Add MIT license\n\n\n0.0.4 / 2012-06-17\n\n\n Change ret -1 for unsatisfiable and -2 when invalid\n\n\n0.0.3 / 2012-06-17\n\n\n Fix last-byte-pos default to len - 1\n\n\n0.0.2 / 2012-06-14\n\n\n Add .type\n\n\n0.0.1 / 2012-06-11\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/range-parser/HISTORY.html" }, { "title": "2.4.0 / 2019-04-17", "excerpt": "\n", "content": "2.4.0 / 2019-04-17\n\n\n deps: bytes@3.1.0\n \n Add petabyte (pb) support\n \n \n deps: http-errors@1.7.2\n \n Set constructor name when possible\n deps: setprototypeof@1.1.1\n deps: statuses@’>= 1.5.0 < 2’\n \n \n deps: iconv-lite@0.4.24\n \n Added encoding MIK\n \n \n\n\n2.3.3 / 2018-05-08\n\n\n deps: http-errors@1.6.3\n \n deps: depd@~1.1.2\n deps: setprototypeof@1.1.0\n deps: statuses@’>= 1.3.1 < 2’\n \n \n deps: iconv-lite@0.4.23\n \n Fix loading encoding with year appended\n Fix deprecation warnings on Node.js 10+\n \n \n\n\n2.3.2 / 2017-09-09\n\n\n deps: iconv-lite@0.4.19\n \n Fix ISO-8859-1 regression\n Update Windows-1255\n \n \n\n\n2.3.1 / 2017-09-07\n\n\n deps: bytes@3.0.0\n deps: http-errors@1.6.2\n \n deps: depd@1.1.1\n \n \n perf: skip buffer decoding on overage chunk\n\n\n2.3.0 / 2017-08-04\n\n\n Add TypeScript definitions\n Use http-errors for standard emitted errors\n deps: bytes@2.5.0\n deps: iconv-lite@0.4.18\n \n Add support for React Native\n Add a warning if not loaded as utf-8\n Fix CESU-8 decoding in Node.js 8\n Improve speed of ISO-8859-1 encoding\n \n \n\n\n2.2.0 / 2017-01-02\n\n\n deps: iconv-lite@0.4.15\n \n Added encoding MS-31J\n Added encoding MS-932\n Added encoding MS-936\n Added encoding MS-949\n Added encoding MS-950\n Fix GBK/GB18030 handling of Euro character\n \n \n\n\n2.1.7 / 2016-06-19\n\n\n deps: bytes@2.4.0\n perf: remove double-cleanup on happy path\n\n\n2.1.6 / 2016-03-07\n\n\n deps: bytes@2.3.0\n \n Drop partial bytes on all parsed units\n Fix parsing byte string that looks like hex\n \n \n\n\n2.1.5 / 2015-11-30\n\n\n deps: bytes@2.2.0\n deps: iconv-lite@0.4.13\n\n\n2.1.4 / 2015-09-27\n\n\n Fix masking critical errors from iconv-lite\n deps: iconv-lite@0.4.12\n \n Fix CESU-8 decoding in Node.js 4.x\n \n \n\n\n2.1.3 / 2015-09-12\n\n\n Fix sync callback when attaching data listener causes sync read\n \n Node.js 0.10 compatibility issue\n \n \n\n\n2.1.2 / 2015-07-05\n\n\n Fix error stack traces to skip makeError\n deps: iconv-lite@0.4.11\n \n Add encoding CESU-8\n \n \n\n\n2.1.1 / 2015-06-14\n\n\n Use unpipe module for unpiping requests\n\n\n2.1.0 / 2015-05-28\n\n\n deps: iconv-lite@0.4.10\n \n Improved UTF-16 endianness detection\n Leading BOM is now removed when decoding\n The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails\n \n \n\n\n2.0.2 / 2015-05-21\n\n\n deps: bytes@2.1.0\n \n Slight optimizations\n \n \n\n\n2.0.1 / 2015-05-10\n\n\n Fix a false-positive when unpiping in Node.js 0.8\n\n\n2.0.0 / 2015-05-08\n\n\n Return a promise without callback instead of thunk\n deps: bytes@2.0.1\n \n units no longer case sensitive when parsing\n \n \n\n\n1.3.4 / 2015-04-15\n\n\n Fix hanging callback if request aborts during read\n deps: iconv-lite@0.4.8\n \n Add encoding alias UNICODE-1-1-UTF-7\n \n \n\n\n1.3.3 / 2015-02-08\n\n\n deps: iconv-lite@0.4.7\n \n Gracefully support enumerables on Object.prototype\n \n \n\n\n1.3.2 / 2015-01-20\n\n\n deps: iconv-lite@0.4.6\n \n Fix rare aliases of single-byte encodings\n \n \n\n\n1.3.1 / 2014-11-21\n\n\n deps: iconv-lite@0.4.5\n \n Fix Windows-31J and X-SJIS encoding support\n \n \n\n\n1.3.0 / 2014-07-20\n\n\n Fully unpipe the stream on error\n \n Fixes Cannot switch to old mode now error on Node.js 0.10+\n \n \n\n\n1.2.3 / 2014-07-20\n\n\n deps: iconv-lite@0.4.4\n \n Added encoding UTF-7\n \n \n\n\n1.2.2 / 2014-06-19\n\n\n Send invalid encoding error to callback\n\n\n1.2.1 / 2014-06-15\n\n\n deps: iconv-lite@0.4.3\n \n Added encodings UTF-16BE and UTF-16 with BOM\n \n \n\n\n1.2.0 / 2014-06-13\n\n\n Passing string as options interpreted as encoding\n Support all encodings from iconv-lite\n\n\n1.1.7 / 2014-06-12\n\n\n use string_decoder module from npm\n\n\n1.1.6 / 2014-05-27\n\n\n check encoding for old streams1\n support node.js < 0.10.6\n\n\n1.1.5 / 2014-05-14\n\n\n bump bytes\n\n\n1.1.4 / 2014-04-19\n\n\n allow true as an option\n bump bytes\n\n\n1.1.3 / 2014-03-02\n\n\n fix case when length=null\n\n\n1.1.2 / 2013-12-01\n\n\n be less strict on state.encoding check\n\n\n1.1.1 / 2013-11-27\n\n\n add engines\n\n\n1.1.0 / 2013-11-27\n\n\n add err.statusCode and err.type\n allow for encoding option to be true\n pause the stream instead of dumping on error\n throw if the stream’s encoding is set\n\n\n1.0.1 / 2013-11-19\n\n\n dont support streams1, throw if dev set encoding\n\n\n1.0.0 / 2013-11-17\n\n\n rename expected option to length\n\n\n0.2.0 / 2013-11-15\n\n\n republish\n\n\n0.1.1 / 2013-11-15\n\n\n use bytes\n\n\n0.1.0 / 2013-11-11\n\n\n generator support\n\n\n0.0.3 / 2013-10-10\n\n\n update repo\n\n\n0.0.2 / 2013-09-14\n\n\n dump stream on bad headers\n listen to events after defining received and buffers\n\n\n0.0.1 / 2013-09-14\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/raw-body/HISTORY.html" }, { "title": "Porting to the Buffer.from/Buffer.alloc API", "excerpt": "\n", "content": "Porting to the Buffer.from/Buffer.alloc API\n\n\nOverview\n\n\n Variant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x. (recommended)\n Variant 2: Use a polyfill\n Variant 3: manual detection, with safeguards\n\n\nFinding problematic bits of code using grep\n\nJust run grep -nrE '[^a-zA-Z](Slow)?Buffer\\s*\\(' --exclude-dir node_modules.\n\nIt will find all the potentially unsafe places in your own code (with some considerably unlikely\nexceptions).\n\nFinding problematic bits of code using Node.js 8\n\nIf you’re using Node.js ≥ 8.0.0 (which is recommended), Node.js exposes multiple options that help with finding the relevant pieces of code:\n\n\n --trace-warnings will make Node.js show a stack trace for this warning and other warnings that are printed by Node.js.\n --trace-deprecation does the same thing, but only for deprecation warnings.\n --pending-deprecation will show more types of deprecation warnings. In particular, it will show the Buffer() deprecation warning, even on Node.js 8.\n\n\nYou can set these flags using an environment variable:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n$ export NODE_OPTIONS='--trace-warnings --pending-deprecation'\n$ cat example.js\n'use strict';\nconst foo = new Buffer('foo');\n$ node example.js\n(node:7147) [DEP0005] DeprecationWarning: The Buffer() and new Buffer() constructors are not recommended for use due to security and usability concerns. Please use the new Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() construction methods instead.\n at showFlaggedDeprecation (buffer.js:127:13)\n at new Buffer (buffer.js:148:3)\n at Object.<anonymous> (/path/to/example.js:2:13)\n [... more stack trace lines ...]\n\n\nFinding problematic bits of code using linters\n\nEslint rules no-buffer-constructor\nor\nnode/no-deprecated-api\nalso find calls to deprecated Buffer() API. Those rules are included in some pre-sets.\n\nThere is a drawback, though, that it doesn’t always\nwork correctly when Buffer is\noverriden e.g. with a polyfill, so recommended is a combination of this and some other method\ndescribed above.\n\n\nVariant 1: Drop support for Node.js ≤ 4.4.x and 5.0.0 — 5.9.x.\n\nThis is the recommended solution nowadays that would imply only minimal overhead.\n\nThe Node.js 5.x release line has been unsupported since July 2016, and the Node.js 4.x release line reaches its End of Life in April 2018 (→ Schedule). This means that these versions of Node.js will not receive any updates, even in case of security issues, so using these release lines should be avoided, if at all possible.\n\nWhat you would do in this case is to convert all new Buffer() or Buffer() calls to use Buffer.alloc() or Buffer.from(), in the following way:\n\n\n For new Buffer(number), replace it with Buffer.alloc(number).\n For new Buffer(string) (or new Buffer(string, encoding)), replace it with Buffer.from(string) (or Buffer.from(string, encoding)).\n For all other combinations of arguments (these are much rarer), also replace new Buffer(...arguments) with Buffer.from(...arguments).\n\n\nNote that Buffer.alloc() is also faster on the current Node.js versions than\nnew Buffer(size).fill(0), which is what you would otherwise need to ensure zero-filling.\n\nEnabling eslint rule no-buffer-constructor\nor\nnode/no-deprecated-api\nis recommended to avoid accidential unsafe Buffer API usage.\n\nThere is also a JSCodeshift codemod\nfor automatically migrating Buffer constructors to Buffer.alloc() or Buffer.from().\nNote that it currently only works with cases where the arguments are literals or where the\nconstructor is invoked with two arguments.\n\nIf you currently support those older Node.js versions and dropping them would be a semver-major change\nfor you, or if you support older branches of your packages, consider using Variant 2\nor Variant 3 on older branches, so people using those older branches will also receive\nthe fix. That way, you will eradicate potential issues caused by unguarded Buffer API usage and\nyour users will not observe a runtime deprecation warning when running your code on Node.js 10.\n\n\nVariant 2: Use a polyfill\n\nUtilize safer-buffer as a polyfill to support older\nNode.js versions.\n\nYou would take exacly the same steps as in Variant 1, but with a polyfill\nconst Buffer = require('safer-buffer').Buffer in all files where you use the new Buffer api.\n\nMake sure that you do not use old new Buffer API — in any files where the line above is added,\nusing old new Buffer() API will throw. It will be easy to notice that in CI, though.\n\nAlternatively, you could use buffer-from and/or\nbuffer-alloc ponyfills —\nthose are great, the only downsides being 4 deps in the tree and slightly more code changes to\nmigrate off them (as you would be using e.g. Buffer.from under a different name). If you need only\nBuffer.from polyfilled — buffer-from alone which comes with no extra dependencies.\n\nAlternatively, you could use safe-buffer — it also\nprovides a polyfill, but takes a different approach which has\nit’s drawbacks. It will allow you\nto also use the older new Buffer() API in your code, though — but that’s arguably a benefit, as\nit is problematic, can cause issues in your code, and will start emitting runtime deprecation\nwarnings starting with Node.js 10.\n\nNote that in either case, it is important that you also remove all calls to the old Buffer\nAPI manually — just throwing in safe-buffer doesn’t fix the problem by itself, it just provides\na polyfill for the new API. I have seen people doing that mistake.\n\nEnabling eslint rule no-buffer-constructor\nor\nnode/no-deprecated-api\nis recommended.\n\nDon’t forget to drop the polyfill usage once you drop support for Node.js < 4.5.0.\n\n\nVariant 3 — manual detection, with safeguards\n\nThis is useful if you create Buffer instances in only a few places (e.g. one), or you have your own\nwrapper around them.\n\nBuffer(0)\n\nThis special case for creating empty buffers can be safely replaced with Buffer.concat([]), which\nreturns the same result all the way down to Node.js 0.8.x.\n\nBuffer(notNumber)\n\nBefore:\n\n1\nvar buf = new Buffer(notNumber, encoding);\n\n\nAfter:\n\n1\n2\n3\n4\n5\n6\n7\n8\nvar buf;\nif (Buffer.from && Buffer.from !== Uint8Array.from) {\n buf = Buffer.from(notNumber, encoding);\n} else {\n if (typeof notNumber === 'number')\n throw new Error('The \"size\" argument must be of type number.');\n buf = new Buffer(notNumber, encoding);\n}\n\n\nencoding is optional.\n\nNote that the typeof notNumber before new Buffer is required (for cases when notNumber argument is not\nhard-coded) and is not caused by the deprecation of Buffer constructor — it’s exactly why the\nBuffer constructor is deprecated. Ecosystem packages lacking this type-check caused numereous\nsecurity issues — situations when unsanitized user input could end up in the Buffer(arg) create\nproblems ranging from DoS to leaking sensitive information to the attacker from the process memory.\n\nWhen notNumber argument is hardcoded (e.g. literal \"abc\" or [0,1,2]), the typeof check can\nbe omitted.\n\nAlso note that using TypeScript does not fix this problem for you — when libs written in\nTypeScript are used from JS, or when user input ends up there — it behaves exactly as pure JS, as\nall type checks are translation-time only and are not present in the actual JS code which TS\ncompiles to.\n\nBuffer(number)\n\nFor Node.js 0.10.x (and below) support:\n\n1\n2\n3\n4\n5\n6\n7\nvar buf;\nif (Buffer.alloc) {\n buf = Buffer.alloc(number);\n} else {\n buf = new Buffer(number);\n buf.fill(0);\n}\n\n\nOtherwise (Node.js ≥ 0.12.x):\n\n1\nconst buf = Buffer.alloc ? Buffer.alloc(number) : new Buffer(number).fill(0);\n\n\nRegarding Buffer.allocUnsafe\n\nBe extra cautious when using Buffer.allocUnsafe:\n\n Don’t use it if you don’t have a good reason to\n \n e.g. you probably won’t ever see a performance difference for small buffers, in fact, those\nmight be even faster with Buffer.alloc(),\n if your code is not in the hot code path — you also probably won’t notice a difference,\n keep in mind that zero-filling minimizes the potential risks.\n \n \n If you use it, make sure that you never return the buffer in a partially-filled state,\n \n if you are writing to it sequentially — always truncate it to the actuall written length\n \n \n\n\nErrors in handling buffers allocated with Buffer.allocUnsafe could result in various issues,\nranged from undefined behaviour of your code to sensitive data (user input, passwords, certs)\nleaking to the remote attacker.\n\nNote that the same applies to new Buffer usage without zero-filling, depending on the Node.js\nversion (and lacking type checks also adds DoS to the list of potential problems).\n\n\nFAQ\n\n\nWhat is wrong with the Buffer constructor?\n\nThe Buffer constructor could be used to create a buffer in many different ways:\n\n\n new Buffer(42) creates a Buffer of 42 bytes. Before Node.js 8, this buffer contained\narbitrary memory for performance reasons, which could include anything ranging from\nprogram source code to passwords and encryption keys.\n new Buffer('abc') creates a Buffer that contains the UTF-8-encoded version of\nthe string 'abc'. A second argument could specify another encoding: For example,\nnew Buffer(string, 'base64') could be used to convert a Base64 string into the original\nsequence of bytes that it represents.\n There are several other combinations of arguments.\n\n\nThis meant that, in code like var buffer = new Buffer(foo);, it is not possible to tell\nwhat exactly the contents of the generated buffer are without knowing the type of foo.\n\nSometimes, the value of foo comes from an external source. For example, this function\ncould be exposed as a service on a web server, converting a UTF-8 string into its Base64 form:\n\n1\n2\n3\n4\n5\n6\nfunction stringToBase64(req, res) {\n // The request body should have the format of `{ string: 'foobar' }`\n const rawBytes = new Buffer(req.body.string)\n const encoded = rawBytes.toString('base64')\n res.end({ encoded: encoded })\n}\n\n\nNote that this code does not validate the type of req.body.string:\n\n\n req.body.string is expected to be a string. If this is the case, all goes well.\n req.body.string is controlled by the client that sends the request.\n If req.body.string is the number 50, the rawBytes would be 50 bytes:\n \n Before Node.js 8, the content would be uninitialized\n After Node.js 8, the content would be 50 bytes with the value 0\n \n \n\n\nBecause of the missing type check, an attacker could intentionally send a number\nas part of the request. Using this, they can either:\n\n\n Read uninitialized memory. This will leak passwords, encryption keys and other\nkinds of sensitive information. (Information leak)\n Force the program to allocate a large amount of memory. For example, when specifying\n500000000 as the input value, each request will allocate 500MB of memory.\nThis can be used to either exhaust the memory available of a program completely\nand make it crash, or slow it down significantly. (Denial of Service)\n\n\nBoth of these scenarios are considered serious security issues in a real-world\nweb server context.\n\nwhen using Buffer.from(req.body.string) instead, passing a number will always\nthrow an exception instead, giving a controlled behaviour that can always be\nhandled by the program.\n\n\nThe Buffer() constructor has been deprecated for a while. Is this really an issue?\n\nSurveys of code in the npm ecosystem have shown that the Buffer() constructor is still\nwidely used. This includes new code, and overall usage of such code has actually been\nincreasing.\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/safer-buffer/Porting-Buffer.html" }, { "title": "0.17.1 / 2019-05-10", "excerpt": "\n", "content": "0.17.1 / 2019-05-10\n\n\n Set stricter CSP header in redirect & error responses\n deps: range-parser@~1.2.1\n\n\n0.17.0 / 2019-05-03\n\n\n deps: http-errors@~1.7.2\n \n Set constructor name when possible\n Use toidentifier module to make class names\n deps: depd@~1.1.2\n deps: setprototypeof@1.1.1\n deps: statuses@’>= 1.5.0 < 2’\n \n \n deps: mime@1.6.0\n \n Add extensions for JPEG-2000 images\n Add new font/* types from IANA\n Add WASM mapping\n Update .bdoc to application/bdoc\n Update .bmp to image/bmp\n Update .m4a to audio/mp4\n Update .rtf to application/rtf\n Update .wav to audio/wav\n Update .xml to application/xml\n Update generic extensions to application/octet-stream:\n.deb, .dll, .dmg, .exe, .iso, .msi\n Use mime-score module to resolve extension conflicts\n \n \n deps: ms@2.1.1\n \n Add week/w support\n Fix negative number handling\n \n \n deps: statuses@~1.5.0\n perf: remove redundant path.normalize call\n\n\n0.16.2 / 2018-02-07\n\n\n Fix incorrect end tag in default error & redirects\n deps: depd@~1.1.2\n \n perf: remove argument reassignment\n \n \n deps: encodeurl@~1.0.2\n \n Fix encoding % as last character\n \n \n deps: statuses@~1.4.0\n\n\n0.16.1 / 2017-09-29\n\n\n Fix regression in edge-case behavior for empty path\n\n\n0.16.0 / 2017-09-27\n\n\n Add immutable option\n Fix missing </html> in default error & redirects\n Use instance methods on steam to check for listeners\n deps: mime@1.4.1\n \n Add 70 new types for file extensions\n Set charset as “UTF-8” for .js and .json\n \n \n perf: improve path validation speed\n\n\n0.15.6 / 2017-09-22\n\n\n deps: debug@2.6.9\n perf: improve If-Match token parsing\n\n\n0.15.5 / 2017-09-20\n\n\n deps: etag@~1.8.1\n \n perf: replace regular expression with substring\n \n \n deps: fresh@0.5.2\n \n Fix handling of modified headers with invalid dates\n perf: improve ETag match loop\n perf: improve If-None-Match token parsing\n \n \n\n\n0.15.4 / 2017-08-05\n\n\n deps: debug@2.6.8\n deps: depd@~1.1.1\n \n Remove unnecessary Buffer loading\n \n \n deps: http-errors@~1.6.2\n \n deps: depd@1.1.1\n \n \n\n\n0.15.3 / 2017-05-16\n\n\n deps: debug@2.6.7\n \n deps: ms@2.0.0\n \n \n deps: ms@2.0.0\n\n\n0.15.2 / 2017-04-26\n\n\n deps: debug@2.6.4\n \n Fix DEBUG_MAX_ARRAY_LENGTH\n deps: ms@0.7.3\n \n \n deps: ms@1.0.0\n\n\n0.15.1 / 2017-03-04\n\n\n Fix issue when Date.parse does not return NaN on invalid date\n Fix strict violation in broken environments\n\n\n0.15.0 / 2017-02-25\n\n\n Support If-Match and If-Unmodified-Since headers\n Add res and path arguments to directory event\n Remove usage of res._headers private field\n \n Improves compatibility with Node.js 8 nightly\n \n \n Send complete HTML document in redirect & error responses\n Set default CSP header in redirect & error responses\n Use res.getHeaderNames() when available\n Use res.headersSent when available\n deps: debug@2.6.1\n \n Allow colors in workers\n Deprecated DEBUG_FD environment variable set to 3 or higher\n Fix error when running under React Native\n Use same color for same namespace\n deps: ms@0.7.2\n \n \n deps: etag@~1.8.0\n deps: fresh@0.5.0\n \n Fix false detection of no-cache request directive\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n perf: delay reading header values until needed\n perf: enable strict mode\n perf: hoist regular expressions\n perf: remove duplicate conditional\n perf: remove unnecessary boolean coercions\n perf: skip checking modified time if ETag check failed\n perf: skip parsing If-None-Match when no ETag header\n perf: use Date.parse instead of new Date\n \n \n deps: http-errors@~1.6.1\n \n Make message property enumerable for HttpErrors\n deps: setprototypeof@1.0.3\n \n \n\n\n0.14.2 / 2017-01-23\n\n\n deps: http-errors@~1.5.1\n \n deps: inherits@2.0.3\n deps: setprototypeof@1.0.2\n deps: statuses@’>= 1.3.1 < 2’\n \n \n deps: ms@0.7.2\n deps: statuses@~1.3.1\n\n\n0.14.1 / 2016-06-09\n\n\n Fix redirect error when path contains raw non-URL characters\n Fix redirect when path starts with multiple forward slashes\n\n\n0.14.0 / 2016-06-06\n\n\n Add acceptRanges option\n Add cacheControl option\n Attempt to combine multiple ranges into single range\n Correctly inherit from Stream class\n Fix Content-Range header in 416 responses when using start/end options\n Fix Content-Range header missing from default 416 responses\n Ignore non-byte Range headers\n deps: http-errors@~1.5.0\n \n Add HttpError export, for err instanceof createError.HttpError\n Support new code 421 Misdirected Request\n Use setprototypeof module to replace __proto__ setting\n deps: inherits@2.0.1\n deps: statuses@’>= 1.3.0 < 2’\n perf: enable strict mode\n \n \n deps: range-parser@~1.2.0\n \n Fix incorrectly returning -1 when there is at least one valid range\n perf: remove internal function\n \n \n deps: statuses@~1.3.0\n \n Add 421 Misdirected Request\n perf: enable strict mode\n \n \n perf: remove argument reassignment\n\n\n0.13.2 / 2016-03-05\n\n\n Fix invalid Content-Type header when send.mime.default_type unset\n\n\n0.13.1 / 2016-01-16\n\n\n deps: depd@~1.1.0\n \n Support web browser loading\n perf: enable strict mode\n \n \n deps: destroy@~1.0.4\n \n perf: enable strict mode\n \n \n deps: escape-html@~1.0.3\n \n perf: enable strict mode\n perf: optimize string replacement\n perf: use faster string coercion\n \n \n deps: range-parser@~1.0.3\n \n perf: enable strict mode\n \n \n\n\n0.13.0 / 2015-06-16\n\n\n Allow Node.js HTTP server to set Date response header\n Fix incorrectly removing Content-Location on 304 response\n Improve the default redirect response headers\n Send appropriate headers on default error response\n Use http-errors for standard emitted errors\n Use statuses instead of http module for status messages\n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n \n Improve stat performance by removing hashing\n \n \n deps: fresh@0.3.0\n \n Add weak ETag matching support\n \n \n deps: on-finished@~2.3.0\n \n Add defined behavior for HTTP CONNECT requests\n Add defined behavior for HTTP Upgrade requests\n deps: ee-first@1.1.1\n \n \n perf: enable strict mode\n perf: remove unnecessary array allocations\n\n\n0.12.3 / 2015-05-13\n\n\n deps: debug@~2.2.0\n \n deps: ms@0.7.1\n \n \n deps: depd@~1.0.1\n deps: etag@~1.6.0\n Improve support for JXcore\n Support “fake” stats objects in environments without fs\n deps: ms@0.7.1\n \n Prevent extraordinarily long inputs\n \n \n deps: on-finished@~2.2.1\n\n\n0.12.2 / 2015-03-13\n\n\n Throw errors early for invalid extensions or index options\n deps: debug@~2.1.3\n \n Fix high intensity foreground color for bold\n deps: ms@0.7.0\n \n \n\n\n0.12.1 / 2015-02-17\n\n\n Fix regression sending zero-length files\n\n\n0.12.0 / 2015-02-16\n\n\n Always read the stat size from the file\n Fix mutating passed-in options\n deps: mime@1.3.4\n\n\n0.11.1 / 2015-01-20\n\n\n Fix root path disclosure\n\n\n0.11.0 / 2015-01-05\n\n\n deps: debug@~2.1.1\n deps: etag@~1.5.1\n \n deps: crc@3.2.1\n \n \n deps: ms@0.7.0\n \n Add milliseconds\n Add msecs\n Add secs\n Add mins\n Add hrs\n Add yrs\n \n \n deps: on-finished@~2.2.0\n\n\n0.10.1 / 2014-10-22\n\n\n deps: on-finished@~2.1.1\n \n Fix handling of pipelined requests\n \n \n\n\n0.10.0 / 2014-10-15\n\n\n deps: debug@~2.1.0\n \n Implement DEBUG_FD env variable support\n \n \n deps: depd@~1.0.0\n deps: etag@~1.5.0\n \n Improve string performance\n Slightly improve speed for weak ETags over 1KB\n \n \n\n\n0.9.3 / 2014-09-24\n\n\n deps: etag@~1.4.0\n \n Support “fake” stats objects\n \n \n\n\n0.9.2 / 2014-09-15\n\n\n deps: depd@0.4.5\n deps: etag@~1.3.1\n deps: range-parser@~1.0.2\n\n\n0.9.1 / 2014-09-07\n\n\n deps: fresh@0.2.4\n\n\n0.9.0 / 2014-09-07\n\n\n Add lastModified option\n Use etag to generate ETag header\n deps: debug@~2.0.0\n\n\n0.8.5 / 2014-09-04\n\n\n Fix malicious path detection for empty string path\n\n\n0.8.4 / 2014-09-04\n\n\n Fix a path traversal issue when using root\n\n\n0.8.3 / 2014-08-16\n\n\n deps: destroy@1.0.3\n \n renamed from dethroy\n \n \n deps: on-finished@2.1.0\n\n\n0.8.2 / 2014-08-14\n\n\n Work around fd leak in Node.js 0.10 for fs.ReadStream\n deps: dethroy@1.0.2\n\n\n0.8.1 / 2014-08-05\n\n\n Fix extensions behavior when file already has extension\n\n\n0.8.0 / 2014-08-05\n\n\n Add extensions option\n\n\n0.7.4 / 2014-08-04\n\n\n Fix serving index files without root dir\n\n\n0.7.3 / 2014-07-29\n\n\n Fix incorrect 403 on Windows and Node.js 0.11\n\n\n0.7.2 / 2014-07-27\n\n\n deps: depd@0.4.4\n \n Work-around v8 generating empty stack traces\n \n \n\n\n0.7.1 / 2014-07-26\n\n\n deps: depd@0.4.3\n \n Fix exception when global Error.stackTraceLimit is too low\n \n \n\n\n0.7.0 / 2014-07-20\n\n\n Deprecate hidden option; use dotfiles option\n Add dotfiles option\n deps: debug@1.0.4\n deps: depd@0.4.2\n \n Add TRACE_DEPRECATION environment variable\n Remove non-standard grey color from color output\n Support --no-deprecation argument\n Support --trace-deprecation argument\n \n \n\n\n0.6.0 / 2014-07-11\n\n\n Deprecate from option; use root option\n Deprecate send.etag() – use etag in options\n Deprecate send.hidden() – use hidden in options\n Deprecate send.index() – use index in options\n Deprecate send.maxage() – use maxAge in options\n Deprecate send.root() – use root in options\n Cap maxAge value to 1 year\n deps: debug@1.0.3\n \n Add support for multiple wildcards in namespaces\n \n \n\n\n0.5.0 / 2014-06-28\n\n\n Accept string for maxAge (converted by ms)\n Add headers event\n Include link in default redirect response\n Use EventEmitter.listenerCount to count listeners\n\n\n0.4.3 / 2014-06-11\n\n\n Do not throw un-catchable error on file open race condition\n Use escape-html for HTML escaping\n deps: debug@1.0.2\n \n fix some debugging output colors on node.js 0.8\n \n \n deps: finished@1.2.2\n deps: fresh@0.2.2\n\n\n0.4.2 / 2014-06-09\n\n\n fix “event emitter leak” warnings\n deps: debug@1.0.1\n deps: finished@1.2.1\n\n\n0.4.1 / 2014-06-02\n\n\n Send max-age in Cache-Control in correct format\n\n\n0.4.0 / 2014-05-27\n\n\n Calculate ETag with md5 for reduced collisions\n Fix wrong behavior when index file matches directory\n Ignore stream errors after request ends\n \n Goodbye EBADF, read\n \n \n Skip directories in index file search\n deps: debug@0.8.1\n\n\n0.3.0 / 2014-04-24\n\n\n Fix sending files with dots without root set\n Coerce option types\n Accept API options in options object\n Set etags to “weak”\n Include file path in etag\n Make “Can’t set headers after they are sent.” catchable\n Send full entity-body for multi range requests\n Default directory access to 403 when index disabled\n Support multiple index paths\n Support “If-Range” header\n Control whether to generate etags\n deps: mime@1.2.11\n\n\n0.2.0 / 2014-01-29\n\n\n update range-parser and fresh\n\n\n0.1.4 / 2013-08-11\n\n\n update fresh\n\n\n0.1.3 / 2013-07-08\n\n\n Revert “Fix fd leak”\n\n\n0.1.2 / 2013-07-03\n\n\n Fix fd leak\n\n\n0.1.0 / 2012-08-25\n\n\n add options parameter to send() that is passed to fs.createReadStream() [kanongil]\n\n\n0.0.4 / 2012-08-16\n\n\n allow custom “Accept-Ranges” definition\n\n\n0.0.3 / 2012-07-16\n\n\n fix normalization of the root directory. Closes #3\n\n\n0.0.2 / 2012-07-09\n\n\n add passing of req explicitly for now (YUCK)\n\n\n0.0.1 / 2010-01-03\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/send/HISTORY.html" }, { "title": "1.14.1 / 2019-05-10", "excerpt": "\n", "content": "1.14.1 / 2019-05-10\n\n\n Set stricter CSP header in redirect response\n deps: send@0.17.1\n \n deps: range-parser@~1.2.1\n \n \n\n\n1.14.0 / 2019-05-07\n\n\n deps: parseurl@~1.3.3\n deps: send@0.17.0\n \n deps: http-errors@~1.7.2\n deps: mime@1.6.0\n deps: ms@2.1.1\n deps: statuses@~1.5.0\n perf: remove redundant path.normalize call\n \n \n\n\n1.13.2 / 2018-02-07\n\n\n Fix incorrect end tag in redirects\n deps: encodeurl@~1.0.2\n \n Fix encoding % as last character\n \n \n deps: send@0.16.2\n \n deps: depd@~1.1.2\n deps: encodeurl@~1.0.2\n deps: statuses@~1.4.0\n \n \n\n\n1.13.1 / 2017-09-29\n\n\n Fix regression when root is incorrectly set to a file\n deps: send@0.16.1\n\n\n1.13.0 / 2017-09-27\n\n\n deps: send@0.16.0\n \n Add 70 new types for file extensions\n Add immutable option\n Fix missing </html> in default error & redirects\n Set charset as “UTF-8” for .js and .json\n Use instance methods on steam to check for listeners\n deps: mime@1.4.1\n perf: improve path validation speed\n \n \n\n\n1.12.6 / 2017-09-22\n\n\n deps: send@0.15.6\n \n deps: debug@2.6.9\n perf: improve If-Match token parsing\n \n \n perf: improve slash collapsing\n\n\n1.12.5 / 2017-09-21\n\n\n deps: parseurl@~1.3.2\n \n perf: reduce overhead for full URLs\n perf: unroll the “fast-path” RegExp\n \n \n deps: send@0.15.5\n \n Fix handling of modified headers with invalid dates\n deps: etag@~1.8.1\n deps: fresh@0.5.2\n \n \n\n\n1.12.4 / 2017-08-05\n\n\n deps: send@0.15.4\n \n deps: debug@2.6.8\n deps: depd@~1.1.1\n deps: http-errors@~1.6.2\n \n \n\n\n1.12.3 / 2017-05-16\n\n\n deps: send@0.15.3\n \n deps: debug@2.6.7\n \n \n\n\n1.12.2 / 2017-04-26\n\n\n deps: send@0.15.2\n \n deps: debug@2.6.4\n \n \n\n\n1.12.1 / 2017-03-04\n\n\n deps: send@0.15.1\n \n Fix issue when Date.parse does not return NaN on invalid date\n Fix strict violation in broken environments\n \n \n\n\n1.12.0 / 2017-02-25\n\n\n Send complete HTML document in redirect response\n Set default CSP header in redirect response\n deps: send@0.15.0\n \n Fix false detection of no-cache request directive\n Fix incorrect result when If-None-Match has both * and ETags\n Fix weak ETag matching to match spec\n Remove usage of res._headers private field\n Support If-Match and If-Unmodified-Since headers\n Use res.getHeaderNames() when available\n Use res.headersSent when available\n deps: debug@2.6.1\n deps: etag@~1.8.0\n deps: fresh@0.5.0\n deps: http-errors@~1.6.1\n \n \n\n\n1.11.2 / 2017-01-23\n\n\n deps: send@0.14.2\n \n deps: http-errors@~1.5.1\n deps: ms@0.7.2\n deps: statuses@~1.3.1\n \n \n\n\n1.11.1 / 2016-06-10\n\n\n Fix redirect error when req.url contains raw non-URL characters\n deps: send@0.14.1\n\n\n1.11.0 / 2016-06-07\n\n\n Use status code 301 for redirects\n deps: send@0.14.0\n \n Add acceptRanges option\n Add cacheControl option\n Attempt to combine multiple ranges into single range\n Correctly inherit from Stream class\n Fix Content-Range header in 416 responses when using start/end options\n Fix Content-Range header missing from default 416 responses\n Ignore non-byte Range headers\n deps: http-errors@~1.5.0\n deps: range-parser@~1.2.0\n deps: statuses@~1.3.0\n perf: remove argument reassignment\n \n \n\n\n1.10.3 / 2016-05-30\n\n\n deps: send@0.13.2\n \n Fix invalid Content-Type header when send.mime.default_type unset\n \n \n\n\n1.10.2 / 2016-01-19\n\n\n deps: parseurl@~1.3.1\n \n perf: enable strict mode\n \n \n\n\n1.10.1 / 2016-01-16\n\n\n deps: escape-html@~1.0.3\n \n perf: enable strict mode\n perf: optimize string replacement\n perf: use faster string coercion\n \n \n deps: send@0.13.1\n \n deps: depd@~1.1.0\n deps: destroy@~1.0.4\n deps: escape-html@~1.0.3\n deps: range-parser@~1.0.3\n \n \n\n\n1.10.0 / 2015-06-17\n\n\n Add fallthrough option\n \n Allows declaring this middleware is the final destination\n Provides better integration with Express patterns\n \n \n Fix reading options from options prototype\n Improve the default redirect response headers\n deps: escape-html@1.0.2\n deps: send@0.13.0\n \n Allow Node.js HTTP server to set Date response header\n Fix incorrectly removing Content-Location on 304 response\n Improve the default redirect response headers\n Send appropriate headers on default error response\n Use http-errors for standard emitted errors\n Use statuses instead of http module for status messages\n deps: escape-html@1.0.2\n deps: etag@~1.7.0\n deps: fresh@0.3.0\n deps: on-finished@~2.3.0\n perf: enable strict mode\n perf: remove unnecessary array allocations\n \n \n perf: enable strict mode\n perf: remove argument reassignment\n\n\n1.9.3 / 2015-05-14\n\n\n deps: send@0.12.3\n \n deps: debug@~2.2.0\n deps: depd@~1.0.1\n deps: etag@~1.6.0\n deps: ms@0.7.1\n deps: on-finished@~2.2.1\n \n \n\n\n1.9.2 / 2015-03-14\n\n\n deps: send@0.12.2\n \n Throw errors early for invalid extensions or index options\n deps: debug@~2.1.3\n \n \n\n\n1.9.1 / 2015-02-17\n\n\n deps: send@0.12.1\n \n Fix regression sending zero-length files\n \n \n\n\n1.9.0 / 2015-02-16\n\n\n deps: send@0.12.0\n \n Always read the stat size from the file\n Fix mutating passed-in options\n deps: mime@1.3.4\n \n \n\n\n1.8.1 / 2015-01-20\n\n\n Fix redirect loop in Node.js 0.11.14\n deps: send@0.11.1\n \n Fix root path disclosure\n \n \n\n\n1.8.0 / 2015-01-05\n\n\n deps: send@0.11.0\n \n deps: debug@~2.1.1\n deps: etag@~1.5.1\n deps: ms@0.7.0\n deps: on-finished@~2.2.0\n \n \n\n\n1.7.2 / 2015-01-02\n\n\n Fix potential open redirect when mounted at root\n\n\n1.7.1 / 2014-10-22\n\n\n deps: send@0.10.1\n \n deps: on-finished@~2.1.1\n \n \n\n\n1.7.0 / 2014-10-15\n\n\n deps: send@0.10.0\n \n deps: debug@~2.1.0\n deps: depd@~1.0.0\n deps: etag@~1.5.0\n \n \n\n\n1.6.5 / 2015-02-04\n\n\n Fix potential open redirect when mounted at root\n \n Back-ported from v1.7.2\n \n \n\n\n1.6.4 / 2014-10-08\n\n\n Fix redirect loop when index file serving disabled\n\n\n1.6.3 / 2014-09-24\n\n\n deps: send@0.9.3\n \n deps: etag@~1.4.0\n \n \n\n\n1.6.2 / 2014-09-15\n\n\n deps: send@0.9.2\n \n deps: depd@0.4.5\n deps: etag@~1.3.1\n deps: range-parser@~1.0.2\n \n \n\n\n1.6.1 / 2014-09-07\n\n\n deps: send@0.9.1\n \n deps: fresh@0.2.4\n \n \n\n\n1.6.0 / 2014-09-07\n\n\n deps: send@0.9.0\n \n Add lastModified option\n Use etag to generate ETag header\n deps: debug@~2.0.0\n \n \n\n\n1.5.4 / 2014-09-04\n\n\n deps: send@0.8.5\n \n Fix a path traversal issue when using root\n Fix malicious path detection for empty string path\n \n \n\n\n1.5.3 / 2014-08-17\n\n\n deps: send@0.8.3\n\n\n1.5.2 / 2014-08-14\n\n\n deps: send@0.8.2\n \n Work around fd leak in Node.js 0.10 for fs.ReadStream\n \n \n\n\n1.5.1 / 2014-08-09\n\n\n Fix parsing of weird req.originalUrl values\n deps: parseurl@~1.3.0\n deps: utils-merge@1.0.0\n\n\n1.5.0 / 2014-08-05\n\n\n deps: send@0.8.1\n \n Add extensions option\n \n \n\n\n1.4.4 / 2014-08-04\n\n\n deps: send@0.7.4\n \n Fix serving index files without root dir\n \n \n\n\n1.4.3 / 2014-07-29\n\n\n deps: send@0.7.3\n \n Fix incorrect 403 on Windows and Node.js 0.11\n \n \n\n\n1.4.2 / 2014-07-27\n\n\n deps: send@0.7.2\n \n deps: depd@0.4.4\n \n \n\n\n1.4.1 / 2014-07-26\n\n\n deps: send@0.7.1\n \n deps: depd@0.4.3\n \n \n\n\n1.4.0 / 2014-07-21\n\n\n deps: parseurl@~1.2.0\n \n Cache URLs based on original value\n Remove no-longer-needed URL mis-parse work-around\n Simplify the “fast-path” RegExp\n \n \n deps: send@0.7.0\n \n Add dotfiles option\n deps: debug@1.0.4\n deps: depd@0.4.2\n \n \n\n\n1.3.2 / 2014-07-11\n\n\n deps: send@0.6.0\n \n Cap maxAge value to 1 year\n deps: debug@1.0.3\n \n \n\n\n1.3.1 / 2014-07-09\n\n\n deps: parseurl@~1.1.3\n \n faster parsing of href-only URLs\n \n \n\n\n1.3.0 / 2014-06-28\n\n\n Add setHeaders option\n Include HTML link in redirect response\n deps: send@0.5.0\n \n Accept string for maxAge (converted by ms)\n \n \n\n\n1.2.3 / 2014-06-11\n\n\n deps: send@0.4.3\n \n Do not throw un-catchable error on file open race condition\n Use escape-html for HTML escaping\n deps: debug@1.0.2\n deps: finished@1.2.2\n deps: fresh@0.2.2\n \n \n\n\n1.2.2 / 2014-06-09\n\n\n deps: send@0.4.2\n \n fix “event emitter leak” warnings\n deps: debug@1.0.1\n deps: finished@1.2.1\n \n \n\n\n1.2.1 / 2014-06-02\n\n\n use escape-html for escaping\n deps: send@0.4.1\n \n Send max-age in Cache-Control in correct format\n \n \n\n\n1.2.0 / 2014-05-29\n\n\n deps: send@0.4.0\n \n Calculate ETag with md5 for reduced collisions\n Fix wrong behavior when index file matches directory\n Ignore stream errors after request ends\n Skip directories in index file search\n deps: debug@0.8.1\n \n \n\n\n1.1.0 / 2014-04-24\n\n\n Accept options directly to send module\n deps: send@0.3.0\n\n\n1.0.4 / 2014-04-07\n\n\n Resolve relative paths at middleware setup\n Use parseurl to parse the URL from request\n\n\n1.0.3 / 2014-03-20\n\n\n Do not rely on connect-like environments\n\n\n1.0.2 / 2014-03-06\n\n\n deps: send@0.2.0\n\n\n1.0.1 / 2014-03-05\n\n\n Add mime export for back-compat\n\n\n1.0.0 / 2014-03-05\n\n\n Genesis from connect\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/serve-static/HISTORY.html" }, { "title": "1.5.0 / 2018-03-27", "excerpt": "\n", "content": "1.5.0 / 2018-03-27\n\n\n Add 103 Early Hints\n\n\n1.4.0 / 2017-10-20\n\n\n Add STATUS_CODES export\n\n\n1.3.1 / 2016-11-11\n\n\n Fix return type in JSDoc\n\n\n1.3.0 / 2016-05-17\n\n\n Add 421 Misdirected Request\n perf: enable strict mode\n\n\n1.2.1 / 2015-02-01\n\n\n Fix message for status 451\n \n 451 Unavailable For Legal Reasons\n \n \n\n\n1.2.0 / 2014-09-28\n\n\n Add 208 Already Repored\n Add 226 IM Used\n Add 306 (Unused)\n Add 415 Unable For Legal Reasons\n Add 508 Loop Detected\n\n\n1.1.1 / 2014-09-24\n\n\n Add missing 308 to codes.json\n\n\n1.1.0 / 2014-09-21\n\n\n Add codes.json for universal support\n\n\n1.0.4 / 2014-08-20\n\n\n Package cleanup\n\n\n1.0.3 / 2014-06-08\n\n\n Add 308 to .redirect category\n\n\n1.0.2 / 2014-03-13\n\n\n Add .retry category\n\n\n1.0.1 / 2014-03-12\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/statuses/HISTORY.html" }, { "title": "1.6.18 / 2019-04-26", "excerpt": "\n", "content": "1.6.18 / 2019-04-26\n\n\n Fix regression passing request object to typeis.is\n\n\n1.6.17 / 2019-04-25\n\n\n deps: mime-types@~2.1.24\n \n Add Apple file extensions from IANA\n Add extension .csl to application/vnd.citationstyles.style+xml\n Add extension .es to application/ecmascript\n Add extension .nq to application/n-quads\n Add extension .nt to application/n-triples\n Add extension .owl to application/rdf+xml\n Add extensions .siv and .sieve to application/sieve\n Add extensions from IANA for image/* types\n Add extensions from IANA for model/* types\n Add extensions to HEIC image types\n Add new mime types\n Add text/mdx with extension .mdx\n \n \n perf: prevent internal throw on invalid type\n\n\n1.6.16 / 2018-02-16\n\n\n deps: mime-types@~2.1.18\n \n Add application/raml+yaml with extension .raml\n Add application/wasm with extension .wasm\n Add text/shex with extension .shex\n Add extensions for JPEG-2000 images\n Add extensions from IANA for message/* types\n Add extension .mjs to application/javascript\n Add extension .wadl to application/vnd.sun.wadl+xml\n Add extension .gz to application/gzip\n Add glTF types and extensions\n Add new mime types\n Update extensions .md and .markdown to be text/markdown\n Update font MIME types\n Update text/hjson to registered application/hjson\n \n \n\n\n1.6.15 / 2017-03-31\n\n\n deps: mime-types@~2.1.15\n \n Add new mime types\n \n \n\n\n1.6.14 / 2016-11-18\n\n\n deps: mime-types@~2.1.13\n \n Add new mime types\n \n \n\n\n1.6.13 / 2016-05-18\n\n\n deps: mime-types@~2.1.11\n \n Add new mime types\n \n \n\n\n1.6.12 / 2016-02-28\n\n\n deps: mime-types@~2.1.10\n \n Add new mime types\n Fix extension of application/dash+xml\n Update primary extension for audio/mp4\n \n \n\n\n1.6.11 / 2016-01-29\n\n\n deps: mime-types@~2.1.9\n \n Add new mime types\n \n \n\n\n1.6.10 / 2015-12-01\n\n\n deps: mime-types@~2.1.8\n \n Add new mime types\n \n \n\n\n1.6.9 / 2015-09-27\n\n\n deps: mime-types@~2.1.7\n \n Add new mime types\n \n \n\n\n1.6.8 / 2015-09-04\n\n\n deps: mime-types@~2.1.6\n \n Add new mime types\n \n \n\n\n1.6.7 / 2015-08-20\n\n\n Fix type error when given invalid type to match against\n deps: mime-types@~2.1.5\n \n Add new mime types\n \n \n\n\n1.6.6 / 2015-07-31\n\n\n deps: mime-types@~2.1.4\n \n Add new mime types\n \n \n\n\n1.6.5 / 2015-07-16\n\n\n deps: mime-types@~2.1.3\n \n Add new mime types\n \n \n\n\n1.6.4 / 2015-07-01\n\n\n deps: mime-types@~2.1.2\n \n Add new mime types\n \n \n perf: enable strict mode\n perf: remove argument reassignment\n\n\n1.6.3 / 2015-06-08\n\n\n deps: mime-types@~2.1.1\n \n Add new mime types\n \n \n perf: reduce try block size\n perf: remove bitwise operations\n\n\n1.6.2 / 2015-05-10\n\n\n deps: mime-types@~2.0.11\n \n Add new mime types\n \n \n\n\n1.6.1 / 2015-03-13\n\n\n deps: mime-types@~2.0.10\n \n Add new mime types\n \n \n\n\n1.6.0 / 2015-02-12\n\n\n fix false-positives in hasBody Transfer-Encoding check\n support wildcard for both type and subtype (*/*)\n\n\n1.5.7 / 2015-02-09\n\n\n fix argument reassignment\n deps: mime-types@~2.0.9\n \n Add new mime types\n \n \n\n\n1.5.6 / 2015-01-29\n\n\n deps: mime-types@~2.0.8\n \n Add new mime types\n \n \n\n\n1.5.5 / 2014-12-30\n\n\n deps: mime-types@~2.0.7\n \n Add new mime types\n Fix missing extensions\n Fix various invalid MIME type entries\n Remove example template MIME types\n deps: mime-db@~1.5.0\n \n \n\n\n1.5.4 / 2014-12-10\n\n\n deps: mime-types@~2.0.4\n \n Add new mime types\n deps: mime-db@~1.3.0\n \n \n\n\n1.5.3 / 2014-11-09\n\n\n deps: mime-types@~2.0.3\n \n Add new mime types\n deps: mime-db@~1.2.0\n \n \n\n\n1.5.2 / 2014-09-28\n\n\n deps: mime-types@~2.0.2\n \n Add new mime types\n deps: mime-db@~1.1.0\n \n \n\n\n1.5.1 / 2014-09-07\n\n\n Support Node.js 0.6\n deps: media-typer@0.3.0\n deps: mime-types@~2.0.1\n \n Support Node.js 0.6\n \n \n\n\n1.5.0 / 2014-09-05\n\n\n fix hasbody to be true for content-length: 0\n\n\n1.4.0 / 2014-09-02\n\n\n update mime-types\n\n\n1.3.2 / 2014-06-24\n\n\n use ~ range on mime-types\n\n\n1.3.1 / 2014-06-19\n\n\n fix global variable leak\n\n\n1.3.0 / 2014-06-19\n\n\n \n improve type parsing\n\n \n invalid media type never matches\n media type not case-sensitive\n extra LWS does not affect results\n \n \n\n\n1.2.2 / 2014-06-19\n\n\n fix behavior on unknown type argument\n\n\n1.2.1 / 2014-06-03\n\n\n switch dependency from mime to mime-types@1.0.0\n\n\n1.2.0 / 2014-05-11\n\n\n \n support suffix matching:\n\n \n +json matches application/vnd+json\n */vnd+json matches application/vnd+json\n application/*+json matches application/vnd+json\n \n \n\n\n1.1.0 / 2014-04-12\n\n\n add non-array values support\n \n expose internal utilities:\n\n \n .is()\n .hasBody()\n .normalize()\n .match()\n \n \n\n\n1.0.1 / 2014-03-30\n\n\n add multipart as a shorthand\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/type-is/HISTORY.html" }, { "title": "1.0.0 / 2015-06-14", "excerpt": "\n", "content": "1.0.0 / 2015-06-14\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/unpipe/HISTORY.html" }, { "title": "1.1.2 / 2017-09-23", "excerpt": "\n", "content": "1.1.2 / 2017-09-23\n\n\n perf: improve header token parsing speed\n\n\n1.1.1 / 2017-03-20\n\n\n perf: hoist regular expression\n\n\n1.1.0 / 2015-09-29\n\n\n Only accept valid field names in the field argument\n \n Ensures the resulting string is a valid HTTP header value\n \n \n\n\n1.0.1 / 2015-07-08\n\n\n Fix setting empty header from empty field\n perf: enable strict mode\n perf: remove argument reassignments\n\n\n1.0.0 / 2014-08-10\n\n\n Accept valid Vary header string as field\n Add vary.append for low-level string manipulation\n Move to jshttp orgainzation\n\n\n0.1.0 / 2014-06-05\n\n\n Support array of fields to set\n\n\n0.0.0 / 2014-06-04\n\n\n Initial release\n\n", "url": "/tema2-async/event-loop/exercises/web-workers/node_modules/vary/HISTORY.html" }, { "title": "Handling Events", "excerpt": "\n", "content": "Handling Events\n\n\n Eloquent JS. Chapter 14: Handling Events\n \n Repo ULL-ESIT-MII-CA-1718/ejs-chapter14-handling-events con ejemplos y ejercicios\n \n \n SitePoint Article: How to Create Custom Events in JavaScript\n\n\n", "url": "/tema2-async/handling-events.html" }, { "title": "Generators and Iterators", "excerpt": "\n", "content": "Generators and Iterators\n\n\n Generators\n Async iterators and generators\n Javascript.info: The Modern JavaScript Tutorial. Chapter Generators, advanced iteration\n\n", "url": "/tema2-async/iterators-and-generators.html" }, { "title": "Capítulo 2: Message Queues", "excerpt": "\n", "content": "Capítulo 2: Message Queues\n\n0MQ\n\n Building Distributed Systems with Node.js and ØMQ Jim Wilson Talk\n Using ZeroMQ with Node.js\n Repo Connecting Robust Microservices\n GitHub Repo ULL-MII-CA-1819/nodejs-the-right-way Chapter 4: Connecting Robust Microservices\n\n\nPrácticas\n\n\n Descripción de la práctica Connecting Robust Microservices (p6-t2-microservices)\n\n\nRabbitMQ\n\n Part 1: RabbitMQ for beginners - What is RabbitMQ?\n Part 2.2: Getting started with RabbitMQ and Node.js\n CloudAMQP with Node.js Getting started\n Repo ULL-MII-CA-1819/rabbit-mq-learning with my experience with RabbitMQ\n\n", "url": "/tema2-async/message-queues.html" }, { "title": "Módulos en ECMA5", "excerpt": "\n", "content": "Módulos en ECMA5\n\n\n Módulos en ECMA5. Eloquent JS. Capítulo 10\n \n Repo de Ejemplo del Capítulo 10\n Repo de Ejemplo del Capítulo 10: Sección Require\n Repo de Ejemplo del Capítulo 10: Sección Slow-loading modules\n \n \n ECMA5. The revealing module pattern: Again with the Module Pattern – reveal something to the world\n JavaScript Module Systems Showdown: CommonJS vs AMD vs ES2015\n\n", "url": "/tema2-async/modulos-ecma5.html" }, { "title": "Reto Async Serialize", "excerpt": "\n", "content": "Reto Async Serialize\n\nSe dispone de una función loadScript que permite la carga de un script:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n\n\nQue puede ser usada así:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n<!DOCTYPE html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Document</title>\n </head>\n <body>\n <p id=\"out\"></p>\n <script>\n 'use strict';\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n \n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n \n document.head.append(script);\n }\n \n loadScript('script-1.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Cool!, the script '${script.src}' is loaded: \"${hello()}\"`;\n out.innerHTML = message;\n console.log(message);\n\n loadScript('script-2.js', (error, script) => {\n if (error) {\n console.error( error ); \n } else {\n const message = `Great!, the script '${script.src}' is loaded: \"${world()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n loadScript('script-3.js', (error, script) => {\n if (error) {\n console.error( error );\n } else {\n const message = `Unbelievable!, the script '${script.src}' is loaded: \"${ull()}\"`;\n out.innerHTML += `<br/>${message}`;\n console.log(message);\n // ...continue after all scripts are loaded \n }\n });\n }\n })\n }\n });\n </script> \n </body> \n</html>\n\n\nPuede encontrar mas detalles en el tutorial https://github.com/ULL-ESIT-PL/async-js-series-webpack.\n\n\n \n Escriba una función loadScripts\n\n 1\n loadScripts(['script-1.js', 'script-2.js', 'script-3.js'], (err, results) => out.innerHTML = results.map(s => s.src).join(\"<br/>\"))\n \n\n que carga los scripts especificados en el array en secuencia y llama a la callback pasada como último argumento bien con un error si lo hubo o con el array de resultados (los scripts).\n \n \n Escriba su propia versión de la función series (con la misma interfaz que su equivalente de Async.js) que resuelva el problema de la secuencialización de las callbacks:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n series(\n [\n cb => loadScript('script-1.js', cb),\n cb => loadScript('script-2.js', cb),\n cb => loadScript('script-3.js', cb)\n ],\n (err, results) => p.innerHTML = results.map(s => s.src).join(\"<br/>\")\n );\n \n \n\n\nObservaciones\n\nSi hace las pruebas de funcionamiento con scripts de similar tamaño la probabilidad de que su algoritmo produzca una salida que respeta el orden especificado es alta, incluso si su algoritmo es erróneo.\n\nPuede simular que los scripts son de distinto tamaño retrasando la iniciación de las cargas con un setTimeout que espere por un número aleatorio de milisegundos:\n\n1\n2\n3\n [~/.../load-script-seq(private)]$ pwd\n/Users/casiano/local/src/javascript/learning/async/load-script-seq\n[~/.../load-script-seq(private)]$ sed -ne '12,23p' load-scripts.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n const ir = (min, max) => Math.round((Math.random() * (max - min) + min))\n let out = document.querySelector('p');\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n setTimeout(() => script.src = src, ir(500,2000));\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n\nReferencias\n\n\n Repo ULL-ESIT-PL/async-js-series-webpack\n A pure ESM version of Async\n Webpack: Getting started\n Webpack devserver\n Solución\n \n \n 1\n2\n [~/.../load-script-seq(private)]$ pwd -P\n /Users/casiano/local/src/javascript/learning/async/load-script-seq\n \n \n \n \n\n", "url": "/tema2-async/practicas/p3-t2-handling-events/reto.html" }, { "title": "Reto 1: Building Promise.all", "excerpt": "\n", "content": "Reto 1: Building Promise.all\n\nGiven an array of promises, Promise.all returns a promise that waits for all of the promises in the array to finish. \nIt then succeeds, yielding an array of result values. \nIf a promise in the array fails, the promise returned by all fails too, with the failure reason from the failing promise.\n\nImplement something like this yourself as a regular function called Promise_all.\n\nRemember that after a promise has succeeded or failed, \nit can’t succeed or fail again, and further calls to the functions that resolve it are ignored. \nThis can simplify the way you handle failure of your promise.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.all</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n function Promise_all(promises) {\n // Fill the code\n }\n\n // Test code.\n Promise_all([]).then(array => {\n console.log('This should be []:', array);\n });\n\n function soon(val) {\n return new Promise(resolve => {\n setTimeout(() => resolve(val), Math.random() * 500);\n });\n }\n\n Promise_all([soon(1), soon(2), soon(3)]).then(array => {\n console.log('This should be [1, 2, 3]:', array);\n });\n\n Promise_all([soon(5), soon(2), soon(\"a\")]).then(array => {\n console.log('This should be [5, 2, \"a\"]:', array);\n });\n\n Promise_all([soon(1), Promise.reject('X'), soon(3)])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (error === 'X') {\n console.log('Rejection correctly managed!')\n } else\n console.log('Unexpected failure:', error);\n });\n\n Promise_all([\n soon(1),\n new Promise(() => { throw (new Error('Muerto!')) }),\n soon(3)\n ])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (/Muerto!/.test(error.message))\n console.log('Exception correctly managed!:');\n }); \n </script>\n</body>\n</html>\n\n\nHints\n\nThe function passed to the Promise constructor will have to call then on each of the promises in the given array. \nWhen one of them succeeds, two things need to happen. \nThe resulting value needs to be stored in the correct position of a result array, and \nwe must check whether this was the last pending promise and finish our own promise if it was.\n\nThe latter can be done with a counter that is initialized to the length of the input array and from which we subtract 1 every time a promise succeeds. \nWhen it reaches 0, we are done. \nMake sure you take into account the situation where the input array is empty (and thus no promise will ever resolve).\n\nHandling failure requires some thought but turns out to be extremely simple. Just pass the reject function of the wrapping promise to each of the promises in the array as a catch handler or as a second argument to then so that a failure in one of them triggers the rejection of the whole wrapper promise.\n\nReto 2: Make a Promise version of fs.readFile\n\nEscriba una versión con promesas readFilePromise de la función fs.readFile que pueda ser usada así:\n\n1\n2\n3\nreadFilePromise(programName, 'utf8')\n .then(data => console.log('Data:\\n'+data))\n .catch(error => console.log('Error:\\n'+error));\n\n\nReto 3: Convert a function that accepts a callback into a function returning a promise\n\nPromisification it’s the conversion of a function that accepts a callback into a function returning a promise.\n\nWrite a function promisify(f) that receives a function fthat accepts a callback\n1\nf( ...args, callback)\n\nand returns a function that returns the equivalent Promise object\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promisify</title>\n</head>\n\n<body>\n <script>\n function promisify(f) {\n // Fill the code\n };\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n let loadScriptPromise = promisify(loadScript);\n\n loadScriptPromise(\"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\").then(\n (r) => alert(\"script loaded\")\n ).catch(alert);\n\n </script>\n</body>\n\n</html>\n\n\nHint: El operador spread ...\n\nPara resolver este problema debe saber un poco del operador spread ...\n\nEste operador permite convertir un número variable de argumentos de una función en un array que puede ser accedido dentro de la misma:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n [~/.../promises/exception-inside-promise(master)]$ node\n Welcome to Node.js v12.10.0.\n Type \".help\" for more information.\n > ff = (...args) => console.log(args)\n [Function: ff]\n > ff(1,\"hello\", {x:4})\n [ 1, 'hello', { x: 4 } ]\n undefined\n > ff()\n []\n undefined\n\n\nPero también permite la operación inversa: convertir un array en una lista de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> arr = [1,2,3]\n[ 1, 2, 3 ]\n> gg = (x,y,z) => console.log(`x = ${x}, y = ${y}, z = ${z}`)\n[Function: gg]\n> gg(arr)\nx = 1,2,3, y = undefined, z = undefined\nundefined\n> gg(...arr)\nx = 1, y = 2, z = 3\nundefined\n\n\nHint: El Método call\n\nEl método call de los objetos Función llama a una función con un primer argumento que es el this y el resto de argumentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n> z = {x:4}\n{ x: 4 }\n> function ff(w) { console.log(this.x+w); }\nundefined\n> ff(2)\nNaN\nundefined\n> ff.call(z, 3)\n7\nundefined\n\n", "url": "/tema2-async/practicas/p3-t2-handling-events/reto2.html" }, { "title": "Reto 1 para la práctica p4-t2-networking", "excerpt": "\n", "content": "Reto 1 para la práctica p4-t2-networking\n\nEscriba un servidor que permita un chat  donde los clientes se conectan\nvia telnet o netcat.\n\nCuando se arranca el sevidor debe decir algo como esto:\n\n1\n2\nserver$ node chat-server.js \nServer listening at http://localhost:8000\n\n\nDespués si se conecta un cliente, debe recibir un mensaje de bienvenida:\n\n1\n2\n1$ nc localhost 8000\nWelcome to telnet chat!\n\n\nEn la consola del server debe reflejarse que un cliente se ha conectado:\n\n1\n2\n3\nserver$ node chat-server.js \nServer listening at http://localhost:8000\nGuest1 joined this chat.\n\n\nSi desde otra terminal se conecta otro cliente …\n\n1\n2\n2$ nc localhost 8000\nWelcome to telnet chat!\n\n\ny un cliente escribe algo …\n\n1\n2\n3\n4\n1$ nc localhost 8000\nWelcome to telnet chat!\nGuest2 joined this chat.\nhello all!\n\n\ndebe reflejarse en el resto de los clientes:\n\n1\n2\n3\n2$ nc localhost 8000\nWelcome to telnet chat!\nGuest1> hello all!\n\n\nasí como en la consola del server:\n\n1\n2\n3\n4\n5\nserver$ node chat-server.js \nServer listening at http://localhost:8000\nGuest1 joined this chat.\nGuest2 joined this chat.\nGuest1> hello all!\n\n\nTips\n\n\n \n Es conveniente tener un array sockets en el que se guarden los sockets \ncreados para los clientes que están conectados\n\n 1\nlet sockets = [];\n \n \n \n Le será de ayuda una función broadcast que envía un messageque acaba \nde llegar de un cliente al resto de los clientes:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\nfunction broadcast(from, message) {\n // If there are no sockets, then don't broadcast any messages\n if (sockets.length !== 0) {\n // If there are clients remaining then broadcast message\n sockets.forEach((socket, index, array) => {\n // Dont send any messages to the sender\n ...\n });\n }\n};\n \n\n \n Documentación de forEach\n \n \n \n Cada vez que un cliente se desconecta deberemos eliminar el socket de dicho cliente\ndel array sockets\n \n Documentación de splice\n Documentación de indexOf\n \n \n\n\nReto 2: Using Names for the Clients\n\nUna posible extensión del chat anterior es hacer que el cliente al comienzo de la \nconexión indique su nombre:\n\nArrancando el server\n\n1\n2\n[~/.../networking-with-sockets-chapter-3/chat-tcp-server(master)]$ node index.js\nListening on port 4000\n\n\nCliente: Julio Cesar\n\n1\n2\n3\n4\n5\n6\n7\n[~/.../p2-t1-testing-crguezl(master)]$ telnet localhost 4000\nTrying ::1...\nConnected to localhost.\nEscape character is '^]'.\nPlease enter your name (Press twice enter to send the message)\nJulio Cesar\n- Welcome to the Chatbox, There are 1 active users: [Julio Cesar ]\n\n\nCliente: Marco Antonio\n\n1\n2\n3\n4\n5\n6\n7\n8\n[~/.../p1-t1-iaas-Jorge-Acevedo(master)]$ telnet localhost 4000\nTrying ::1...\nConnected to localhost.\nEscape character is '^]'.\nPlease enter your name (Press twice enter to send the message)\nMarco Antonio\n- Welcome to the Chatbox, There are 2 active users: [Julio Cesar ,Marco Antonio ]\nHola Julito!\n\n\n1\n2\n3\n4\n5\n...\nPlease enter your name (Press twice enter to send the message)\nJulio Cesar\n- Welcome to the Chatbox, There are 1 active users: [Julio Cesar ]\n> Marco Antonio : Hola Julito!\n\n\nRecursos para el profesor\n\n\n sol c\n \n Path: /Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3\n \n \n Second solution with user names\n \n Path: /Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3/chat-tcp-server\n \n \n\n", "url": "/tema2-async/practicas/p4-t2-networking/reto.html" }, { "title": "Retos para la práctica p6-t2-microservices", "excerpt": "\n", "content": "Retos para la práctica p6-t2-microservices\n\nReto 1: Granja de Trabajadores\n\nEn el paradigma de paralelismo conocido como Farm o Granja de\nProcesadores la tarea que se quiere realizar es dividida en un subconjunto de sub-tareas \nbastante mayor que el número de procesadores disponibles.\n\n Un procesador denominado maestro o capataz envia las\ntareas a los restantes procesos-trabajadores.\n Tan pronto como un trabajador devuelve el resultado de una subtarea el capataz le envía una\nnueva subtarea.\n El capataz combina el resultado parcial con los que\nhaya obtenido hasta ese momento para ir cosntruyendo la solución a la tarea inicial.\n\n\nUna ventaja que tiene este paradigma es que consigue equilibrar la carga de trabajo entre las máquinas,\n\n independientemente de que estas sean heterogéneas o no,\n independientemente de cual sea la carga dinámica de las estaciones por la presencia\nde otros procesos y usuarios e\n independientemente de que las tareas sean heterogéneas en sus necesidades de tiempo de cómputo.\n\n\nEn el siguiente código mostramos como usar los sockets ROUTER y DEALER de 0MQ junto \ncon los clusters de Node.js para crear un borrador de una granja de trabajadores:\n\nFichero connecting-robust-microservices-chapter-4/microservices/dealer.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n'use strict';\n\nconst PORT = require(\"./port.js\");\nconst ins = require(\"./ins.js\");\nconst cluster = require(\"cluster\");\nconst zmq = require(\"zeromq\");\n\nconst numWorkers = require(\"os\").cpus().length;\n\nconst randomBetween = (min, max) => Math.floor(Math.random() * (max - min) + min);\n\nfunction workerTask() {\n const dealer = zmq.socket('dealer');\n dealer.identity = process.env[\"identity\"]; \n\n console.log(\"identity \"+dealer.identity+\n \" process \"+process.pid+\" port = \"+PORT);\n\n dealer.connect('tcp://localhost:'+PORT);\n\n let total = 0;\n\n const sendMessage = () => dealer.send(['ready']);\n\n // Get workload from broker, until finished\n dealer.on('message', function onMessage(...args) {\n // console.log(\"Inside Worker. args = \"+ins(args.map(x => x.toString())));\n const workload = args[0].toString('utf8');\n //console.log(\"Inside Worker. workload = \"+workload);\n\n if (workload === 'stop') {\n console.log('Completed: '+total+' tasks ('+dealer.identity+' '+process.pid+')');\n dealer.removeListener('message', onMessage);\n // https://nodejs.org/api/events.html#events_emitter_removelistener_eventname_listener is a method of EventsEmitter\n dealer.close();\n return;\n }\n total++;\n\n // Simulate some work\n setTimeout(sendMessage, randomBetween(0, 500));\n });\n\n // Tell the broker we're ready for work\n sendMessage();\n}\n\nfunction main() {\n const broker = zmq.socket('router');\n //broker.bindSync('tcp://*:5671');\n broker.bind('tcp://*:'+PORT);\n\n let endTime = Date.now() + 5000\n , workersFired = 0;\n\n broker.on('message', function (...args) {\n // console.log(\"Inside Master. args = \"+ins(args.map(x => x.toString())));\n const identity = args[0]\n , now = Date.now();\n\n if (now < endTime) {\n broker.send([identity, 'more work']);\n } else {\n broker.send([identity, 'stop']);\n workersFired++;\n if (workersFired === numWorkers) {\n setImmediate(function () { // See https://nodejs.org/api/timers.html#timers_setimmediate_callback_args\n broker.close();\n cluster.disconnect();\n });\n }\n }\n });\n\n for (let i=0;i<numWorkers;i++) {\n cluster.fork({identity: \"worker\"+i});\n }\n}\n\nif (cluster.isMaster) main();\nelse workerTask();\n\n\nObserva que pese a que el worker envía solamente [ 'ready' ]:\n\n1\n2\n3\n4\n const sendMessage = () => dealer.send(['ready']);\n ...\n // Simulate some work\n setTimeout(sendMessage, randomBetween(0, 500));\n\n\nEn el master recibimos como primer elemento la identity del worker:\n\n1\n2\n3\n broker.on('message', function (...args) {\n // console.log(\"Inside Master. args = \"+ins(args.map(x => x.toString())));\n const identity = args[0]\n\nConsultemos la documentación de 0MQ:\n\n\n The ROUTER socket, unlike other sockets, tracks every connection\nit has, and tells the caller about these.\n The way it tells the caller is to stick the connection identity in front of each message\nreceived\n An identity, sometimes called an address, is just a binary\nstring with no meaning except “this is a unique handle to the\nconnection”\n Then, when you send a message via a ROUTER socket, you first send an identity frame.\n\n\nThe zmq_socket() man page describes it thus:\n\n\n When receiving messages a ZMQ_ROUTER socket shall prepend a message part containing the identity of the originating peer to the message before passing it to the application. Messages received are fair-queued from among all connected peers. \nWhen sending messages a ZMQ_ROUTER socket shall remove the first part of the message and use it to determine the identity of the peer the message shall be routed to.\n\n\nCuando ejecuto este programa, obtengo una salida parecida a esta:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n[~/.../microservices(master)]$ node dealer.js \nidentity worker0 process 56820 port = 60300\nidentity worker2 process 56822 port = 60300\nidentity worker3 process 56823 port = 60300\nidentity worker1 process 56821 port = 60300\nCompleted: 24 tasks (worker3 56823)\nCompleted: 22 tasks (worker2 56822)\nCompleted: 19 tasks (worker1 56821)\nCompleted: 18 tasks (worker0 56820)\n\n\nUsando 0MQ y paralelismo de granja, compute en paralelo una aproximación al número π aprovechando la siguiente fórmula:\n\n\\[\\int_{0}^{1} \\frac{4}{(1+x^2)} dx = 4 \\arctan(x) |_{0}^{1}\\ = 4 ( \\frac{\\pi}{4} - 0) = \\pi\\]\n\nPara computar π aproxime la integral mediante sumas de áreas de rectángulos:\n\n\n\n\n El capataz divide el intervalo [0,1] en un número de subintervalos bastante mayor que el número de trabajadores\n El capataz le indicará a cada trabajador para que intervalo debe calcular el área\n El trabajador computa el área haciendo la correspondiente suma de Riemann y la devuelve al capataz,\n El capataz añade dicha subárea al acumulador de área computada.\n El capataz envía un nuevo intervalo al trabajador si quedan intervalos por computar. En caso contrario envía un mensaje de parada.\n\n\nReto 2: Chat\n\nEscriba un chat de línea de comandos - con rooms - usando 0MQ.\n\n\n Use el patrón PUB/SUB.\n Use el “tópico” del patrón PUB/SUB para implantar las rooms\n \n \n En el servidor:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n publisher.send( [\"room-1\", // topic\n JSON.stringify(\n {\n type: \"message\",\n from: user,\n content: content\n }\n )\n ]\n \n \n \n En el cliente:\n\n 1\n2\n3\n4\n5\nsubscriber.on(\"message\", (room, data) => {\n console.log(room.toString());\n const message = JSON.parse(data);\n ...\n});\n \n \n \n \n En el cliente, para la lectura desde teclado use readline. Sigue un ejemplo:\n\n\nFichero local/src/javascript/learning/readline-examples/small-cli.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n const readline = require('readline');\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: 'DSI> '\n });\n\n const bye = () => {\n console.log('Have a great day!');\n process.exit(0);\n };\n\n const methods = {\n hello: () => console.log(\"world\"),\n exit: () => bye(),\n default: (line) => console.log(`Say what? I might have heard '${line.trim()}'`),\n };\n\n rl.prompt();\n\n rl.on('line', (line) => {\n const choice = line.trim();\n if (choice in methods) methods[choice]();\n else methods['default'](line);\n rl.prompt();\n }).on('close', () => bye);\n\n\n El cliente envía sus mensajes al servidor usando un socket 0MQ REQ/REP.\nEl cliente envía su mensaje al servidor como un request JSON indicando la room a la que va dirigida. \nEl servidor, una vez recibe el mensaje en el socket REQ/REP, lo \npublica a los clientes conectados a la room especificada usando el socket PUB/SUB\n\n\n", "url": "/tema2-async/practicas/p6-t2-microservices/reto.html" }, { "title": "Node.js Processes", "excerpt": "\n", "content": "Node.js Processes\n\n\n Chapter Node.js Child Processes from the book Node Beyond the Basics\n How to spawn a child process with Node.js by Flavio\n\n\n", "url": "/tema2-async/processes.html" }, { "title": "Examples of Promises", "excerpt": "\n", "content": "Examples of Promises\n\nEjemplo Sencillo (Chuck Norris jokes service)\n\nlocal/src/uai/uai2015/promise-ejemplo\n\n\n A Gist with a very Simple Example of How to make and use a Promise (Chuck Norris jokes service)\n Also in /Users/casiano/local/src/javascript/learning/promises/sitepoint-tutorial\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\nif(window.Promise){\n console.log('Promise found');\n var promise=new Promise(function(resolve,reject){\n var request = new XMLHttpRequest();\n request.open('GET', 'http://api.icndb.com/jokes/random');\n request.onload = function() {\n if (request.status == 200) {\n resolve(request.response); //we get the data here.So, resolve the Promise\n }\n else {\n reject(Error(request.statusText)); //if status is not 200 OK, reject.\n }\n };\n\n request.onerror = function() {\n reject(Error(\"Error fetching data.\")); //error occurred, reject the Promise\n };\n\n request.send(); //send the request\n });\n\n console.log('Asynchronous request made.');\n\n promise.then(function(data){\n console.log('Got data! Promise fulfilled.');\n document.getElementById('joke').innerHTML=JSON.parse(data).value.joke;\n },function(error){\n console.log('Promise rejected.');\n console.log(error.message);\n });\n\n }\n else\n console.log('Promise not available');\n\n\nOrden. Promises versus callbacks\n\n/apuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/promise-ejemplo/promise-job-queue.js\n\nPromises that resolve before the current function ends will be executed right after the current function.\n\n1\n[~/.../p2-t1-c3-file-system/event-loop/promise-ejemplo/(master)]$ cat promise-job-queue.js \n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nlet promise = new Promise(function(resolve, reject) {\n resolve(1)\n});\n\npromise.then(function(resolve) {console.log(1)});\n\nconsole.log('a');\n\npromise.then(function(resolve) {console.log(2);});\n\nsetTimeout(function() {console.log('h')}, 0);\n\npromise.then(function(resolve) {console.log(3)});\n\nconsole.log('b');\n\n\nFor more see \n\nUnhandled Promise Rejection\n\nunhandled-promise-rejection.js\n\n1\n[~/.../uai2015/promise-ejemplo(master)]$ pwd -P\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n#!/usr/bin/env node\n'use strict';\n\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection:', error.message);\n});\n\nlet p = new Promise((resolve, reject) => reject(new Error('woops')));\n\nsetTimeout(\n () => p.catch(error => console.log('caught', error.message)),\n 1000);\n\n\n1\n2\n3\n4\n[~/.../uai2015/promise-ejemplo(master)]$ ./unhandled-promise-rejection.js\nunhandledRejection: woops\ncaught woops\n(node:25246) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)\n\n", "url": "/tema2-async/promise-examples.html" }, { "title": "Promises chaining", "excerpt": "\n", "content": "Promises chaining\n\nIn frontend programming promises are often used for network requests.\n\nWe’ll use the fetch method to load the information about the user from the remote server. It has a lot of optional parameters covered in separate chapters, but the basic syntax is quite simple:\n\n1\nlet promise = fetch(url);\n\n\nThis makes a network request to the url and returns a promise. \nThe promise resolves with a response object when the remote server responds with headers, but before the full response is downloaded.\n\nTo read the full response, we should call a method response.text(): it returns a promise that resolves when the full text downloaded from the remote server, with that text as a result.\n\n\n See code deployed: simple-request.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n // .then below runs when the remote server responds\n .then(function(response) {\n // response.text() returns a new promise that resolves with the full response text\n // when it loads\n return response.text();\n })\n .then(function(text) {\n // ...and here's the content of the remote file\n alert(text); // {\"name\": \"iliakan\", isAdmin: true}\n });\n</script>\n\nOnce we got the loaded user, we can make one more request to GitHub, load the user profile and show the avatar:\n\n\n See code deployed: github.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n .then(response => response.json())\n .then(user => fetch(`https://api.github.com/users/${user.name}`))\n .then(response => response.json())\n .then(githubUser => new Promise(function(resolve, reject) { // (*)\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n setTimeout(() => {\n img.remove();\n resolve(githubUser); // (**)\n }, 3000);\n }))\n // triggers after 3 seconds\n .then(githubUser => alert(`Finished showing ${githubUser.name}`));\n</script>\n\nFinally, we can split the code into reusable functions:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n<!DOCTYPE html><script>\n 'use strict';\n function loadJson(url) {\n return fetch(url)\n .then(response => response.json());\n }\n \n function loadGithubUser(name) {\n return fetch(`https://api.github.com/users/${name}`)\n .then(response => response.json());\n }\n \n function showAvatar(githubUser) {\n return new Promise(function(resolve, reject) {\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n \n setTimeout(() => {\n img.remove();\n resolve(githubUser);\n }, 3000);\n });\n }\n \n // Use them:\n loadJson('/article/promise-chaining/user.json')\n .then(user => loadGithubUser(user.name))\n .then(showAvatar)\n .then(githubUser => alert(`Finished showing ${githubUser.name}`));\n // ...\n </script>\n\n\nSee the file:\n\n\n solution\n\n\nTasks\n\nPromise: then versus catch\n\nAre these code fragments equal? In other words, do they behave the same way in any circumstances, for any handler functions?\n\n1\n promise.then(f1).catch(f2);\n\n\nVersus:\n\n1\n promise.then(f1, f2);\n\n\nSolution\n", "url": "/tema2-async/promises-chaining-fetch-example.html" }, { "title": "Promises", "excerpt": "\n", "content": "Promises\n\nChapter Promises, async/await of the book The Modern JavaScript Tutorial.\n\nCallbacks Problems\n\n\n javascript.info: Introduction: callbacks\n \n Callback in callback\n Handling errors\n Pyramid of Doom\n \n \n Promises: Basics: https://javascript.info/promise-basics\n \n load-script con promesas\n Chuck Norris jokes example (UAI 2015):\n \n index.html\n script.js\n \n \n \n \n Very Simple Examples of Promises (uai2015)\n\n\nPromise Chaining\n\n\n Promise Chaining\n \n A call to promise.then returns a promise, so that we can call the next .then on it.\n A handler, used in .then(handler) may create and return a promise. In that case further handlers wait until it settles, and then get its result.\n Promises Chaining fetch example\n If a .then (or catch/finally, doesn’t matter) handler returns a promise, the rest of the chain waits until it settles. When it does, its result (or error) is passed further.\n Repo ULL-MII-SYTWS-1920/ull-mii-sytws-1920.github.io: exercises/promises/promise-chaining\n \n \n\n\nError Handling\n\nError handling with promises\n\n1\n2\n[~/.../exception-inside-promise(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/pl1920/apuntes/tema1-introduccion-a-javascript/event-loop/exercises/promises/exception-inside-promise\n\n\nExercises: Exceptions and Promises\n\nPromise API\n\n\n\nPromisification\n\n\n\nMicrotasks\n\nAsync/await\n\nEjercicios\n\n\n Ejercicios de Promesas\n \n load-script con promesas\n Promise.all\n \n \n\n\nPrácticas\n\n\n Descripción de la práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) p7-t2-async-js-edx\n\n\nReferencias\n\n\n Book Understanding ECMAScript 6: Promises and Asynchronous Programming\n Book Exploring ES6: 25. Promises for asynchronous programming\n Curso JavaScript Promises en Udacity\n Book The Modern Javascript Tutorial. Chapter Promises, async/await\n Promises Workshop for JavaScript! Learn to wield promises like a master to write clean asynchronous code GitHub Repo. A Workshopper module that teaches you to use promises in javascript\n Node.js 8: util.promisify() by Dr. Axel Rauschmayer\n Asynchronous Iterators in JavaScript by Tiago Lopes\n EdX: Asynchronous Programming with Javascript EdX Course\n \n GitHub repoULL-MII-CA-1819/async-js\n \n \n\n\n", "url": "/tema2-async/promises.html" }, { "title": "Capítulo 4: RPC", "excerpt": "\n", "content": "Capítulo 4: RPC\n\nIn gRPC a client application can directly call methods on a server application on a different machine as if it was a local object, making it easier for you to create distributed applications and services. As in many RPC systems, gRPC is based around the idea of defining a service, specifying the methods that can be called remotely with their parameters and return types.\n\nOn the server side, the server implements this interface and runs a gRPC server to handle client calls. On the client side, the client has a stub (referred to as just a client in some languages) that provides the same methods as the server.\n\ngRPC clients and servers can run and talk to each other in a variety of environments - from servers inside Google to your own desktop - and can be written in any of gRPC’s supported languages. \nIn addition, the latest Google APIs will have gRPC versions of their interfaces, letting you easily build Google functionality into your applications.\n\n\n Intro to gRPC: A Modern Toolkit for Microservice Communication YouTube\n What is gRPC?\n \n gRPC Documentation\n \n \n\n", "url": "/tema2-async/rpc.html" }, { "title": "Capítulo: Sockets", "excerpt": "\n", "content": "Capítulo: Sockets\n\nSockets TCP y UDP\n\n\n Safari. Chapter 3 Networking with Sockets\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n \n Networking with Sockets\n \n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP:\n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP\n \n \n\n\nPrácticas\n\n\n Descripción de la práctica p4-t2-networking\n\n", "url": "/tema2-async/sockets.html" }, { "title": "Authentication", "excerpt": "\n", "content": "Authentication\n\nSessions y Authentication\n\nVéase la sección Cookies y Autenticación\nen los apuntes del profesor\n\nJSON Web Tokens\n\n\n jwt.io\n JWT Handbook (pdf) Sebastian E. Peyrrot\n Implementar JSON Web Tokens con NodeJS Oscar Blancarte Blog\n \n Construir un API REST con NodeJS (Tercera parte)\n Segunda parte\n Primera Parte\n \n \n\n\nOAuth\n\n\n Introducción a OAuth (Apuntes del profesor)\n \n \n \n \n [What is OAuth2? How does OAuth2 work?\n Tech Primers](https://youtu.be/CPbvxxslDTU) Yotube video\n \n \n \n \n\n\nPassport\n\nPassport: Introducción\n\n\n Passport is authentication middleware for Node.js.\n Extremely flexible and modular, Passport can be unobtrusively dropped in to any Express-based web application.\n A comprehensive set of strategies support authentication using\n \n a username and password,\n Facebook,\n Twitter,\n Strategy Passport-GitHub2. The author of Passport-Github has not maintained the original …\n \n Passport-GitHub2 Example\n \n \n GitHub strategy documentation and repo GitHub,\n and more.\n \n \n\n\nPassport: Tutoriales\n\n\n Example of how to use Express 4.x and Passport to authenticate users using GitHub\n\n\n1\n2\n[~/.../useoctonode/express-4.x-github-example(master)]$ pwd -P\n/Users/casiano/local/src/javascript/learning/useoctonode/express-4.x-github-example\n\n\n GitHub repo demonstrating how to use Express 4.x and Passport to authenticate users using Facebook\n Example of how to use Express 4.x and Passport for authentication with username and password\n Easy Node Authentication: Setup and Local\n Authenticating Node.js Applications With Passport\n \n Repositorio con el código del tutorial\n \n \n Node.js Login System With Passport YouTube video\n \n Part 1\n \n What Is Input Validation and Sanitization?\n Flash Messages: A flash message is used in order to keep a message in session through one or several requests of the same user. By default, it is removed from session after it has been displayed to the user. Flash messages are usually used in combination with HTTP redirections, because in this case there is no view, so messages can only be displayed in the request that follows redirection.\n \n \n Part 2\n Part 3\n \n Passport-local (GitHub module repo)\n Passport Docs: Username & Password\n Passport Docs: Flash Messages\n Bcryptjs at GitHub\n Passport: sessions (serialize/deserialize)\n \n \n GitHub repo\n Fork at ULL-ESIT-CA-1718\n \n \n\n\nPassport: Notas sobre como Configurar una WebApp en Facebook\n\n\n Facebook App Development Guide\n \n Facebook: Register and Configure an App\n \n \n StackOverflow: How to Test Facebook Connect Locally\n \n \n Facebook → Settings → Basic:\n\n write “localhost” in the “App Domains” field then click on “+Add Platform” choose “Web Site”.\n\n After that, in the “Site Url” field write your localhost url \n(e.g.: http://localhost:3000/login/facebook/return).\nThis will allow you to test your facebook plugins locally.\n \n \n \n StackOverflow: Facebook Site URL?\n\n\nPrácticas\n\n\n Práctica: Cookies, Sesiones, Autenticación y Módulos npm (p8-t3-sessions-and-modules)\n\n", "url": "/tema3-web/authentication.html" }, { "title": "Bases de Datos", "excerpt": "\n", "content": "Bases de Datos\n\nBases de Datos Relacionales\n\n\n dbngin\n\n\nSQLite\n\n\n SQLite\n\n\nMySQL\n\n\n MySQL\n\n\nBases de Datos no Relacionales\n\nMongoDB\n\n\n MongoDB\n\n\nSearch Engines\n\nElasticsearch\n\n\n Elasticsearch\n\n", "url": "/tema3-web/bases-de-datos.html" }, { "title": "Cross-Origin Resource Sharing CORS", "excerpt": "\n", "content": "Cross-Origin Resource Sharing CORS\n\nCORS is a security mechanism that allows a web page from one domain or Origin \nto access a resource with a different domain (a cross-domain request).\n\nCORS is a relaxation of the same-origin policy implemented in modern browsers. Without features like CORS, websites are restricted to accessing resources from the same origin through what is known as same-origin policy.\n\nOrigin\n\nOrigin includes the combination of protocol, domain, and port. This means\n\n\n https://api.mydomain.com and\n https://mydomain.com\n\n\nare actually different origins and thus impacted by same-origin policy.\n\nIn a similar way,\n\n http://localhost:9000 and\n http://localhost:8080\n\n\nare also different origins. The path or query parameters are ignored when considering the origin.\n\nThe reason for The Same-Origin Policy\n\nYou, like many websites, may use cookies to keep track of authentication or session info. Those cookies are bounded to a certain domain when they are created. On every HTTP call to that domain, the browser will attach the cookies that were created for that domain. This is on every HTTP call, which could be for static images, HTML pages, or even AJAX calls.\n\nThis means when you log into https://examplebank.com, a cookie is stored for https://examplebank.com. If that bank is a single-page React app, they may have created a REST API at https://examplebank.com/api for the SPA to communicate via AJAX.\n\n\n Let’s say you browse to a malicious website https://evilunicorns.com while logged into https://examplebank.com.\n Without same-origin policy, that hacker website could make authenticated malicious AJAX calls to https://examplebank.com/api to POST /withdraw even though the hacker website doesn’t have direct access to the bank’s cookies.\n\n\nThis is due to the browser behavior of automatically attaching any cookies bounded to https://examplebank.com for any HTTP calls to that domain, including AJAX calls from https://evilunicorns.com to https://examplebank.com.\n\nBy restricting HTTP calls to only ones to the same origin (i.e. the browser tab’s domain), same-origin policy closes some hacker backdoors such as around Cross-Site Request Forgery (CSRF) (Although not all. Mechanisms like CSRF tokens are still necessary).\n\nThe Reasons for Cross-Origin Resource Sharing\n\nThere are legitimate reasons for a website to make cross-origin HTTP requests:\n\n\n Maybe a single-page app at https://mydomain.com needs to make AJAX calls to https://api.mydomain.com;\n or maybe https://mydomain.com incorporates some 3rd party fonts or analytics providers like Google Analytics or MixPanel.\n Cross-Origin Resource Sharing (CORS) enables these cross-domain requests.\n\n\nHow CORS works\n\nThis is how a simple CORS request works:\n\n\n \n A browser tab open to https://www.mydomain.com initiates AJAX request GET https://api.mydomain.com/widgets\n \n \n Along with adding headers like Host, the browser automatically adds the Origin Request Header for cross-origin requests:\n \n\n\n1\n2\n3\n4\n GET /widgets/ HTTP/1.1\n Host: api.mydomain.com\n Origin: https://www.mydomain.com\n [Rest of request...]\n\n\n\n The server checks the Origin request header. If the Origin value is allowed, it sets the Access-Control-Allow-Origin to the value in the request header Origin.\n\n\n1\n2\n3\n4\n HTTP/1.1 200 OK \n Access-Control-Allow-Origin: https://www.mydomain.com \n Content-Type: application/json\n [Rest of response...] \n\n\n When the browser receives the response, the browser checks the Access-Control-Allow-Origin header to see if it matches the origin of the tab. If not, the response is blocked. The check passes such as in this example if either the Access-Control-Allow-Origin matches the single origin exactly or contains the wildcard * operator.\n \n A server that responds Access-Control-Allow-Origin: * allows all origins which can be a large security risk.\n Only use * if your application absolutely requires it such as creating an open/public API.\n \n \n\n\nThe CORS npm module\n\nIf you want to avoid the blocking, the server that hosts the resource needs to have CORS enabled. \nWhat you can do on the client side (and probably what you are thinking of) is set the mode of fetch to CORS\n(although this is the default setting I believe):\n\n1\nfetch(request, {mode: 'cors'});\n\n\nThe mode option specifies the mode you want to use for the request, e.g., cors, no-cors, or same-origin.\n\n With same-origin you can perform requests only to your origin, otherwise the request will result in an error.\n With no-cors, you can perform requests to other origins, even if they don’t set the required CORS headers, but you’ll get an opaque response. An opaque response is for a request made for a resource on a different origin that doesn’t return CORS headers. With an opaque response we won’t be able to read the data returned or view the status of the request, meaning we can’t check if the request was successful or not.\n\n\nHowever this still requires the server to enable CORS as well, and allow your domain to request the resource.\n\nIn Express we can use the module cors\n\n1\n$ npm install cors\n\n\nIf inside the app we use this middleware:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\nvar express = require('express')\nvar cors = require('cors')\nvar app = express()\n\napp.use(cors())\n\napp.get('/products/:id', function (req, res, next) {\n res.json({msg: 'This is CORS-enabled for all origins!'})\n})\n\napp.listen(80, function () {\n console.log('CORS-enabled web server listening on port 80')\n})\n\n\nTo enable CORS for a Single Route we do:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\nvar express = require('express')\nvar cors = require('cors')\nvar app = express()\n\napp.get('/products/:id', cors(), function (req, res, next) {\n res.json({msg: 'This is CORS-enabled for a Single Route'})\n})\n\napp.listen(80, function () {\n console.log('CORS-enabled web server listening on port 80')\n})\n\n\nWe can configure CORS:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\nvar express = require('express')\nvar cors = require('cors')\nvar app = express()\n\nvar corsOptions = {\n origin: 'http://example.com',\n optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204\n}\n\napp.get('/products/:id', cors(corsOptions), function (req, res, next) {\n res.json({msg: 'This is CORS-enabled for only example.com.'})\n})\n\napp.listen(80, function () {\n console.log('CORS-enabled web server listening on port 80')\n})\n\n\nThe origin option used in this example configures the Access-Control-Allow-Origin CORS header. \nPossible values:\n\n\n Boolean - set origin to true to reflect the request origin, as defined by req.header('Origin'), or set it to false to disable CORS.\n String - set origin to a specific origin. For example if you set it to \"http://example.com\" only requests from “http://example.com” will be allowed.\n RegExp - set origin to a regular expression pattern which will be used to test the request origin. If it’s a match, the request origin will be reflected. For example the pattern /example\\.com$/ will reflect any request that is coming from an origin ending with “example.com”.\n Array - set origin to an array of valid origins. Each origin can be a String or a RegExp. For example [\"http://example1.com\", /\\.example2\\.com$/] will accept any request from “http://example1.com” or from a subdomain of “example2.com”.\n Function - set origin to a function implementing some custom logic. The function takes the request origin as the first parameter and a callback (which expects the signature err [object], allow [bool]) as the second.\n\n\nEjemplo: server en ULL-MII-SYTWS-1920/food-lookup-demo\n\nPara entender mejor esta sección \nVéase la rama/branch: 10-crguezl-master-cors-01 del repositorio \nULL-MII-SYTWS-1920/food-lookup-demo\n\nSi en Client-js cambiamos el fetch para solicitar al server en 3001 que es donde escucha nuestro servidor:\n\n1\n2\n3\n4\n5\n6\n7\n8\nfunction search(query, cb) {\n return fetch(`http://localhost:3001/api/food?q=${query}`, {\n accept: \"application/json\"\n })\n .then(checkStatus)\n .then(parseJSON)\n .then(cb);\n}\n\n\nObtenemos una respuesta similar a esta:\n\n\n Access to fetch at http://localhost:3001/api/food?q=r from origin http://localhost:3000 has been blocked by CORS policy:\n\n\n\n No Access-Control-Allow-Origin header is present on the requested resource.\n\n\n\n If an opaque response serves your needs, set the request’s mode to no-cors to fetch the resource with CORS disabled.\n\n\n\n localhost/:1 Uncaught (in promise) TypeError: Failed to fetch\n\n\nUsando el middleware corsarreglamos el problema:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\nconst express = require(\"express\");\nconst fs = require(\"fs\");\nconst sqlite = require(\"sql.js\");\nconst cors = require(\"cors\");\nconst filebuffer = fs.readFileSync(\"db/usda-nnd.sqlite3\");\n\nconst db = new sqlite.Database(filebuffer);\n\nconst app = express();\n\napp.set(\"port\", process.env.PORT || 3001);\n\n// Express only serves static assets in production\nif (process.env.NODE_ENV === \"production\") {\n app.use(express.static(\"client/build\"));\n}\n\nconst COLUMNS = [\n \"carbohydrate_g\",\n \"protein_g\",\n \"fa_sat_g\",\n \"fa_mono_g\",\n \"fa_poly_g\",\n \"kcal\",\n \"description\"\n];\n\nconst corsOptions = {\n origin: 'http://localhost:3000',\n optionsSuccessStatus: 200 // some legacy browsers (IE11, various SmartTVs) choke on 204\n}\n\napp.get(\"/api/food\", cors(corsOptions), (req, res) => {\n const param = req.query.q;\n\n if (!param) {\n res.json({\n error: \"Missing required parameter `q`\"\n });\n return;\n }\n\n // WARNING: Not for production use! The following statement\n // is not protected against SQL injections.\n const r = db.exec(\n `\n select ${COLUMNS.join(\", \")} from entries\n where description like '%${param}%'\n limit 100\n `\n );\n\n if (r[0]) {\n res.json(\n r[0].values.map(entry => {\n const e = {};\n COLUMNS.forEach((c, idx) => {\n // combine fat columns\n if (c.match(/^fa_/)) {\n e.fat_g = e.fat_g || 0.0;\n e.fat_g = (parseFloat(e.fat_g, 10) +\n parseFloat(entry[idx], 10)).toFixed(2);\n } else {\n e[c] = entry[idx];\n }\n });\n return e;\n })\n );\n } else {\n res.json([]);\n }\n});\n\napp.listen(app.get(\"port\"), () => {\n console.log(`Find the server at: http://localhost:${app.get(\"port\")}/`); // eslint-disable-line no-console\n});\n\n\nCORS references\n\n\n Authoritative guide to CORS (Cross-Origin Resource Sharing) for REST APIs\n Using CORS in Express by Alexis Hevia\n \n Repo with examples of use\n \n \n fetch\n \n Referrer Policies\n W3C\n \n \n cors is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options.\n Multiple Ways of API Integration in your JAMStack\n \n Associated GitHub repo https://github.com/cfjedimaster/jamstack_api_approaches\n \n \n\n", "url": "/tema3-web/cors.html" }, { "title": "Capítulo. JavaScript and The Browser", "excerpt": "\n", "content": "Capítulo. JavaScript and The Browser\n\n\n Eloquent JS: JavaScript and the Browser\n\n\nCapítulo. The DOM\n\njavascript.info: Document\n\n\n https://javascript.info/document: DOM\n \n https://javascript.info/loading: Document and resource loading\n https://javascript.info/selection-range: Selection and Range\n https://javascript.info/mutation-observer\n JavaScript and CSS: Coordinates\n \n \n\n\nPráctica del DOM p4-t3-dom\n\n\n Descripción de la práctica p4-t3-dom\n\n\nEloquent JS: The Document Object Model\n\n\n Eloquent JS. Chapter13: The Document Object Model\n \n Repository ULL-ESIT-MII-CA-1718/ejs-chapter13-DOM-examples with examples for Chapter13: The Document Object Model\n Repo ULL-ESIT-MII-CA-1718/the-document-object-model-KevMCh)\n \n \n\n\nEjercicios del DOM\n\n\n Ejercicios del DOM\n\n\nCapítulo. Events\n\n\n https://javascript.info/events: Events\n Eloquent JS: Handling Events\n\n\nCapítulo. Form and Form Fields\n\n\n https://javascript.info/forms-controls: Forms, controls\n Eloquent JS: Forms and Form Fields\n \n Eloquent JS: Forms and Form Fields\n Repo de Ejemplo del Capítulo\n Repo ULL-ESIT-MII-CA-1718/forms-and-form-fields-KevMCh\n \n \n Developer Moxilla. Sending forms through JavaScript\n \n Using FormData bound to a form element\n \n \n\n\n", "url": "/tema3-web/dom.html" }, { "title": "Elasticseach", "excerpt": "\n", "content": "Elasticseach\n\nQue es Elastic Search\n\nElasticsearch es un motor de búsqueda:\n\n Desarrollado en Java\n Open Source\n Distribuido\n Escalable\n Basado en lucene\n\n\nLucene\n\n es una librería que implementa un full-text search engine. No es una aplicación sino una API \nque da capacidades de búsqueda.\n\n\n Desarrollado en Java\n Open Source\n No es Distribuido\n Escalable\n Basado en Índices Invertidos\n\n\nÍndices Invertidos\n\nAn inverted index (also referred to as a postings file or inverted file) is a database index storing a mapping from content, such as words or numbers, to its locations in a table, or in a document or a set of documents (named in contrast to a forward index, which maps from documents to content). The purpose of an inverted index is to allow fast full-text searches, at a cost of increased processing when a document is added to the database.\n\n\n\nLa idea es parecida a los índices de referencias cruzadas que habitualmente aparecen al final de los libros.\n\n\n Ventajas\n \n Velocidad de Búsqueda\n Facilidad para aplicar algoritmos de relevancia\n Facilidad para aplicar analizadores de texto\n \n \n Desventajas\n \n Velocidad de indexación\n Algunas búsquedas son mas costosas (por ejemplo el Not lógico)\n \n \n\n\nFuncionalidades aportadas por Lucene y Funcionalidades aportadas por Elasticsearch\n\n\n\nTérminos usuales\n\n\n Node: A single instance of Elasticsearch running on a machine. Podemos tener varios nodos en sus correspondientes máquinas sirviendo Elasticsearch.\n Cluster: A cluster is the single name under which one or more nodes/instances of Elasticsearch are connected to each other.\n \n Creating an Elasticsearch Cluster: Getting Started\n \n \n Document: A document is a JSON object that contains the actual data in key value pairs. Es la unidad mínima de información que puede ser indexada y recuperada. En elastic los documentos son JSON.\n Index: A logical namespace under which Elasticsearch stores data, and may be built with more than one Lucene index using shards and replicas. Conjunto de documentos con similares características.\n Doc types: A doc type in Elasticsearch represents a class of similar documents. A type consists of a name, such as a user or a blog post, and a mapping, including data types and the Lucene configurations for each field. (An index can contain more than one type.). Con el tiempo va en desuso.\n \n Shard: Es un fragmento de un índice. An index is divided into one or more shards to make the data distributable. Shards can be stored on a single node or multiple nodes and are composed of Lucene segments.\n\n Notes\n\n \n Shard en la Wikipedia\n A shard can be either primary or secondary. A primary shard is the one where all the operations that change the index are directed. A secondary shard is the one that contains duplicate data of the primary shard and helps in quickly searching the data as well as for high availability; in a case where the machine that holds the primary shard goes down, then the secondary shard becomes the primary automatically.\n A database shard is a horizontal partition of data in a database or search engine. Each individual partition is referred to as a shard or database shard. Each shard is held on a separate database server instance, to spread load.\n Some data within a database remains present in all shards but some appears only in a single shard. Each shard (or server) acts as the single source for this subset of data\n \n ¿Cómo se reparten? Usando las llamadas “shard keys” o claves de repartición. Cada partición contiene un intervalo de claves (Clave Mínima, Clave Máxima). Se habla de “partición basada en rangos”. La Index Big Table de Google utiliza una idea similar. \n Tutorial MongoDB. Explicando el sharding con una baraja de cartas\n \n \n Replica: A duplicate copy of the data living in a shard for high availability. Proporciona alta disponibilidad y escalabilidad.\n Settings: Define la configuración de un índice y sus características específicas (por ejemplo, el número de réplicas y shards). Se define a nivel de cluster y algunos parámetros se pueden modificar una vez creado el índice. Por ejemplo, si yo defino que un índice va a tener replicación de 2, lo va a tener en todos los nodos del cluster. Eso sí, dentro de distintos índices puedo tener diferentes números de replicación. El número de réplicas se puede cambiar a posteriori pero el número de shards no (al menos no fácilmente).\n Mappings: Es la definición del modelo de datos de un índice (Puede definirse de manera explícita o dejar que lo genere Elasticsearch). Por cada campo se puede definir su tipo, propiedades y analizadores\n \n Analizadores de texto: Procesadores de texto que realizan transformaciones del contenido de los diferentes campos para permitir funcionalidades adicionales de búsqueda\n\n ### Notes\n\n \n \n Character Filters: The job of character filters is to do cleanup tasks such as stripping out HTML tags.\n Tokenizers: The next step is to split the text into terms that are called tokens. This is done by a tokenizer. The splitting can be done based on any rule such as whitespace. More details about tokenizers can be found at this URL: https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html.\n Token filters: Once the tokens are created, they are passed to token filters that normalize the tokens. Token filters can change the tokens, remove the terms, or add terms to new tokens.\n Ejemplo:\n \n \n Pasar a minúscula\n The ASCII folding token filter, which converts Unicode characters into their ASCII equivalent (quitar acentos, etc.)\n Quitar palabras que no aportan significado (In computing, stop words are words which are filtered out before processing of natural language data)\n Quedarnos con la raíz de las palabras (stemming is the process of reducing inflected (or sometimes derived) words to their word stem, base or root form)\n \n \n Proceso:\n \n \n Es importante aquí que hagamos las mismas transformaciones y en el mismo orden tanto en indexación como en búsqueda\n \n \n \n \n Queries: Elasticsearch utiliza Query DSL (Lenguaje de dominio específico) para realizar las consultas a los documentos indexados. Es un lenguaje sumamente flexible y de gran alcance, además de simple, que permite conocer y explorar los datos de la mejor manera. Al ser utilizado a través de una interfaz de tipo JSON, las consultas son muy sencillas de leer y, lo más importante, de depurar.\n \n Elastic Query DSL 7.5\n Useful Elasticsearch Example Queries DZone\n \n \n\n\nInstalling Elastic Search\n\nPrerequisitos para la Instalación de Elastic Search\n\nElasticsearch is built on Java 8.\n\nInstructions on how to install Java 8 are available on Oracle’s website\n\nYou can run java -version \nfrom the command line to confirm that Java is installed and ready.\n\n1\n2\n3\n4\n$ java --version\njava 9.0.4\nJava(TM) SE Runtime Environment (build 9.0.4+11)\nJava HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)\n\n\nInstalación de la versión del libro de ElasticSearch\n\nUna forma de instalarse ElasticSearch es ir a la página de descargas:\n\n\n https://www.elastic.co/es/downloads/\n\n\nLa versión que se usa en el libro es la 5.2 que se puede descargar desde aquí:\n\n\n https://www.elastic.co/es/downloads/past-releases/elasticsearch-5-2-2\n\n\nAquí se puede encontrar una guía de inicio rápido..\n\nInstalación de la versión 6.4.2. Octubre 2018\n\nEsta es la versión que he usado en mi instalación, la 6.4.2 para seguir el libro a finales de 2018 y comienzos de 2019:\n\n1\n2\n3\n$ elasticsearch --version\nJava HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.\nVersion: 6.4.2, Build: default/tar/04711c2/2018-09-26T13:34:09.098244Z, JVM: 9.0.4\n\n\nOnce you download the archive, \nunzip it \nand run bin/elasticsearch from the command line.\n\nYou should see a lot of output containing something like the following (much of the output is omitted here for brevity).\n\n1\n2\n3\n4\n5\n6\n7\n8\n$ bin/elasticsearch\n[INFO ][o.e.n.Node ] [] initializing ...\n... many lines omitted ...\n[INFO ][o.e.h.HttpServer ] [kAh7Q7Z] publish_address {127.0.0.1:9200},\n bound_addresses {[::1]:9200}, {127.0.0.1:9200}\n[INFO ][o.e.n.Node ] [kAh7Q7Z] started\n[INFO ][o.e.g.GatewayService ] [kAh7Q7Z] recovered [0] indices into\n cluster_state\n\n\nNotice the publish_address and bound_addresses listed toward the end of the output. \nBy default, Elasticsearch binds TCP port 9200 for its HTTP endpoint.\n\nYou can specify a lot of settings when setting up an Elasticsearch cluster. By default, is running in development mode.\n\nA full discussion of the Elasticsearch cluster settings for version 5.2 is Elastic’s Important System Configuration 5.2 page.\nThe same instructions for the current version are here\n\nTo have Elasticsearch in the PATH, I have added a small script in my ~/.bash_profile:\n\n1\n2\n[~/campus-virtual/1819/ca1819/practicas(master)]$ cat ~/.bash_profile | sed -ne '/elastic/,/^$/p'\nsource ~/bin/elasticsearch-set\n\n\nWith this contents:\n\n1\n2\n3\n[~/campus-virtual/1819/ca1819/practicas(master)]$ cat ~/bin/elastic-search-set\nexport ES_HOME=~/Applications/elasticsearch-6.4.2\nexport PATH=$ES_HOME/bin:$PATH\n\n\nInstalación de la versión 7.5.0 Diciembre 2019\n\nLa version en Diciembre de 2019 es la 7.5.0\n\nInstall Elasticsearch on macOS with Homebrew. Diciembre 2019\n\nApuntes tomados de https://www.elastic.co/guide/en/elasticsearch/reference/current/brew.html\n\nElastic publishes Homebrew formulae so you can install Elasticsearch with the Homebrew package manager.\n\nTo install with Homebrew, you first need to tap the Elastic Homebrew repository:\n\n1\nbrew tap elastic/tap\n\n\nOnce you’ve tapped the Elastic Homebrew repo, you can use brew install to install the default distribution of Elasticsearch:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n[~/.../transforming-data-and-testing-continuously-chapter-5/databases(master)]$ brew install elastic/tap/elasticsearch-full\nUpdating Homebrew...\n==> Auto-updated Homebrew!\nUpdated 1 tap (homebrew/core).\n==> Updated Formulae\nallure bedtools c-blosc convox csvq golang-migrate helmfile micronaut mitmproxy\n\n==> Installing elasticsearch-full from elastic/tap\n==> Downloading https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.0-darwin-x86_64.tar.gz?tap=elastic/homebrew-tap\n######################################################################## 100.0%\n==> codesign -f -s - /usr/local/Cellar/elasticsearch-full/7.5.0/libexec/modules/x-pack-ml/platform/darwin-x86_64/controller.app --deep\n==> Caveats\nData: /usr/local/var/lib/elasticsearch/elasticsearch_casiano/\nLogs: /usr/local/var/log/elasticsearch/elasticsearch_casiano.log\nPlugins: /usr/local/var/elasticsearch/plugins/\nConfig: /usr/local/etc/elasticsearch/\n\nTo have launchd start elastic/tap/elasticsearch-full now and restart at login:\n brew services start elastic/tap/elasticsearch-full\nOr, if you don't want/need a background service you can just run:\n elasticsearch\n==> Summary\n🍺 /usr/local/Cellar/elasticsearch-full/7.5.0: 921 files, 451.1MB, built in 1 minute 44 seconds\n\n\nDirectory layout for Homebrew installs\n\n\n \n \n \n \n \n \n \n \n Type\n Description\n Default Location\n Setting\n \n \n \n \n \n home\n \n \n Elasticsearch home directory or $ES_HOME\n \n \n /usr/local/var/homebrew/linked/elasticsearch-full\n \n  \n \n \n \n bin\n \n \n Binary scripts including elasticsearch to start a node\n and elasticsearch-plugin to install plugins\n \n \n /usr/local/var/homebrew/linked/elasticsearch-full/bin\n \n  \n \n \n \n conf\n \n \n Configuration files including elasticsearch.yml\n \n \n /usr/local/etc/elasticsearch\n \n \n ES_PATH_CONF\n \n \n \n \n \n data\n \n \n The location of the data files of each index / shard allocated\n on the node. Can hold multiple locations.\n \n \n /usr/local/var/lib/elasticsearch\n \n \n path.data\n \n \n \n \n logs\n \n \n Log files location.\n \n \n /usr/local/var/log/elasticsearch\n \n \n path.logs\n \n \n \n \n plugins\n \n \n Plugin files location. Each plugin will be contained in a subdirectory.\n \n \n /usr/local/var/homebrew/linked/elasticsearch/plugins\n \n  \n \n \n\n\nThis installs the most recently released default distribution of Elasticsearch. To install the OSS distribution, specify elastic/tap/elasticsearch-oss.\n\nRunning Elasticsearch 7.5.0\n\n$ which elasticsearch\n/usr/local/bin/elasticsearch\n$ elasticsearch --version\nOpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.\nVersion: 7.5.0, Build: default/tar/e9ccaed468e2fac2275a3761849cbee64b39519f/2019-11-26T01:06:52.518245Z, JVM: 13.0.1\n$ elasticsearch\n...\n[2019-12-18T09:52:26,489][INFO ][o.e.t.TransportService ] [sanclemente-2.local] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300}\n...\n[2019-12-18T09:52:28,853][INFO ][o.e.h.AbstractHttpServerTransport] [sanclemente-2.local] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}\n...\n[2019-12-18T09:52:58,833][WARN ][o.e.c.r.a.DiskThresholdMonitor] [sanclemente-2.local] high disk watermark [90%] exceeded on [VK6QoFsVQeGBAcAKIC3vLA][sanclemente-2.local][/usr/local/var/lib/elasticsearch/nodes/0] free: 19.3gb[8.2%], shards will be relocated away from this node\n\n\n\n High disk watermark exceeded: settings that can be configured in the elasticsearch.yml config file \n\n\nPara arreglar el WARNhe editado el fichero de configuración elasticsearch.yml añadiendo la línea cluster.routing.allocation.disk.watermark.high: 95%:\n\n1\n2\n3\n4\n5\n[.../etc/elasticsearch]$ sed -ne '/cluster\\./p' elasticsearch.yml \n# the most important settings you may want to configure for a production cluster.\ncluster.name: elasticsearch_casiano\ncluster.routing.allocation.disk.watermark.high: 95%\n#cluster.initial_master_nodes: [\"node-1\", \"node-2\"]\n\n\nAunque ahora salen otros warnings y algun INFO quejumbroso:\n\n...\n[2019-12-18T10:26:03,369][WARN ][o.e.b.BootstrapChecks ] [sanclemente-2.local] the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured\n... \n[2019-12-18T10:27:04,078][INFO ][o.e.c.r.a.DiskThresholdMonitor] [sanclemente-2.local] low disk watermark [85%] exceeded on [VK6QoFsVQeGBAcAKIC3vLA][sanclemente-2.local][/usr/local/var/lib/elasticsearch/nodes/0] free: 19.2gb[8.2%], replicas will not be assigned to this node\n\n\nRuta root Elasticsearch\n\nSi visitamos con el navegador http://localhost:9200:\n\n\n\nLa ruta _cat\n\n\n \n curl localhost:9200/_cat da una serie de endpoints\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n .../etc/elasticsearch]$ curl localhost:9200/_cat\n =^.^=\n /_cat/allocation\n /_cat/shards\n /_cat/shards/{index}\n /_cat/master\n /_cat/nodes\n /_cat/tasks\n /_cat/indices\n /_cat/indices/{index}\n /_cat/segments\n /_cat/segments/{index}\n /_cat/count\n /_cat/count/{index}\n /_cat/recovery\n /_cat/recovery/{index}\n /_cat/health\n /_cat/pending_tasks\n /_cat/aliases\n /_cat/aliases/{alias}\n /_cat/thread_pool\n /_cat/thread_pool/{thread_pools}\n /_cat/plugins\n /_cat/fielddata\n /_cat/fielddata/{fields}\n /_cat/nodeattrs\n /_cat/repositories\n /_cat/snapshots/{repository}\n /_cat/templates\n \n \n \n Modo verboso: $ curl localhost:9200/_cat/master?v`\n\n 1\n2\n id host ip node\n VK6QoFsVQeGBAcAKIC3vLA 127.0.0.1 127.0.0.1 sanclemente-2.local\n \n \n \n Help: $ curl localhost:9200/_cat/master?help`\n\n 1\n2\n3\n4\n id | | node id \n host | h | host name \n ip | | ip address \n node | n | node name \n \n \n \n Each of the commands accepts a query string parameter h which forces only those columns to appear: curl localhost:9200/_cat/nodes?h=ip,port,heapPercent,name\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n [.../etc/elasticsearch]$ curl localhost:9200/_cat/nodes\n 127.0.0.1 28 99 24 2.56 dilm * sanclemente-2.local\n [.../etc/elasticsearch]$ curl localhost:9200/_cat/nodes?help | head -n 5\n % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n 100 17533 100 17533 0 0 903k 0 --:--:-- --:--:-- --:--:-- 951k\n id | id,nodeId | unique node id \n pid | p | process id \n ip | i | ip address \n port | po | bound transport port \n http_address | http | bound http address \n [.../etc/elasticsearch]$ curl localhost:9200/_cat/nodes?h=ip,port,heapPercent,name\n 127.0.0.1 9300 28 sanclemente-2.local\n \n \n\n\nRunning ElasticSearch 6.4.2\n\nLet us see where elasticsearch 6.4.2 is installed:\n\n1\n2\n[~]$ which elasticsearch\n/Users/casiano/Applications/elasticsearch-6.4.2/bin/elasticsearch\n\n\nLet us execute elasticsearch 6.4.2 in development mode.\nThe flow of output when executed is overwhelming:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n[~/sol-nodejs-the-right-way(master)]$ elasticsearch\n[Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.\n[2019-12-15T11:28:46,903][INFO ][o.e.n.Node ] [] initializing ...\n ...\n[2019-12-15T11:28:53,337][INFO ][o.e.p.PluginsService ] [9jAGWs_] loaded module [aggs-matrix-stats]\n[2019-12-15T11:28:53,338][INFO ][o.e.p.PluginsService ] [9jAGWs_] loaded module [analysis-common]\n ...\n \n [2019-12-15T11:29:10,938][INFO ][o.e.t.TransportService ] [9jAGWs_] publish_address {127.0.0.1:9300}, bound_addresses {[::1]:9300}, {127.0.0.1:9300}\n ...\n[2019-12-15T11:29:14,175][INFO ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [9jAGWs_] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}\n\n\nWe can see in the last line that is listening at 9200:\n\n1\n[2019-12-15T11:29:14,175][INFO ][o.e.x.s.t.n.SecurityNetty4HttpServerTransport] [9jAGWs_] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}\n\n\nNow we can use insomnia or any other HTTP REST client to make queries to the elasticsearch server:\n\n\n\n\n Useful Elasticsearch Example Queries DZone\n\n\nReferencias para Elasticsearch\n\n\n Elasticsearch Essentials. Bharvi Dixit 2016 Libro en PuntoQ BULL\n Curso de Elastic Search en Paradigma Digital. Vídeos de Youtube. Minuto 39 empieza con Kibana\n Elastic Query DSL 7.5\n Useful Elasticsearch Example Queries DZone\n npm: Official Elasticsearch client library for Node.js\n Entire list of the Elasticsearch API supported by the client\n Kibana\n \n\n\nSetup Kibana\n\nInstalling Kibana\n\nInstalling Kibana on MacOS with Homebrew\n\nThis text is a copy of https://www.elastic.co/guide/en/kibana/current/brew.html#brew.\n\nElastic publishes Homebrew formulae so you can install Kibana with the Homebrew package manager.\n\nTo install with Homebrew, you first need to tap the Elastic Homebrew repository:\n\n1\nbrew tap elastic/tap\n\n\nOnce you’ve tapped the Elastic Homebrew repo, you can use brew install to install the default distribution of Kibana:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n$ brew install elastic/tap/kibana-full\nUpdating Homebrew...\n==> Installing kibana-full from elastic/tap\n==> Downloading https://artifacts.elastic.co/downloads/kibana/kibana-7.5.0-darwin-x86_64.tar.gz?tap=elastic/homebrew-tap\n######################################################################## 100.0%\n\n==> Caveats\nConfig: /usr/local/etc/kibana/\nIf you wish to preserve your plugins upon upgrade, make a copy of\n/usr/local/opt/kibana-full/plugins before upgrading, and copy it into the\nnew keg location after upgrading.\n\nTo have launchd start elastic/tap/kibana-full now and restart at login:\n brew services start elastic/tap/kibana-full\nOr, if you don't want/need a background service you can just run:\n kibana\n==> Summary\n🍺 /usr/local/Cellar/kibana-full/7.5.0: 94,615 files, 633.7MB, built in 8 minutes 18 seconds\n\n\nThis installs the most recently released default distribution of Kibana. To install the OSS distribution, specify elastic/tap/kibana-oss.\n\nDirectory layout for Homebrew installs\n\nWhen you install Kibana with brew install, the config files, logs, and data directory are stored in the following locations.\n\n\n\n \n Type\n Description\n Default Location\n Setting\n \n\n\n \n \n home\n \n \n Kibana home directory or $KIBANA_HOME\n \n \n /usr/local/var/homebrew/linked/kibana-full\n \n  \n \n \n \n bin\n \n \n Binary scripts including kibana to start a node\n and kibana-plugin to install plugins\n \n \n /usr/local/var/homebrew/linked/kibana-full/bin\n \n  \n \n \n \n conf\n \n \n Configuration files including kibana.yml\n \n \n /usr/local/etc/kibana\n \n  \n \n \n \n data\n \n \n The location of the data files of each index / shard allocated\n on the node. Can hold multiple locations.\n \n \n /usr/local/var/lib/kibana\n \n \n path.data\n \n \n \n \n logs\n \n \n Log files location.\n \n \n /usr/local/var/log/kibana\n \n \n path.logs\n \n \n \n \n plugins\n \n \n Plugin files location. Each plugin will be contained in a subdirectory.\n \n \n /usr/local/var/homebrew/linked/kibana-full/plugins\n \n  \n \n\n\n\nHaciendo Consultas a Elasticsearch con Kibana\n\nCreamos para la versión 7.5. de Elasticsearch el index de libros de Guttenberg con el fichero que habíamos preparado en la práctica\nanterior:\n\n1\n[~/.../t3-p8-commanding-databases-marreA/esclu(master)]$ ./esclu bulk ../t1-p7-transforming-data-and-testing-continuously-marreA/data/bulk_pg.ldj -i books -t book \n\n\nUna vez instalado Kibana lo arrancamos:\n\n[.../etc/elasticsearch]$ kibana\n log [11:08:38.205] [info][plugins-system] Setting up [15] plugins: [timelion,features,code,security,licensing,spaces,uiActions,newsfeed,expressions,inspector,embeddable,advancedUiActions,data,eui_utils,translations]\n ...\n log [11:08:38.225] [warning][config][plugins][security] Generating a random key for xpack.security.encryptionKey. To prevent sessions from being invalidated on restart, please set xpack.security.encryptionKey in kibana.yml\n log [11:08:38.227] [warning][config][plugins][security] Session cookies will be transmitted over insecure connections. This is not recommended.\n ...\n log [11:09:12.590] [warning][licensing][plugins] License information could not be obtained from Elasticsearch for the [data] cluster. Error: Request Timeout after 30000ms\n log [11:09:13.610] [warning][legacy-plugins] Skipping non-plugin directory at /usr/local/Cellar/kibana-full/7.5.0/libexec/src/legacy/core_plugins/visualizations\n ...\n log [11:09:20.088] [warning][config][deprecation] Environment variable \"DATA_PATH\" will be removed. It has been replaced with kibana.yml setting \"path.data\"\n ...\n log [11:09:24.245] [warning][encrypted_saved_objects] Generating a random key for xpack.encrypted_saved_objects.encryptionKey. To be able to decrypt encrypted saved objects attributes after restart, please set xpack.encrypted_saved_objects.encryptionKey in kibana.yml\n ... from failing on restart, please set xpack.reporting.encryptionKey in kibana.yml\n log [11:09:29.003] [info][status][plugin:reporting@7.5.0] Status changed from uninitialized to green - Ready\n log [11:09:29.151] [info][listening] Server running at http://localhost:5601\n log [11:09:29.917] [info][server][Kibana][http] http server running at http://localhost:5601\n\n\nPor defecto Kibana corre en el puerto 5601.\n\nAbrimos el navegador en http://localhost:5601 y hacemos click en las herramientas de desarrollo (la llave inglesa) en el menú de la izquierda. Esto nos abre un panel como este en el que podemos hacer requests al servidor de Elasticsearch:\n\n\n\nAlgunos ejemplos de queries:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n\nGET _cat/indices?v\n\n\nGET books/_search\n{\n \"query\": {\n \"match\": { \n \"authors\": \"Twain\" \n }\n }\n}\n\nGET books/_search\n{\n \"query\": {\n \"query_string\": {\n \"query\": \"authors:Twain AND subjects:Missouri AND title:Sawyer\" \n }\n }\n}\n\nGET books/_search\n{\n \"query\": {\n \"query_string\": {\n \"fields\": [\"authors\", \"subjects\", \"title\"], \n \"query\": \"Twain AND Missouri AND Sawyer\" \n }\n }\n}\n\nPOST test/test/1\n{\n \"title\": \"hello world\"\n}\n\nGET test/test/1\n\nPOST test/_doc/2\n{\n \"title\": \"hola mundo\"\n}\n\nGET test/_doc/2\n\nPUT test/_doc/2\n{\n \"title\" : \"bonjour monde\",\n \"tags\" : [\"red\", \"blue\"]\n}\n\nPUT test/_doc/2\n{\n \"tags\" : [\"green\", \"orange\"]\n}\n\n\nPOST test/_doc/3\n{\n \"title\" : \"SYTWS\",\n \"tags\" : [\"red\", \"blue\"]\n}\n\nPOST test/_update/3\n{\n \"script\" : {\n \"source\": \"ctx._source.tags = params.colors\",\n \"params\" : {\n \"colors\" : [\"green\"]\n }\n }\n}\n\nGET test/_doc/3\n\nDELETE test/\n\n\nReferencias para Kibana\n\n\n Curso de Elastic Search en Paradigma Digital. Vídeos de Youtube. Minuto 39 empieza con Kibana\n Kibana 7 Quick Start Guide. Anurag Srivastava 2019. Libro. PuntoQ ULL\n Video: Primeros pasos con Kibana\n\n", "url": "/tema3-web/elasticsearch.html" }, { "title": "Desktop Apps using Web Technologies: Electron", "excerpt": "\n", "content": "Desktop Apps using Web Technologies: Electron\n\nIntroduction/Quick Start\n\n\n Electron Get Started\n \n Electron API Demos\n Observación: procura usar la versión 8.9.3 de Node.JS\n Observación: no había manera de bajar electron-v2.0.4-darwin-x64.zip tardaba infinito. Al menos 4 intentos fallidos en la instalación\n Read the docs\n \n \n \n Quick Start Guide\n \n Create Cross-Platform Desktop Node Apps with Electron May 23, 2016, By Chris Ward SitePoint\n \n Includes a packaging step\n \n \n\n\nAwesome Electron by Sindresorhus\n\n\n Useful resources for creating apps with Electron by Sindresorhus\n \n Apps\n Boilerplates\n Tools\n Components\n Documentation\n Articles\n Books\n Videos\n Podcasts\n Community\n Tips\n \n\n La app mojibar puede que sea un buen ejemplo de como hacer una menubar app\n \n\n\nGopinav Codevolution Tutorials\n\n\n Electron js Tutorial Video list by Gopinav\n GH Repo con los ejemplos del tutorial by Gopinav\n Forked repo ULL-ESIT-DSI-1819/Electron-Tutorials-gopinav con los ejemplos del tutorial\n Repo con mis versiones de los ejemplos del tutorial en ULL-DSI-1819\n\n\nCameron Nokes Tutorials\n\n\n Build a desktop application with Electron (de pago)\n Repo los ejemplos del tutorial “Build a desktop …” en ULL-DSI-1819. Forked from ccnokes/build-a-desktop-app-with-electron\n Repo con mis versiones de los ejemplos del tutorial “Build a desktop …” en ULL-DSI-1819\n Repo ULL-ESIT-DSI-1819/electron-tutorials forked from ccnokes/electron-tutorials. This is another collection of small Electron sample apps.\n\n\nCameron Adams Tutorials\n\n\n Cameron: Development with Electron tutorial YouTube\n Lista de vídeos del curso “Development with Electron”\n\n\nservices.github.com Tutorials\n\n\n Tutorials de GitHub School on Electron\n \n Electron 102: Package Your App for Downloads\nIf you want to share your awesome app with the world, you will need to package it for easy download and installation.\n Electron 103: Share Your App\nRecommendations for sharing your app with potential end users..\n \n \n\n\nJanez Cadez Tutorial Building desktop applications with Electron\n\n\n Building desktop applications with Electron*\n\n\nIPC\n\n\n Electron Documentation: IPCMain\n Electron Documentation: IPCRenderer\n electron/docs/api/ipc-main.md\n ULL-ESIT-DSI-1819/electron-ipc-simple-example repo de ejemplo\n\n\nDebugging Electron\n\n\n Tips and Tricks for Debugging Electron Applications By Steve Kinney SitePoint\n\n", "url": "/tema3-web/electron.html" }, { "title": "Extending Visual Studio Code", "excerpt": "\n", "content": "Extending Visual Studio Code\n\n\n Visual Studio Code Extension API\n Visual Studio Code Extension: hello (Youtube, vídeo del profesor)\n Depurando una Extensión de Visual Studio Code (Youtube, vídeo del profesor)\n\n", "url": "/tema3-web/extending-vscode.html" }, { "title": "Gatsby", "excerpt": "\n", "content": "\nGatsby\n\n\n \n What is Gatsby? Heard of Gatsby.js, but not sure what to make of it?\n \n \n https://www.gatsbyjs.org/\n \n Examples\n Video Tutorial\n \n Gatsby JS Crash Course YouTube\n \n Gatsby.js: Adding Markdown Pages\n Creating a Blog with Gatsby\n \n \n\n\nThe Belgian Beers Gatsby hello world\n\n\n Kalin Chernev: Learn Gatsby\n GitHub repo ULL-MII-SYTWS-1920/belgian-beers and its deployment in GitHub pages\n\n\nDave Ceddia tutorial: Start a Blog in 2019 with Gatsby.js and Netlify\n\n\n Start a Blog in 2019 with Gatsby.js and Netlify\n How to Write a Blog That People Will Read\n dceddia/demo-blog\n\n\nGatsBy and GitHub Pages\n\n\n How Gatsby Works with GitHub Pages\n Deploy Gatsby sites to GitHub Pages\n GitHub Action to build and deploy your Gatsby site to GitHub Pages ❤️🎩\n\n\nRwieruch tutorials\n\n\n Gatsby.js - A powerful Static Site Generator BY ROBIN WIERUCH JULY 08, 2019\n Gatsby MDX Blog Starter Project GitHub Repo\n Gatsby starter for creating a blog with Preact. (Preact es similar a React pero ocupa sólo 3kb de tamaño)\n Your open source solution to crowd fund your ideas. Powered by Gatsby.js.\n Gatsby Starter Project for Small Businesses Deployment at https://www.reisebuero-bergfelde.de\n\n\nExample of Git Book with Gatsby\n\n\n Repo ULL-MII-SYTWS-1920/gatsby-gitbook-starter Generate GitBook style modern docs/tutorial websites using Gatsby + MDX\n\n\nMDX\n\n\n MDX: JSX in Markdown for ambitious projects https://github.com/mdx-js/mdx\n\n\nExamples of gregoblinski\n\n\n greglobinski/gatsby-starter-hero-blog deployed at https://gatsby-starter-hero-blog.greglobinski.com/\n His web site\n GitHub Action for Gatsby CLI\n Repo ULL-MII-SYTWS-1920/gatsby-starter-personal-blog\n \n How to customize Node.js .env files for different environment stages\n \n \n\n\nSurge\n\n\n Getting Started with Surge\n \n Deploying a Jekyll project\n GastBy\n \n \n\n\nGatsby vs Next.js\n\n\n Gatsby vs Next.JS - What, Why and When?\n\n\nPráctica: Gatsby\n", "url": "/tema3-web/gatsby.html" }, { "title": "How to GraphQL", "excerpt": "\n", "content": "\nHow to GraphQL\n\n\n What is GraphQL?\n\n\nGRAPHQL FUNDAMENTALS\n\n\n Basics Tutorial - Introduction\n GraphQL is the better REST\n Core Concpets\n Big Picture (Architecture)\n\n\nAdvanced Tutorial (Skip the first time and come back again after the next tutorials)\n\n\n Advanced Tutorial - Clients\n Server\n More GraphQL Concepts\n Tooling and Ecosystem\n Security\n Common Questions\n\n\nGRAPHQL-NODE TUTORIAL. Written by Maira Bello: Build your own GraphQL server\n\n\n Maira Bello tutorial: https://www.howtographql.com/graphql-js/1-getting-started/\n Introduction\n Getting Started\n A Simple Query\n A simple Mutation\n Adding a DataBase\n Connecting Server and Database with the Prisma Client\n Authentication\n Realtime GraphQL Subscriptions\n Filtering, Pagination & Sorting\n \n Summary\n \n The GitHub repository howtographql/graphql-js contains the final project for the “GraphQL.js tutorial” on “How to GraphQL”. Note that it also serves as foundation for all frontend tutorials on the “How to GraphQL” site. \n\n\nREACT + APOLLO TUTORIAL\n\n\n React + Apollo Tutorial - Introduction\n Getting Started\n Queries: Loading Links\n Mutations: Creating Links\n Routing\n Authentication\n More Mutations and Updating the Store\n Filtering: Searching the List of Links\n Realtime Updates with GraphQL Subscriptions\n Pagination\n \n Summary\n \n The GitHub repository howtographql/react-apollo contains the final project for the “REACT + APOLLO TUTORIAL” on “How to GraphQL”\n Hacker News\n\n\nREFERENCIAS\n\n\n GraphQL Specifications\n Hands-On Full-Stack Web Development with GraphQL and React Sebastian Grebe 2019. Libro. PuntoQ ULL\n React Quickly: Painless web apps with React, JSX, Redux, and GraphQL by Azat Mardan. Manning. 2017. Libro. PuntoQ ULL\n \n Beginning GraphQL by Brian Kimokoti. Packt 2018 PuntoQ BULL Safari\n \n Por qué API REST está muerto y debemos usar APIs GraphQL - José María Rodríguez Hurtado YouTube\n GraphQL ha muerto: Vivan las APIs REST con Hypermedia - Jorge Ferrer y José Manuel Navarro YouTube\n Learning GraphQL and Relay by Samer Buna. Pack. 2016 PuntoQ BULL Safari\n Visual Design of GraphQL Data. Frisendal. APress. 2018\n\n", "url": "/tema3-web/graphql.html" }, { "title": "HTTP", "excerpt": "\n", "content": "HTTP\n\n\n Eloquent JS: HTTP\n \n Repo de Ejemplo del Capítulo\n \n \n Build a RESTful API Using Node and Express 4\n \n GitHub repo ULL-ESIT-MII-CA-1718/node-api\n \n \n Understanding HTTP Request Response Messages YouTube Video\n\n", "url": "/tema3-web/http.html" }, { "title": "Hugo", "excerpt": "\n", "content": "Hugo\n\nThe Go Language\n\n\n golang.org\n Installig go on a mac os X\n\n\nVictor Hugo\n\n\n netlify-templates/victor-hugo\n\n\nHugo Templates Language\n\n\n Hugo’s template language \n Functions\n\n", "url": "/tema3-web/hugo.html" }, { "title": "The JAM Stack", "excerpt": "\n", "content": "The JAM Stack\n\nYou may have already seen or worked on a Jamstack site! They might be built using by hand, or with Jekyll, Hugo, Nuxt, Next, Gatsby, or another static site generator…\n\n\n What is the JAM Stack? Youtube video by Maximilian Schwarzmüller. 2018\n \n The repo\n \n \n Do we really need this JAMstack thing? And what even is it? by Phil Hawksworth. YouTube video\n\n\nMultiple Ways of API Integration in your JAMStack\n\n\n Multiple Ways of API Integration in your JAMStack by Raymon Camden\n \n Associated GitHub repo https://github.com/cfjedimaster/jamstack_api_approaches\n \n \n\n\n\n When adding interactivity to a JAMStack site, typically you think of APIs, remote services that can be used to get dynamic data which is then rendered on your site with JavaScript.\nBut there’s multiple ways of using those APIs, and JavaScript, that may not be apparent to you at first.\n\n\nOption One - Direct Access to a Remote API\n\n\n Associated GitHub repo https://github.com/cfjedimaster/jamstack_api_approaches\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <script src=\"https://vuejs.org/js/vue.min.js\"></script>\n <title>SWAPI Example</title>\n</head>\n<body>\n\n<div id=\"app\">\n <h1>Star Wars Films</h1>\n <ul>\n <li v-for=\"film in films\">{% raw %}{{ film.title }}{% endraw %}</li>\n </ul>\n</div>\n\n<script>\nconst app = new Vue({\n el:'#app',\n data: {\n films:[]\n },\n created() {\n fetch('https://swapi.co/api/films')\n .then(res => res.json())\n .then(res => {\n this.films = res.results;\n let titles = this.films.map(x => x.title);\n console.log(titles);\n });\n }\n});\n</script>\n</body>\n</html>\n\n\n\n First, it assumes the remote API enables CORS, which allows your domain to directly access its domain. Many APIs allow this, but not all.\n Secondly, it assumes anonymous access. This is actually not the norm as typically an API requires some kind of identifier. Sometimes this isn’t a big deal. The API has a generous free tier and is not likely to be abused. But as soon as you put an API key into your code, anyone who can view source can then take that key and use it themselves. Some APIs will let you lock down what domains can use that key, and in that case, you’re pretty safe. But you absolutely want to keep that in mind.\n Finally, you are tied to working with data from the API in only the form it provides. That may not sound like a big deal, but what if the API returned a lot of data you don’t need? You’re putting that burden on the user which means (potentially) a slower web site and a (again, potentially) frustrating experience. This is where GraphQL really shines as it lets you specify exactly what data you need.\n\n\nOption Two - An API Proxy\n\nThe second option is pretty similar to the first, with the main difference being that your code hits an API running on your server. The server could be just that, an app server running somewhere in house, but typically will be a serverless platform instead. Basically, instead of your code making an HTTP request to some remote domain, it requests your code which then itself requests data from the remote domain.\n\nConsider this example using the Weather API from https://developer.here.com/documentation/examples/rest/auto_weather/weather-forecast-7days-astronomy. Their API requires two specific authentication values, an app_id and app_code. If I put that in my client-side code, anyone could use it, which wouldn’t be desirable. I’m going to use a serverless proxy set up with Netlify Functions to proxy requests to HERE’s API from my client side code.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\nconst fetch = require(\"node-fetch\");\n\nexports.handler = async function(event, context) {\n try {\n let app_id = process.env.HERE_APP_ID;\n let app_code = process.env.HERE_APP_CODE;\n\n const response = await fetch(`https://weather.api.here.com/weather/1.0/report.json?app_id=${app_id}&app_code=${app_code}&product=forecast_astronomy&name=Lafayette,LA`, {\n headers: { Accept: \"application/json\" }\n });\n if (!response.ok) {\n // NOT res.status >= 200 && res.status < 300\n return { statusCode: response.status, body: response.statusText };\n }\n const data = await response.json();\n\n let results = data.astronomy.astronomy.map(r => {\n return {\n moonRise:r.moonrise,\n moonSet:r.moonset,\n moonPhase:r.moonPhase,\n moonPhaseDesc:r.moonPhaseDesc,\n time:r.utcTime\n }\n });\n\n return {\n statusCode: 200,\n body: JSON.stringify({ data:results })\n };\n } catch (err) {\n console.log(err); \n return {\n statusCode: 500,\n body: JSON.stringify({ msg: err.message }) \n };\n }\n};\n\n\nIn general this is just some trivial Node code, but I want to point out some specific tweaks I did here:\n\n\n First, HERE’s weather API supports returning astronomy data. For my demo I want to know about the moon, so you can see me filtering that out in the map call. This will result in less data going to be my client-side code.\n Also note that the API has slightly different casing going on. So for moonrise it’s all lowercase, but then they use moonPhase. There may be a good reason for that, but to me it wasn’t what I expected so I took the opportunity to reformat the data a bit as well.\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n\t<script src=\"https://vuejs.org/js/vue.min.js\"></script>\n\t<title>Moon Data</title>\n</head>\n<body>\n\n<div id=\"app\">\n\t<h1>Moon Data for Lafayette, LA</h1>\n\t<ul>\n\t\t<li v-for=\"result in results\">\n\t\t\tOn {{result.time | formatDate}}, the moon will rise at {{result.moonRise}} and set at {{result.moonSet}}. It is in {{result.moonPhaseDesc}}. \n\t\t</li>\n\t</ul>\n</div>\n\n<script>\nVue.filter('formatDate', function(d) {\n\tif(!window.Intl) return d;\n\treturn new Intl.DateTimeFormat('en-US').format(new Date(d));\n}); \n\nconst app = new Vue({\n\tel:'#app',\n\tdata: {\n\t\tresults:[]\n\t},\n\tcreated() {\n\t\tfetch('/.netlify/functions/get-moon')\n\t\t.then(res => res.json())\n\t\t.then(res => {\n\t\t\tthis.results = res.data;\n\t\t});\n\t}\n});\n</script>\n</body>\n</html>\n\n\nSo, this one is a bit more work, but depending on your app platform, it could be easy. As I said, I used Netlify Functions, and outside of a configuration issue I had, it was trivial. What does this give us?\n\n\n We have the ability to hide any required keys.\n We have the ability to shape the result. This could include removing data we don’t need, changing data for our needs, or heck, we could even add data too if it would be useful to the client.\n We could even switch providers. If I need to use someone besides https://weather.ls.hereapi.com/ for my data, I can change it at the server and the front-end code won’t have to know. I’d just ensure the result data matches what I used before.\n You could also add caching. Some API providers ask that you don’t do this, but you could store data locally and only fetch when you need to.\n The only real drawback I can see is that it’s definitely a bit more work. To me this was rather easy, but I’ve got experience writing code on the server and working with serverless platforms. I don’t want to minimize the fact that not having these skills would be a bit of a jump if your only JavaScript experience is in client-side code.\n\n", "url": "/tema3-web/jam.html" }, { "title": "Jekyll", "excerpt": "\n", "content": "Jekyll\n\nRecuerda que GitHub provee un servicio de Hosting de páginas estáticas (GitHub Pages) que se sirven mediante Jekyll.\n\n\n Jekyll docs\n\n\nContent\n\n\n Pages\n Posts\n Front Matter\n Collections\n Page Sections in Jekyll - Separating Content from Layout\n Explain like I’m five: Jekyll collections\n Data Files\n Why I love Jekyll Data Files - Chen Hui Jing // JekyllConf 2019 YouTube\n Assets\n Static Files\n\n\nSite Structure\n\n\n Directory Structure\n Liquid\n Liquid Sandbox: You can test your Liquid code here. This sandbox only loads the default Liquid methods \n Variables\n Includes\n Layouts\n Permalinks\n Themes\n Pagination\n\n\nTutorials\n\n\n Tutorials\n Video Walkthroughs\n Navigation\n Order of interpretation\n Custom 404 Page\n Convert an HTML site to Jekyll\n Using Jekyll with Bundler\n\n\nThe Jekyll Conference\n\n\n The free, online global conference for all things Jekyll\nBest Practices, Advanced Case Studies, The Future of Jekyll\n\n\nCloudCannon: The Cloud CMS for Jekyll\n\nCloudCannon is cloud content management system and hosting provider for Jekyll websites. The way it works is this:\n\n\n A developer uploads a Jekyll site in the browser or syncs with GitHub, Bitbucket or Dropbox.\n CloudCannon builds the site, hosts it and\n provides an interface for non-technical people to update content.\n\n\n\n CloudCannon\n Client editable Jekyll sites\n\n\nEditors\n\n\n Forestry is an editor-friendly interface over Git. This means that developers and editors can now use the same workflow and tool set.\n\n\nThemes\n\nWith gem-based themes, some of the site’s directories (such as the assets, _layouts, _includes, and _sass directories) are stored in the theme’s gem, hidden from your immediate view. Yet all of the necessary directories will be read and processed during Jekyll’s build process.\n\nYou can run bundle update <THEME>, replacing <THEME> with the theme name, such as minima, to just update the theme gem:\n\n1\n2\n3\n4\n5\n6\n7\n8\n~/.../sytws1920/apuntes(master)]$ bundle update jekyll-theme-midnight\nFetching gem metadata from https://rubygems.org/...........\nFetching gem metadata from https://rubygems.org/.\nResolving dependencies...\nUsing concurrent-ruby 1.1.5\n...\nBundler attempted to update jekyll-theme-midnight but its version stayed the same\nBundle updated!\n\n\n\n Themes documentation\n Jekyll and Project Documentation Themes\n documentation-theme-jekyll Un tema muy interesante\n\n\nConverting a Jekyll Web Site to PDF\n\n\n Prince\n PDFKit\n GitHub repo wkhtmltopdf: Convert HTML to PDF using Webkit (QtWebKit) see https://wkhtmltopdf.org\n\n\nBlog: A Collection of Music Albums\n\n\n How to maintain a collection of music albums online, using Jekyll and Github Pages. See it at http://adrienjoly.com/album-shelf/\n\n\nReact and Jekyll\n\n\n A npm package providing a Jekyll Boilerplate with React using Webpack (Not supported by GitHub Pages)\n \n Blog: Start building your great modern static website with this boilerplate using Jekyll, React and Webapck.\n \n \n\n\nAuth and Jekyll\n\n\n benbalter/jekyll-auth: A simple way to use GitHub OAuth to serve a protected Jekyll site to your GitHub organization\n\n\nE-commerce\n\n\n Jekyll E-Commerce Tutorial: Add a Shopping Cart to Your Static Website 2019\n Headless E-Commerce: What, Why, & How (Tools Included) 2018\n GitHub repo:A Jekyll based shopping cart built with simpleCart(js)\n Jekyll Cart Demo Video en YouTube\n\n\nDeveloping\n\n\n Change site.url to localhost during jekyll local development\n\n\n”\n\nThis is a common problem between different Jekyll environments.\n\nSome explanations\n\nWe need to understand site.url and site.baseurl and in which situation we need them. Those variables don’t serve the same purpose.\n\nsite.url\n\nBy default, this variable is only used in page head for the canonical header and the RSS link. It’s also used in the xml feed to point to site resources as the software that will manage this feed doesn’t know resource’s urls.\n\nThis variable is only necessary for external systems.\n\nsite.baseurl\n\nThis variable indicates the root folder of your Jekyll site. By default it is set to \"\" (empty string). That means that your Jekyll site is at the root of http://example.com.\n\nIf your Jekyll site lives in http://example.com/blog, you have to set site.baseurl to /blog (note the slash). This will allow assets (css, js) to load correctly.\n\nSee how assets are loaded in you head :\n\n1\n<link rel=\"stylesheet\" href=\"{{ \"/css/main.css\" | prepend: site.baseurl }}\">\n\n\nthat can also be :\n\n1\n<link rel=\"stylesheet\" href=\"{{ site.baseurl }}/css/main.css\">\n\n\nWorking in different environments\n\nNow you have to test your site locally and to deploy it in production. Sometimes, the baseurl is different and the jekyll build may not work out of the box in one of those environment.\n\nHere we have two solutions :\n\nUse jekyll serve\n\nLet’s imagine that your site lives in a github repository and is served at https://username.github.io/myProject.\n\nYou can setup the baseurl to /myProject. and test your site locally with jekyll serve, your site will be served at http://127.0.0.1:4000/myProject/\n\nUse multiple configuration files\n\nIf, for one reason or another, you cannot use jekyll serve, you can set a configuration file for both environment and jekyll build depending on where you are deploying.\n\nLet’s say we have the local site served at http://localhost and the production site served at https://username.github.io/myProject.\n\nWe leave the _config.yml with url: https://username.github.io and baseurl: /myProject\n\nWe create a new _config_dev.yml with only url: https://localhost and baseurl: \"\"\n\nNow to test locally :\n\n1\njekyll build --config _config.yml,_config_dev.yml\n\n\nor\n\n1\njekyll build --config _config.yml,_config_dev.yml --watch\n\n\nWhen pushed on production, the jekyll build command will use the default _config.yml.\n\nTesting\n\n\n Using HTMLProofer From Ruby and Travis\n\n\nJekyll as a Web Service\n\n\n Jekyll JSON API\n\n\nMaths y Jekyll\n\n\n Adding MathJax to a GitHub Pages Jekyll Blog\n\n\nCursos en YouTube de Jekyll and NetlifyCMS por Thomas Bradley\n\n\n Jekyll\n Jekyll + NetlifyCMS 14 Youtube videos\n Jekyll + Patternbot\n\n\nChen Hui Jing Talks on Jekyll\n\n\n Chen Hui Jing talks on Jekyll\n Chen Hui Jing talks Slides in reveal.js\n\n\nPráctica p8-t3-jekyll-netlify\n\n\n Práctica p8-t3-jekyll-netlify\n Práctica p10-t3-jekyll-search\n\n", "url": "/tema3-web/jekyll.html" }, { "title": "Learning React by Eve Porcello, Alex Banks. O’Reilly 2017", "excerpt": "\n", "content": "Learning React by Eve Porcello, Alex Banks. O’Reilly 2017\n\n\n\n\n\nPreface\n\nConventions Used in This Book\nUsing Code Examples\nO’Reilly Safari\nHow to Contact Us\nAcknowledgments\n1. Welcome to React\nObstacles and Roadblocks\nReact Is a Library\nNew ECMAScript Syntax\nPopularity of Functional JavaScript\nJavaScript Tooling Fatigue\nWhy React Doesn’t Have to Be Hard to Learn\nReact’s Future\nKeeping Up with the Changes\nWorking with the Files\nFile Repository\nReact Developer Tools\nInstalling Node.js\n2. Emerging JavaScript\nDeclaring Variables in ES6\nconst\nlet\nTemplate Strings\nDefault Parameters\nArrow Functions\nTranspiling ES6\nES6 Objects and Arrays\nDestructuring Assignment\nObject Literal Enhancement\nThe Spread Operator\nPromises\nClasses\nES6 Modules\nCommonJS\n3. Functional Programming with JavaScript\nWhat It Means to Be Functional\nImperative Versus Declarative\nFunctional Concepts\nImmutability\nPure Functions\nData Transformations\nHigher-Order Functions\nRecursion\nComposition\nPutting It All Together\n4. Pure React\nPage Setup\nThe Virtual DOM\nReact Elements\nReactDOM\nChildren\nConstructing Elements with Data\nReact Components\ncreateClass\nES6 Classes\nStateless Functional Components\nDOM Rendering\nFactories\n5. React with JSX\nReact Elements as JSX\nJSX Tips\nBabel\nRecipes as JSX\nIntro to Webpack\nWebpack Loaders\nRecipes App with a Webpack Build\n6. Props, State, and the Component Tree\nProperty Validation\nValidating Props with createClass\nDefault Props\nCustom Property Validation\nES6 Classes and Stateless Functional Components\nRefs\nInverse Data Flow\nRefs in Stateless Functional Components\nReact State Management\nIntroducing Component State\nInitializing State from Properties\nState Within the Component Tree\nColor Organizer App Overview\nPassing Properties Down the Component Tree\nPassing Data Back Up the Component Tree\n7. Enhancing Components\nComponent Lifecycles\nMounting Lifecycle\nUpdating Lifecycle\nReact.Children\nJavaScript Library Integration\nMaking Requests with Fetch\nIncorporating a D3 Timeline\nHigher-Order Components\nManaging State Outside of React\nRendering a Clock\nFlux\nViews\nActions and Action Creators\nDispatcher\nStores\nPutting It All Together\nFlux Implementations\n8. Redux\nState\nActions\nAction Payload Data\nReducers\nThe Color Reducer\nThe Colors Reducer\nThe Sort Reducer\nThe Store\nSubscribing to Stores\nSaving to localStorage\nAction Creators\nMiddleware\nApplying Middleware to the Store\n9. React Redux\nExplicitly Passing the Store\nPassing the Store via Context\nPresentational Versus Container Components\nThe React Redux Provider\nReact Redux connect\n10. Testing\nESLint\nTesting Redux\nTest-Driven Development\nTesting Reducers\nTesting the Store\nTesting React Components\nSetting Up the Jest Environment\nEnzyme\nMocking Components\nSnapshot Testing\nUsing Code Coverage\n11. React Router\nIncorporating the Router\nRouter Properties\nNesting Routes\nUsing a Page Template\nSubsections and Submenus\nRouter Parameters\nAdding Color Details Page\nMoving Color Sort State to Router\n12. React and the Server\nIsomorphism versus Universalism\nServer Rendering React\nUniversal Color Organizer\nUniversal Redux\nUniversal Routing\nCommunicating with the Server\nCompleting Actions on the Server\nActions with Redux Thunks\nIndex\n\n", "url": "/tema3-web/learning-react.html" }, { "title": "Capítulo: Bases de Datos No Relacionales: MongoDB", "excerpt": "\n", "content": "Capítulo: Bases de Datos No Relacionales: MongoDB\n\nApuntes del profesor para Mongo\n\n\n MongoDB\n Setting Up MongoDB in c9\n \n How can I customize the mongo shell prompt?\n MongoDB Documents\n Queries\n Insertando Datos\n Actualizando Datos\n Suprimiendo Datos\n \n \n MongoDB en Node.js\n \n Empezando\n \n \n\n\nApuntes para Mongoose\n\n\n \n Mongoose\n \n Data Model\n Schema\n Building a Model from a Schema\n Constructing documents\n Saving Documents\n Los métodos save retornan Promesas\n Queries en Mongoose\n Mongoose Validaciones\n Ejemplo Simple de uso de Mongoose con Express\n Middlewares\n Population\n Tutoriales sobre Mongoose\n\n\nThe Mongo Shell\n\n\n The Mongo Shell\n Write Scripts for the mongo Shel\n\n\nMongoDB and NodeJS W3Schools\n\n\n W3Schools: Node.Js MongoDB tutorial\n \n MongoDB Get Started\n MongoDB Create Database\n MongoDB Create Collection\n MongoDB Insert\n MongoDB Find\n MongoDB Query\n MongoDB Sort\n MongoDB Delete\n MongoDB Drop Collection\n MongoDB Update\n MongoDB Limit\n MongoDB Join\n \n \n Repo ULL-ESIT-MII-CA-1718/w3schools-mongodb\n Mongodb NodeJS API documentation\n\n", "url": "/tema3-web/mongodb.html" }, { "title": "MySQL", "excerpt": "\n", "content": "MySQL\n\n\n MySQL Documentation\n Download and install MySQL on Mac for beginners\n \n homebrew services\n \n \n\n", "url": "/tema3-web/mysql.html" }, { "title": "Retos: Commanding Databases with yargs (p10-t3-commanding-databases)", "excerpt": "\n", "content": "Retos: Commanding Databases with yargs (p10-t3-commanding-databases)\n\nReto 1\n\nPublique el programa de línea de comandos esclu desarrollado en esta práctica como un módulo npm en el npm registry\n\nReferencias\n\nVea la sección Módulos en NPM en estos apuntes\n\nReto 2\n\nPublique el programa de línea de comandos esclu desarrollado en esta práctica como un módulo npm en Github packages\n\nReferencias\n\nVea la sección GitHub Package Registry en estos apuntes.\n\nSiga también este tutorial de GitHub:\n\nConfiguring npm for use with GitHub Packages\n\n\n Authenticating to GitHub Packages\n Publishing a package\n Publishing multiple packages to the same repository\n Installing a package\n Further reading\n\n", "url": "/tema3-web/practicas/p10-t3-commanding-databases/reto.html" }, { "title": "Variantes: Commanding Databases with yargs (p10-t3-commanding-databases)", "excerpt": "\n", "content": "\nVariantes: Commanding Databases with yargs (p10-t3-commanding-databases)\n\nEn vez de seguir el capítulo del libro al pie de la letra, puede realizar cualquiera de las variantes que se mencionan a continuación o intentar combinaciones de ellas. \nPor ejemplo, puede usar yargs en vez de commander y usar el cliente de Elasticsearch @elastic/elasticsearch para Node en vez de request\n\nVariante 1: Reescriba el programa de línea de comandos esclu usando yargs en vez de commander\n\nyargs\n\n\n yargs en npm\n yargs home page\n Yargs’ API\n Examples\n Parsing Tricks\n \n Stop the Parser\n Negating Boolean Arguments\n Numbers\n Arrays\n Objects\n \n \n Advanced Topics\n \n Composing Your App Using Commands\n Building Configurable CLI Apps\n Customizing Yargs’ Parser\n \n \n\n\nVariante 2: Commanding Databases with node-fetch (p10-t3-commanding-databases)\n\nRe-escriba esclu usando node-fetchen vez de request\n\nnode-fetch\n\n\n node-fetch\n Motivation\n Features\n Difference from client-side fetch\n Installation\n Loading and configuring the module\n Common Usage\n \n Plain text or HTML\n JSON\n Simple Post\n Post with JSON\n Post with form parameters\n Handling exceptions\n Handling client and server errors\n \n \n Advanced Usage\n \n Streams\n Buffer\n Accessing Headers and other Meta data\n Post data using a file stream\n Post with form-data (https://github.com/bitinn/node-fetch/blob/master/README.mddetect multipart)\n Request cancellation with AbortSignal\n \n \n API\n \n fetch(url[, options])\n Options\n Class: Request\n Class: Response\n Class: Headers\n Interface: Body\n Class: FetchError\n \n \n\n\nVariante 3: Usar el cliente de Elasticsearch @elastic/elasticsearch para Node en vez de request\n\nElasticsearch Node.js client\n\n\n Elasticsearch Node.js client\n Introduction\n Usage\n Client configuration\n API Reference\n Breaking changes coming from the old client\n Authentication\n Observability\n Creating a child client\n Extend the client\n TypeScript support\n Examples\n \n asStream\n Bulk\n Exists\n Get\n Ignore\n MSearch\n Scroll\n Search\n Suggest\n transport.request\n Typescript\n \n \n\n", "url": "/tema3-web/practicas/p10-t3-commanding-databases/variantes.html" }, { "title": "Reto: Developing RESTful Web Services (p11-t3-restful)", "excerpt": "\n", "content": "Reto: Developing RESTful Web Services (p11-t3-restful)\n\nEn la versión actual los bundles guardan de un libro su id y el title:\n\n1\n./esclu -i b4 -t bundle get _search | jq '.hits.hits'\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n[\n ...\n {\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"P75BTWgBZl6NTqvZQTZt\",\n \"_score\": 1,\n \"_source\": {\n \"name\": \"prueba\",\n \"userKey\": \"twitter-116415832\",\n \"books\": [\n {\n \"id\": \"pg6873\",\n \"title\": \"Mark Twain\"\n },\n {\n \"id\": \"pg9014\",\n \"title\": \"The Letters of Mark Twain\"\n },\n {\n \"id\": \"pg1286\",\n \"title\": \"Tales from Shakespeare\"\n }\n ]\n }\n },\n {\n \"_index\": \"b4\",\n \"_type\": \"bundle\",\n \"_id\": \"Pr49TWgBZl6NTqvZfzZv\",\n \"_score\": 1,\n \"_source\": {\n \"name\": \"nuevo-bundle-prueba\",\n \"userKey\": \"twitter-116415832\",\n \"books\": [\n {\n \"id\": \"pg14420\",\n \"title\": \"The Exemplary Novels of Cervantes\"\n },\n {\n \"id\": \"pg21839\",\n \"title\": \"Sense and Sensibility\"\n }\n ]\n }\n }\n]\n\n\nModifique el programa para que se guarde también el campo authors\n", "url": "/tema3-web/practicas/p11-t3-restful/reto.html" }, { "title": "Reto 1 para la práctica p5-t3-websockets", "excerpt": "\n", "content": "Reto 1 para la práctica p5-t3-websockets\n\n\n Add {user} is typing … functionality.\n\n\n\n\nTip: Decida en que lugar del documento saldrá el mensaje ... is typing\n\nEn el HTML, deberá decidir donde va a aparecer el mensaje de feedback indicando que un usuario\nesta tecleando y añadirle un id. Por ejemplo:\n\n1\n<div id=\"feedback\"></div>\n\n\nTip: Como escuchar por las pulsaciones de teclas\n\nLe puede ayudar añadir en el código del cliente una llamada a el método addEventListener:\n\n1\ntarget.addEventListener(tipo, listener);\n\n\n\n tipo: Una cadena representando el tipo de evento a escuchar.\n \n The keydown event is fired when a key is pressed down.\n Unlike the keypress event, the keydown:w\n event is fired for all keys, regardless of whether they produce a character value.\n \n \n listener: normalmente la function que será llamada cuando ocurre el evento tipo sobre el elemento del DOM representado por target. En este caso el código de listener deberá emitir un mensaje indicando que el usuario esta tecleando.\n El server debería recoger el mensaje y hacer un broadcast del mismo al resto de clientes conectados\n\n\nReto 2 para la práctica p5-t3-websockets\n\n\n Añáda rooms a su chat. Establezca dos rooms llamadas practicas y ocio\n\n\nVea los ejemplos en ULL-ESIT-DSI-1819/socket-io-namespaces\ny lea la sección Namespaces de la documentación de Socket.io\n\nPuede hacer este ejercicio usando namespaces o rooms.\n\nUsando namespaces\n\nEn el directorio ns tiene un ejemplo de como usar namespaces:\n\nFichero ns/index.js\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\nconst path = require('path');\nconst express = require('express');\nconst app = express();\nconst http = require('http').Server(app);\nconst io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:namespace', function(req, res) {\n res.render('space', { space: req.params.namespace});\n});\n\nfunction welcome(nsp, socket, spaceName) {\n console.log('someone connected to '+spaceName);\n socket.emit('hi', `Welcome client '${socket.id}' to ${spaceName}!`);\n nsp.emit('hi', `Client '${socket.id}' joined ${spaceName}!`);\n}\n\nconst nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n welcome(nsp, socket, '/my-namespace');\n});\n\nconst nsp2 = io.of('/your-namespace');\nnsp2.on('connection', function(socket) {\n welcome(nsp2, socket, '/your-namespace');\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero ns/public/index.html\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/my-namespace\">my-namespace</a></li>\n <li><a href=\"/your-namespace\">your-namespace</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero ns/views/space.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src=\"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/<%- space %>');\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n\nUsando rooms\n\nFichero rooms/index.js:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\nvar path = require('path');\nvar express = require('express');\nvar app = express();\nvar http = require('http').Server(app);\nvar io = require('socket.io')(http);\n\n// view engine setup\napp.set('views', path.join(__dirname, 'views'));\napp.set('view engine', 'ejs');\n\napp.use(express.static('public'));\n\napp.get('/:room', function(req, res) {\n res.render('room', { room: req.params.room});\n});\n\nvar nsp = io.of('/my-namespace');\nnsp.on('connection', function(socket) {\n socket.emit('hi', `Welcome client '${socket.id}' to my-namespace!`);\n socket.on('join', function(room) {\n console.log(\"room = \"+room);\n socket.join(room);\n nsp.to(room).emit('hi', socket.id+' joined room \"'+room+'\"');\n });\n console.log('someone connected: '+socket.id);\n});\n\nhttp.listen(3000, function() {\n console.log('listening on localhost:3000');\n});\n\n\nFichero rooms/public/index.html:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n<!DOCTYPE HTML>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title></title>\n</head>\n<body>\n <ul>\n <li><a href=\"/room-1\">room-1</a></li>\n <li><a href=\"/room-2\">room-2</a></li>\n </ul>\n</body>\n</html>\n\n\nFichero rooms/views/room.ejs:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n<!DOCTYPE html>\n<html>\n <head>\n <title>Hello world</title>\n </head>\n <script src = \"/socket.io/socket.io.js\"></script>\n\n <script>\n const socket = io('/my-namespace');\n\n socket.emit('join', '<%- room %>');\n\n let chat = document.getElementById(\"chat\");\n socket.on('hi',function(data) {\n chat.innerHTML += `<p>${data}</p>`;\n });\n </script>\n <body>\n <div id=\"chat\"></div>\n </body>\n</html>\n\n", "url": "/tema3-web/practicas/p5-t3-websockets/reto.html" }, { "title": "Página Completa https://www.hiperdino.es/c9495/alimentacion/arroz.html", "excerpt": "\n", "content": "Página Completa https://www.hiperdino.es/c9495/alimentacion/arroz.html\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000\n1001\n1002\n1003\n1004\n1005\n1006\n1007\n1008\n1009\n1010\n1011\n1012\n1013\n1014\n1015\n1016\n1017\n1018\n1019\n1020\n1021\n1022\n1023\n1024\n1025\n1026\n1027\n1028\n1029\n1030\n1031\n1032\n1033\n1034\n1035\n1036\n1037\n1038\n1039\n1040\n1041\n1042\n1043\n1044\n1045\n1046\n1047\n1048\n1049\n1050\n1051\n1052\n1053\n1054\n1055\n1056\n1057\n1058\n1059\n1060\n1061\n1062\n1063\n1064\n1065\n1066\n1067\n1068\n1069\n1070\n1071\n1072\n1073\n1074\n1075\n1076\n1077\n1078\n1079\n1080\n1081\n1082\n1083\n1084\n1085\n1086\n1087\n1088\n1089\n1090\n1091\n1092\n1093\n1094\n1095\n1096\n1097\n1098\n1099\n1100\n1101\n1102\n1103\n1104\n1105\n1106\n1107\n1108\n1109\n1110\n1111\n1112\n1113\n1114\n1115\n1116\n1117\n1118\n1119\n1120\n1121\n1122\n1123\n1124\n1125\n1126\n1127\n1128\n1129\n1130\n1131\n1132\n1133\n1134\n1135\n1136\n1137\n1138\n1139\n1140\n1141\n1142\n1143\n1144\n1145\n1146\n1147\n1148\n1149\n1150\n1151\n1152\n1153\n1154\n1155\n1156\n1157\n1158\n1159\n1160\n1161\n1162\n1163\n1164\n1165\n1166\n1167\n1168\n1169\n1170\n1171\n1172\n1173\n1174\n1175\n1176\n1177\n1178\n1179\n1180\n1181\n1182\n1183\n1184\n1185\n1186\n1187\n1188\n1189\n1190\n1191\n1192\n1193\n1194\n1195\n1196\n1197\n1198\n1199\n1200\n1201\n1202\n1203\n1204\n1205\n1206\n1207\n1208\n1209\n1210\n1211\n1212\n1213\n1214\n1215\n1216\n1217\n1218\n1219\n1220\n1221\n1222\n1223\n1224\n1225\n1226\n1227\n1228\n1229\n1230\n1231\n1232\n1233\n1234\n1235\n1236\n1237\n1238\n1239\n1240\n1241\n1242\n1243\n1244\n1245\n1246\n1247\n1248\n1249\n1250\n1251\n1252\n1253\n1254\n1255\n1256\n1257\n1258\n1259\n1260\n1261\n1262\n1263\n1264\n1265\n1266\n1267\n1268\n1269\n1270\n1271\n1272\n1273\n1274\n1275\n1276\n1277\n1278\n1279\n1280\n1281\n1282\n1283\n1284\n1285\n1286\n1287\n1288\n1289\n1290\n1291\n1292\n1293\n1294\n1295\n1296\n1297\n1298\n1299\n1300\n1301\n1302\n1303\n1304\n1305\n1306\n1307\n1308\n1309\n1310\n1311\n1312\n1313\n1314\n1315\n1316\n1317\n1318\n1319\n1320\n1321\n1322\n1323\n1324\n1325\n1326\n1327\n1328\n1329\n1330\n1331\n1332\n1333\n1334\n1335\n1336\n1337\n1338\n1339\n1340\n1341\n1342\n1343\n1344\n1345\n1346\n1347\n1348\n1349\n1350\n1351\n1352\n1353\n1354\n1355\n1356\n1357\n1358\n1359\n1360\n1361\n1362\n1363\n1364\n1365\n1366\n1367\n1368\n1369\n1370\n1371\n1372\n1373\n1374\n1375\n1376\n1377\n1378\n1379\n1380\n1381\n1382\n1383\n1384\n1385\n1386\n1387\n1388\n1389\n1390\n1391\n1392\n1393\n1394\n1395\n1396\n1397\n1398\n1399\n1400\n1401\n1402\n1403\n1404\n1405\n1406\n1407\n1408\n1409\n1410\n1411\n1412\n1413\n1414\n1415\n1416\n1417\n1418\n1419\n1420\n1421\n1422\n1423\n1424\n1425\n1426\n1427\n1428\n1429\n1430\n1431\n1432\n1433\n1434\n1435\n1436\n1437\n1438\n1439\n1440\n1441\n1442\n1443\n1444\n1445\n1446\n1447\n1448\n1449\n1450\n1451\n1452\n1453\n1454\n1455\n1456\n1457\n1458\n1459\n1460\n1461\n1462\n1463\n1464\n1465\n1466\n1467\n1468\n1469\n1470\n1471\n1472\n1473\n1474\n1475\n1476\n1477\n1478\n1479\n1480\n1481\n1482\n1483\n1484\n1485\n1486\n1487\n1488\n1489\n1490\n1491\n1492\n1493\n1494\n1495\n1496\n1497\n1498\n1499\n1500\n1501\n1502\n1503\n1504\n1505\n1506\n1507\n1508\n1509\n1510\n1511\n1512\n1513\n1514\n1515\n1516\n1517\n1518\n1519\n1520\n1521\n1522\n1523\n1524\n1525\n1526\n1527\n1528\n1529\n1530\n1531\n1532\n1533\n1534\n1535\n1536\n1537\n1538\n1539\n1540\n1541\n1542\n1543\n1544\n1545\n1546\n1547\n1548\n1549\n1550\n1551\n1552\n1553\n1554\n1555\n1556\n1557\n1558\n1559\n1560\n1561\n1562\n1563\n1564\n1565\n1566\n1567\n1568\n1569\n1570\n1571\n1572\n1573\n1574\n1575\n1576\n1577\n1578\n1579\n1580\n1581\n1582\n1583\n1584\n1585\n1586\n1587\n1588\n1589\n1590\n1591\n1592\n1593\n1594\n1595\n1596\n1597\n1598\n1599\n1600\n1601\n1602\n1603\n1604\n1605\n1606\n1607\n1608\n1609\n1610\n1611\n1612\n1613\n1614\n1615\n1616\n1617\n1618\n1619\n1620\n1621\n1622\n1623\n1624\n1625\n1626\n1627\n1628\n1629\n1630\n1631\n1632\n1633\n1634\n1635\n1636\n1637\n1638\n1639\n1640\n1641\n1642\n1643\n1644\n1645\n1646\n1647\n1648\n1649\n1650\n1651\n1652\n1653\n1654\n1655\n1656\n1657\n1658\n1659\n1660\n1661\n1662\n1663\n1664\n1665\n1666\n1667\n1668\n1669\n1670\n1671\n1672\n1673\n1674\n1675\n1676\n1677\n1678\n1679\n1680\n1681\n1682\n1683\n1684\n1685\n1686\n1687\n1688\n1689\n1690\n1691\n1692\n1693\n1694\n1695\n1696\n1697\n1698\n1699\n1700\n1701\n1702\n1703\n1704\n1705\n1706\n1707\n1708\n1709\n1710\n1711\n1712\n1713\n1714\n1715\n1716\n1717\n1718\n1719\n1720\n1721\n1722\n1723\n1724\n1725\n1726\n1727\n1728\n1729\n1730\n1731\n1732\n1733\n1734\n1735\n1736\n1737\n1738\n1739\n1740\n1741\n1742\n1743\n1744\n1745\n1746\n1747\n1748\n1749\n1750\n1751\n1752\n1753\n1754\n1755\n1756\n1757\n1758\n1759\n1760\n1761\n1762\n1763\n1764\n1765\n1766\n1767\n1768\n1769\n1770\n1771\n1772\n1773\n1774\n1775\n1776\n1777\n1778\n1779\n1780\n1781\n1782\n1783\n1784\n1785\n1786\n1787\n1788\n1789\n1790\n1791\n1792\n1793\n1794\n1795\n1796\n1797\n1798\n1799\n1800\n1801\n1802\n1803\n1804\n1805\n1806\n1807\n1808\n1809\n1810\n1811\n1812\n1813\n1814\n1815\n1816\n1817\n1818\n1819\n1820\n1821\n1822\n1823\n1824\n1825\n1826\n1827\n1828\n1829\n1830\n1831\n1832\n1833\n1834\n1835\n1836\n1837\n1838\n1839\n1840\n1841\n1842\n1843\n1844\n1845\n1846\n1847\n1848\n1849\n1850\n1851\n1852\n1853\n1854\n1855\n1856\n1857\n1858\n1859\n1860\n1861\n1862\n1863\n1864\n1865\n1866\n1867\n1868\n1869\n1870\n1871\n1872\n1873\n1874\n1875\n1876\n1877\n1878\n1879\n1880\n1881\n1882\n1883\n1884\n1885\n1886\n1887\n1888\n1889\n1890\n1891\n1892\n1893\n1894\n1895\n1896\n1897\n1898\n1899\n1900\n1901\n1902\n1903\n1904\n1905\n1906\n1907\n1908\n1909\n1910\n1911\n1912\n1913\n1914\n1915\n1916\n1917\n1918\n1919\n1920\n1921\n1922\n1923\n1924\n1925\n1926\n1927\n1928\n1929\n1930\n1931\n1932\n1933\n1934\n1935\n1936\n1937\n1938\n1939\n1940\n1941\n1942\n1943\n1944\n1945\n1946\n1947\n1948\n1949\n1950\n1951\n1952\n1953\n1954\n1955\n1956\n1957\n1958\n1959\n1960\n1961\n1962\n1963\n1964\n1965\n1966\n1967\n1968\n1969\n1970\n1971\n1972\n1973\n1974\n1975\n1976\n1977\n1978\n1979\n1980\n1981\n1982\n1983\n1984\n1985\n1986\n1987\n1988\n1989\n1990\n1991\n1992\n1993\n1994\n1995\n1996\n1997\n1998\n1999\n2000\n2001\n2002\n2003\n2004\n2005\n2006\n2007\n2008\n2009\n2010\n2011\n2012\n2013\n2014\n2015\n2016\n2017\n2018\n2019\n2020\n2021\n2022\n2023\n2024\n2025\n2026\n2027\n2028\n2029\n2030\n2031\n2032\n2033\n2034\n2035\n2036\n2037\n2038\n2039\n2040\n2041\n2042\n2043\n2044\n2045\n2046\n2047\n2048\n2049\n2050\n2051\n2052\n2053\n2054\n2055\n2056\n2057\n2058\n2059\n2060\n2061\n2062\n2063\n2064\n2065\n2066\n2067\n2068\n2069\n2070\n2071\n2072\n2073\n2074\n2075\n2076\n2077\n2078\n2079\n2080\n2081\n2082\n2083\n2084\n2085\n2086\n2087\n2088\n2089\n2090\n2091\n2092\n2093\n2094\n2095\n2096\n2097\n2098\n2099\n2100\n2101\n2102\n2103\n2104\n2105\n2106\n2107\n2108\n2109\n2110\n2111\n2112\n2113\n2114\n2115\n2116\n2117\n2118\n2119\n2120\n2121\n2122\n2123\n2124\n2125\n2126\n2127\n2128\n2129\n2130\n2131\n2132\n2133\n2134\n2135\n2136\n2137\n2138\n2139\n2140\n2141\n2142\n2143\n2144\n2145\n2146\n2147\n2148\n2149\n2150\n2151\n2152\n2153\n2154\n2155\n2156\n2157\n2158\n2159\n2160\n2161\n2162\n2163\n2164\n2165\n2166\n2167\n2168\n2169\n2170\n2171\n2172\n2173\n2174\n2175\n2176\n2177\n2178\n2179\n2180\n2181\n2182\n2183\n2184\n2185\n2186\n2187\n2188\n2189\n2190\n2191\n2192\n2193\n2194\n2195\n2196\n2197\n2198\n2199\n2200\n2201\n2202\n2203\n2204\n2205\n2206\n2207\n2208\n2209\n2210\n2211\n2212\n2213\n2214\n2215\n2216\n2217\n2218\n2219\n2220\n2221\n2222\n2223\n2224\n2225\n2226\n2227\n2228\n2229\n2230\n2231\n2232\n2233\n2234\n2235\n2236\n2237\n2238\n2239\n2240\n2241\n2242\n2243\n2244\n2245\n2246\n2247\n2248\n2249\n2250\n2251\n2252\n2253\n2254\n2255\n2256\n2257\n2258\n2259\n2260\n2261\n2262\n2263\n2264\n2265\n2266\n2267\n2268\n2269\n2270\n2271\n2272\n2273\n2274\n2275\n2276\n2277\n2278\n2279\n2280\n2281\n2282\n2283\n2284\n2285\n2286\n2287\n2288\n2289\n2290\n2291\n2292\n2293\n2294\n2295\n2296\n2297\n2298\n2299\n2300\n2301\n2302\n2303\n2304\n2305\n2306\n2307\n2308\n2309\n2310\n2311\n2312\n2313\n2314\n2315\n2316\n2317\n2318\n2319\n2320\n2321\n2322\n2323\n2324\n2325\n2326\n2327\n2328\n2329\n2330\n2331\n2332\n2333\n2334\n2335\n2336\n2337\n2338\n2339\n2340\n2341\n2342\n2343\n2344\n2345\n2346\n2347\n2348\n2349\n2350\n2351\n2352\n2353\n2354\n2355\n2356\n2357\n2358\n2359\n2360\n2361\n2362\n2363\n2364\n2365\n2366\n2367\n2368\n2369\n2370\n2371\n2372\n2373\n2374\n2375\n2376\n2377\n2378\n2379\n2380\n2381\n2382\n2383\n2384\n2385\n2386\n2387\n2388\n2389\n2390\n2391\n2392\n2393\n2394\n2395\n2396\n2397\n2398\n2399\n2400\n2401\n2402\n2403\n2404\n2405\n2406\n2407\n2408\n2409\n2410\n2411\n2412\n2413\n2414\n2415\n2416\n2417\n2418\n2419\n2420\n2421\n2422\n2423\n2424\n2425\n2426\n2427\n2428\n2429\n2430\n2431\n2432\n2433\n2434\n2435\n2436\n2437\n2438\n2439\n2440\n2441\n2442\n2443\n2444\n2445\n2446\n2447\n2448\n2449\n2450\n2451\n2452\n2453\n2454\n2455\n2456\n2457\n2458\n2459\n2460\n2461\n2462\n2463\n2464\n2465\n2466\n2467\n2468\n2469\n2470\n2471\n2472\n2473\n2474\n2475\n2476\n2477\n2478\n2479\n2480\n2481\n2482\n2483\n2484\n2485\n2486\n2487\n2488\n2489\n2490\n2491\n2492\n2493\n2494\n2495\n2496\n2497\n2498\n2499\n2500\n2501\n2502\n2503\n2504\n2505\n2506\n2507\n2508\n2509\n2510\n2511\n2512\n2513\n2514\n2515\n2516\n2517\n2518\n2519\n2520\n2521\n2522\n2523\n2524\n2525\n2526\n2527\n2528\n2529\n2530\n2531\n2532\n2533\n2534\n2535\n2536\n2537\n2538\n2539\n2540\n2541\n2542\n2543\n2544\n2545\n2546\n2547\n2548\n2549\n2550\n2551\n2552\n2553\n2554\n2555\n2556\n2557\n2558\n2559\n2560\n2561\n2562\n2563\n2564\n2565\n2566\n2567\n2568\n2569\n2570\n2571\n2572\n2573\n2574\n2575\n2576\n2577\n2578\n2579\n2580\n2581\n2582\n2583\n2584\n2585\n2586\n2587\n2588\n2589\n2590\n2591\n2592\n2593\n2594\n2595\n2596\n2597\n2598\n2599\n2600\n2601\n2602\n2603\n2604\n2605\n2606\n2607\n2608\n2609\n2610\n2611\n2612\n2613\n2614\n2615\n2616\n2617\n2618\n2619\n2620\n2621\n2622\n2623\n2624\n2625\n2626\n2627\n2628\n2629\n2630\n2631\n2632\n2633\n2634\n2635\n2636\n2637\n2638\n2639\n2640\n2641\n2642\n2643\n2644\n2645\n2646\n2647\n2648\n2649\n2650\n2651\n2652\n2653\n2654\n2655\n2656\n2657\n2658\n2659\n2660\n2661\n2662\n2663\n2664\n2665\n2666\n2667\n2668\n2669\n2670\n2671\n2672\n2673\n2674\n2675\n2676\n2677\n2678\n2679\n2680\n2681\n2682\n2683\n2684\n2685\n2686\n2687\n2688\n2689\n2690\n2691\n2692\n2693\n2694\n2695\n2696\n2697\n2698\n2699\n2700\n2701\n2702\n2703\n2704\n2705\n2706\n2707\n2708\n2709\n2710\n2711\n2712\n2713\n2714\n2715\n2716\n2717\n2718\n2719\n2720\n2721\n2722\n2723\n2724\n2725\n2726\n2727\n2728\n2729\n2730\n2731\n2732\n2733\n2734\n2735\n2736\n2737\n2738\n2739\n2740\n2741\n2742\n2743\n2744\n2745\n2746\n2747\n2748\n2749\n2750\n2751\n2752\n2753\n2754\n2755\n2756\n2757\n2758\n2759\n2760\n2761\n2762\n2763\n2764\n2765\n2766\n2767\n2768\n2769\n2770\n2771\n2772\n2773\n2774\n2775\n2776\n2777\n2778\n2779\n2780\n2781\n2782\n2783\n2784\n2785\n2786\n2787\n2788\n2789\n2790\n2791\n2792\n2793\n2794\n2795\n2796\n2797\n2798\n2799\n2800\n2801\n2802\n2803\n2804\n2805\n2806\n2807\n2808\n2809\n2810\n2811\n2812\n2813\n2814\n2815\n2816\n2817\n2818\n2819\n2820\n2821\n2822\n2823\n2824\n2825\n2826\n2827\n2828\n2829\n2830\n2831\n2832\n2833\n2834\n2835\n2836\n2837\n2838\n2839\n2840\n2841\n2842\n2843\n2844\n2845\n2846\n2847\n2848\n2849\n2850\n2851\n2852\n2853\n2854\n2855\n2856\n2857\n2858\n2859\n2860\n2861\n2862\n2863\n2864\n2865\n2866\n2867\n2868\n2869\n2870\n2871\n2872\n2873\n2874\n2875\n2876\n2877\n2878\n2879\n2880\n2881\n2882\n2883\n2884\n2885\n2886\n2887\n2888\n2889\n2890\n2891\n2892\n2893\n2894\n2895\n2896\n2897\n2898\n2899\n2900\n2901\n2902\n2903\n2904\n2905\n2906\n2907\n2908\n2909\n2910\n2911\n2912\n2913\n2914\n2915\n2916\n2917\n2918\n2919\n2920\n2921\n2922\n2923\n2924\n2925\n2926\n2927\n2928\n2929\n2930\n2931\n2932\n2933\n2934\n2935\n2936\n2937\n2938\n2939\n2940\n2941\n2942\n2943\n2944\n2945\n2946\n2947\n2948\n2949\n2950\n2951\n2952\n2953\n2954\n2955\n2956\n2957\n2958\n2959\n2960\n2961\n2962\n2963\n2964\n2965\n2966\n2967\n2968\n2969\n2970\n2971\n2972\n2973\n2974\n2975\n2976\n2977\n2978\n2979\n2980\n2981\n2982\n2983\n2984\n2985\n2986\n2987\n2988\n2989\n2990\n2991\n2992\n2993\n2994\n2995\n2996\n2997\n2998\n2999\n3000\n3001\n3002\n3003\n3004\n3005\n3006\n3007\n3008\n3009\n3010\n3011\n3012\n3013\n3014\n3015\n3016\n3017\n3018\n3019\n3020\n3021\n3022\n3023\n3024\n3025\n3026\n3027\n3028\n3029\n3030\n3031\n3032\n3033\n3034\n3035\n3036\n3037\n3038\n3039\n3040\n3041\n3042\n3043\n3044\n3045\n3046\n3047\n3048\n3049\n3050\n3051\n3052\n3053\n3054\n3055\n3056\n3057\n3058\n3059\n3060\n3061\n3062\n3063\n3064\n3065\n3066\n3067\n3068\n3069\n3070\n3071\n3072\n3073\n3074\n3075\n3076\n3077\n3078\n3079\n3080\n3081\n3082\n3083\n3084\n3085\n3086\n3087\n3088\n3089\n3090\n3091\n3092\n3093\n3094\n3095\n3096\n3097\n3098\n3099\n3100\n3101\n3102\n3103\n3104\n3105\n3106\n3107\n3108\n3109\n3110\n3111\n3112\n3113\n3114\n3115\n3116\n3117\n3118\n3119\n3120\n3121\n3122\n3123\n3124\n3125\n3126\n3127\n3128\n3129\n3130\n3131\n3132\n3133\n3134\n3135\n3136\n3137\n3138\n3139\n3140\n3141\n3142\n3143\n3144\n3145\n3146\n3147\n3148\n3149\n3150\n3151\n3152\n3153\n3154\n3155\n3156\n3157\n3158\n3159\n3160\n3161\n3162\n3163\n3164\n3165\n3166\n3167\n3168\n3169\n3170\n3171\n3172\n3173\n3174\n3175\n3176\n3177\n3178\n3179\n3180\n3181\n3182\n3183\n3184\n3185\n3186\n3187\n3188\n3189\n3190\n3191\n3192\n3193\n3194\n3195\n3196\n3197\n3198\n3199\n3200\n3201\n3202\n3203\n3204\n3205\n3206\n3207\n3208\n3209\n3210\n3211\n3212\n3213\n3214\n3215\n3216\n3217\n3218\n3219\n3220\n3221\n3222\n3223\n3224\n3225\n3226\n3227\n3228\n3229\n3230\n3231\n3232\n3233\n3234\n3235\n3236\n3237\n3238\n3239\n3240\n3241\n3242\n3243\n3244\n3245\n3246\n3247\n3248\n3249\n3250\n3251\n3252\n3253\n3254\n3255\n3256\n3257\n3258\n3259\n3260\n3261\n3262\n3263\n3264\n3265\n3266\n3267\n3268\n3269\n3270\n3271\n3272\n3273\n3274\n3275\n3276\n3277\n3278\n3279\n3280\n3281\n3282\n3283\n3284\n3285\n3286\n3287\n3288\n3289\n3290\n3291\n3292\n3293\n3294\n3295\n3296\n3297\n3298\n3299\n3300\n3301\n3302\n3303\n3304\n3305\n3306\n3307\n3308\n3309\n3310\n3311\n3312\n3313\n3314\n3315\n3316\n3317\n3318\n3319\n3320\n3321\n3322\n3323\n3324\n3325\n3326\n3327\n3328\n3329\n3330\n3331\n3332\n3333\n3334\n3335\n3336\n3337\n3338\n3339\n3340\n3341\n3342\n3343\n3344\n3345\n3346\n3347\n3348\n3349\n3350\n3351\n3352\n3353\n3354\n3355\n3356\n3357\n3358\n3359\n3360\n3361\n3362\n3363\n3364\n3365\n3366\n3367\n3368\n3369\n3370\n3371\n3372\n3373\n3374\n3375\n3376\n3377\n3378\n3379\n3380\n3381\n3382\n3383\n3384\n3385\n3386\n3387\n3388\n3389\n3390\n3391\n3392\n3393\n3394\n3395\n3396\n3397\n3398\n3399\n3400\n3401\n3402\n3403\n3404\n3405\n3406\n3407\n3408\n3409\n3410\n3411\n3412\n3413\n3414\n3415\n3416\n3417\n3418\n3419\n3420\n3421\n3422\n3423\n3424\n3425\n3426\n3427\n3428\n3429\n3430\n3431\n3432\n3433\n3434\n3435\n3436\n3437\n3438\n3439\n3440\n3441\n3442\n3443\n3444\n3445\n3446\n3447\n3448\n3449\n3450\n3451\n3452\n3453\n3454\n3455\n3456\n3457\n3458\n3459\n3460\n3461\n3462\n3463\n3464\n3465\n3466\n3467\n3468\n3469\n3470\n3471\n3472\n3473\n3474\n3475\n3476\n3477\n3478\n3479\n3480\n3481\n3482\n3483\n3484\n3485\n3486\n3487\n3488\n3489\n3490\n3491\n3492\n3493\n3494\n3495\n3496\n3497\n3498\n3499\n3500\n3501\n3502\n3503\n3504\n3505\n3506\n3507\n3508\n3509\n3510\n3511\n3512\n3513\n3514\n3515\n3516\n3517\n3518\n3519\n3520\n3521\n3522\n3523\n3524\n3525\n3526\n3527\n3528\n3529\n3530\n3531\n3532\n3533\n3534\n3535\n3536\n3537\n3538\n3539\n3540\n3541\n3542\n3543\n3544\n3545\n3546\n3547\n3548\n3549\n3550\n3551\n3552\n3553\n3554\n3555\n3556\n3557\n3558\n3559\n3560\n3561\n3562\n3563\n3564\n3565\n3566\n3567\n3568\n3569\n3570\n3571\n3572\n3573\n3574\n3575\n3576\n3577\n3578\n3579\n3580\n3581\n3582\n3583\n3584\n3585\n3586\n3587\n3588\n3589\n3590\n3591\n3592\n3593\n3594\n3595\n3596\n3597\n3598\n3599\n3600\n3601\n3602\n3603\n3604\n3605\n3606\n3607\n3608\n3609\n3610\n3611\n3612\n3613\n3614\n3615\n3616\n3617\n3618\n3619\n3620\n3621\n3622\n3623\n3624\n3625\n3626\n3627\n3628\n3629\n3630\n3631\n3632\n3633\n3634\n3635\n3636\n3637\n3638\n3639\n3640\n3641\n3642\n3643\n3644\n3645\n3646\n3647\n3648\n3649\n3650\n3651\n3652\n3653\n3654\n3655\n3656\n3657\n3658\n3659\n3660\n3661\n3662\n3663\n3664\n3665\n3666\n3667\n3668\n3669\n3670\n3671\n3672\n3673\n3674\n3675\n3676\n3677\n3678\n3679\n3680\n3681\n3682\n3683\n3684\n3685\n3686\n3687\n3688\n3689\n3690\n3691\n3692\n3693\n3694\n3695\n3696\n3697\n3698\n3699\n3700\n3701\n3702\n3703\n3704\n3705\n3706\n3707\n3708\n3709\n3710\n3711\n3712\n3713\n3714\n3715\n3716\n3717\n3718\n3719\n3720\n3721\n3722\n3723\n3724\n3725\n3726\n3727\n3728\n3729\n3730\n3731\n3732\n3733\n3734\n3735\n3736\n3737\n3738\n3739\n3740\n3741\n3742\n3743\n3744\n3745\n3746\n3747\n3748\n3749\n3750\n3751\n3752\n3753\n3754\n3755\n3756\n3757\n3758\n3759\n3760\n3761\n3762\n3763\n3764\n3765\n3766\n3767\n3768\n3769\n3770\n3771\n3772\n3773\n3774\n3775\n3776\n3777\n3778\n3779\n3780\n3781\n3782\n3783\n3784\n3785\n3786\n3787\n3788\n3789\n3790\n3791\n3792\n3793\n3794\n3795\n3796\n3797\n3798\n3799\n3800\n3801\n3802\n3803\n3804\n3805\n3806\n3807\n3808\n3809\n3810\n3811\n3812\n3813\n3814\n3815\n3816\n3817\n3818\n3819\n3820\n3821\n3822\n3823\n3824\n3825\n3826\n3827\n3828\n3829\n3830\n3831\n3832\n3833\n3834\n3835\n3836\n3837\n3838\n3839\n3840\n3841\n3842\n3843\n3844\n3845\n3846\n3847\n3848\n3849\n3850\n3851\n3852\n3853\n3854\n3855\n3856\n3857\n3858\n3859\n3860\n3861\n3862\n3863\n3864\n3865\n3866\n3867\n3868\n3869\n3870\n3871\n3872\n3873\n3874\n3875\n3876\n3877\n3878\n3879\n3880\n3881\n3882\n3883\n3884\n3885\n3886\n3887\n3888\n3889\n3890\n3891\n3892\n3893\n3894\n3895\n3896\n3897\n3898\n3899\n3900\n3901\n3902\n3903\n3904\n3905\n3906\n3907\n3908\n3909\n3910\n3911\n3912\n3913\n3914\n3915\n3916\n3917\n3918\n3919\n3920\n3921\n3922\n3923\n3924\n3925\n3926\n3927\n3928\n3929\n3930\n3931\n3932\n3933\n3934\n3935\n3936\n3937\n3938\n3939\n3940\n3941\n3942\n3943\n3944\n3945\n3946\n3947\n3948\n3949\n3950\n3951\n3952\n3953\n3954\n3955\n3956\n3957\n3958\n3959\n3960\n3961\n3962\n3963\n3964\n3965\n3966\n3967\n3968\n3969\n3970\n3971\n3972\n3973\n3974\n3975\n3976\n3977\n3978\n3979\n3980\n3981\n3982\n3983\n3984\n3985\n3986\n3987\n3988\n3989\n3990\n3991\n3992\n3993\n3994\n3995\n3996\n3997\n3998\n3999\n4000\n4001\n4002\n4003\n4004\n4005\n4006\n4007\n4008\n4009\n4010\n4011\n4012\n4013\n4014\n4015\n4016\n4017\n4018\n4019\n4020\n4021\n4022\n4023\n4024\n4025\n4026\n4027\n4028\n4029\n4030\n4031\n4032\n4033\n4034\n4035\n4036\n4037\n4038\n4039\n4040\n4041\n4042\n4043\n4044\n4045\n4046\n4047\n4048\n4049\n4050\n4051\n4052\n4053\n4054\n4055\n4056\n4057\n4058\n4059\n4060\n4061\n4062\n4063\n4064\n4065\n4066\n4067\n4068\n4069\n4070\n4071\n4072\n4073\n4074\n4075\n4076\n4077\n4078\n4079\n4080\n4081\n4082\n4083\n4084\n4085\n4086\n4087\n4088\n4089\n4090\n4091\n4092\n4093\n4094\n4095\n4096\n4097\n4098\n4099\n4100\n4101\n4102\n4103\n4104\n4105\n4106\n4107\n4108\n4109\n4110\n4111\n4112\n4113\n4114\n4115\n4116\n4117\n4118\n4119\n4120\n4121\n4122\n4123\n4124\n4125\n4126\n4127\n4128\n4129\n4130\n4131\n4132\n4133\n4134\n4135\n4136\n4137\n4138\n4139\n4140\n4141\n4142\n4143\n4144\n4145\n4146\n4147\n4148\n4149\n4150\n4151\n4152\n4153\n4154\n4155\n4156\n4157\n4158\n4159\n4160\n4161\n4162\n4163\n4164\n4165\n4166\n4167\n4168\n4169\n4170\n4171\n4172\n4173\n4174\n4175\n4176\n4177\n4178\n4179\n4180\n4181\n4182\n4183\n4184\n4185\n4186\n4187\n4188\n4189\n4190\n4191\n4192\n4193\n4194\n4195\n4196\n4197\n4198\n4199\n4200\n4201\n4202\n4203\n4204\n4205\n4206\n4207\n4208\n4209\n4210\n4211\n4212\n4213\n4214\n4215\n4216\n4217\n4218\n4219\n4220\n4221\n4222\n4223\n4224\n4225\n4226\n4227\n4228\n4229\n4230\n4231\n4232\n4233\n4234\n4235\n4236\n4237\n4238\n4239\n4240\n4241\n4242\n4243\n4244\n4245\n4246\n4247\n4248\n4249\n4250\n4251\n4252\n4253\n4254\n4255\n4256\n4257\n4258\n4259\n4260\n4261\n4262\n4263\n4264\n4265\n4266\n4267\n4268\n4269\n4270\n4271\n4272\n4273\n4274\n4275\n4276\n4277\n4278\n4279\n4280\n4281\n4282\n4283\n4284\n4285\n4286\n4287\n4288\n4289\n4290\n4291\n4292\n4293\n4294\n4295\n4296\n4297\n4298\n4299\n4300\n4301\n4302\n4303\n4304\n4305\n4306\n4307\n4308\n4309\n4310\n4311\n4312\n4313\n4314\n4315\n4316\n4317\n4318\n4319\n4320\n4321\n4322\n4323\n4324\n4325\n4326\n4327\n4328\n4329\n4330\n4331\n4332\n4333\n4334\n4335\n4336\n4337\n4338\n4339\n4340\n4341\n4342\n4343\n4344\n4345\n4346\n4347\n4348\n4349\n4350\n4351\n4352\n4353\n4354\n4355\n4356\n4357\n4358\n4359\n4360\n4361\n4362\n4363\n4364\n4365\n4366\n4367\n4368\n4369\n4370\n4371\n4372\n4373\n4374\n4375\n4376\n4377\n4378\n4379\n4380\n4381\n4382\n4383\n4384\n4385\n4386\n4387\n4388\n4389\n4390\n4391\n4392\n4393\n4394\n4395\n4396\n4397\n4398\n4399\n4400\n4401\n4402\n4403\n4404\n4405\n4406\n4407\n4408\n4409\n4410\n4411\n4412\n4413\n4414\n4415\n4416\n4417\n4418\n4419\n4420\n4421\n4422\n4423\n4424\n4425\n4426\n4427\n4428\n4429\n4430\n4431\n4432\n4433\n4434\n4435\n4436\n4437\n4438\n4439\n4440\n4441\n4442\n4443\n4444\n4445\n4446\n4447\n4448\n4449\n4450\n4451\n4452\n4453\n4454\n4455\n4456\n4457\n4458\n4459\n4460\n4461\n4462\n4463\n4464\n4465\n4466\n4467\n4468\n4469\n4470\n4471\n4472\n4473\n4474\n4475\n4476\n4477\n4478\n4479\n4480\n4481\n4482\n4483\n4484\n4485\n4486\n4487\n4488\n4489\n4490\n4491\n4492\n4493\n4494\n4495\n4496\n4497\n4498\n4499\n4500\n4501\n4502\n4503\n4504\n4505\n4506\n4507\n4508\n4509\n4510\n4511\n4512\n4513\n4514\n4515\n4516\n4517\n4518\n4519\n4520\n4521\n4522\n4523\n4524\n4525\n4526\n4527\n4528\n4529\n4530\n4531\n4532\n4533\n4534\n4535\n4536\n4537\n4538\n4539\n4540\n4541\n4542\n4543\n4544\n4545\n4546\n4547\n4548\n4549\n4550\n4551\n4552\n4553\n4554\n4555\n4556\n4557\n4558\n4559\n4560\n4561\n4562\n4563\n4564\n4565\n4566\n4567\n4568\n4569\n4570\n4571\n4572\n4573\n4574\n4575\n4576\n4577\n4578\n4579\n4580\n4581\n4582\n4583\n4584\n4585\n4586\n4587\n4588\n4589\n4590\n4591\n4592\n4593\n4594\n4595\n4596\n4597\n4598\n4599\n4600\n4601\n4602\n4603\n4604\n4605\n4606\n4607\n4608\n4609\n4610\n4611\n4612\n4613\n4614\n4615\n4616\n4617\n4618\n4619\n4620\n4621\n4622\n4623\n4624\n4625\n4626\n4627\n4628\n4629\n4630\n4631\n4632\n4633\n4634\n4635\n4636\n4637\n4638\n4639\n4640\n4641\n4642\n4643\n4644\n4645\n4646\n4647\n4648\n4649\n4650\n4651\n4652\n4653\n4654\n4655\n4656\n4657\n4658\n4659\n4660\n4661\n4662\n4663\n4664\n4665\n4666\n4667\n4668\n4669\n4670\n4671\n4672\n4673\n4674\n4675\n4676\n4677\n4678\n4679\n4680\n4681\n4682\n4683\n4684\n4685\n4686\n4687\n4688\n4689\n4690\n4691\n4692\n4693\n4694\n4695\n4696\n4697\n4698\n4699\n4700\n4701\n4702\n4703\n4704\n4705\n4706\n4707\n4708\n4709\n4710\n4711\n4712\n4713\n4714\n4715\n4716\n4717\n4718\n4719\n4720\n4721\n4722\n4723\n4724\n4725\n4726\n4727\n4728\n4729\n4730\n4731\n4732\n4733\n4734\n4735\n4736\n4737\n4738\n4739\n4740\n4741\n4742\n4743\n4744\n4745\n4746\n4747\n4748\n4749\n4750\n4751\n4752\n4753\n4754\n4755\n4756\n4757\n4758\n4759\n4760\n4761\n4762\n4763\n4764\n4765\n4766\n4767\n4768\n4769\n4770\n4771\n4772\n4773\n4774\n4775\n4776\n4777\n4778\n4779\n4780\n4781\n4782\n4783\n4784\n4785\n4786\n4787\n4788\n4789\n4790\n4791\n4792\n4793\n4794\n4795\n4796\n4797\n4798\n4799\n4800\n4801\n4802\n4803\n4804\n4805\n4806\n4807\n4808\n4809\n4810\n4811\n4812\n4813\n4814\n4815\n4816\n4817\n4818\n4819\n4820\n4821\n4822\n4823\n4824\n4825\n4826\n4827\n4828\n4829\n4830\n4831\n4832\n4833\n4834\n4835\n4836\n4837\n4838\n4839\n4840\n4841\n4842\n4843\n4844\n4845\n4846\n4847\n4848\n4849\n4850\n4851\n4852\n4853\n4854\n4855\n4856\n4857\n4858\n4859\n4860\n4861\n4862\n4863\n4864\n4865\n4866\n4867\n4868\n4869\n4870\n4871\n4872\n4873\n4874\n4875\n4876\n4877\n4878\n4879\n4880\n4881\n4882\n4883\n4884\n4885\n4886\n4887\n4888\n4889\n4890\n4891\n4892\n4893\n4894\n4895\n4896\n4897\n4898\n4899\n4900\n4901\n4902\n4903\n4904\n4905\n4906\n4907\n4908\n4909\n4910\n4911\n4912\n4913\n4914\n4915\n4916\n4917\n4918\n4919\n4920\n4921\n4922\n4923\n4924\n4925\n4926\n4927\n4928\n4929\n4930\n4931\n4932\n4933\n4934\n4935\n4936\n4937\n4938\n4939\n4940\n4941\n4942\n4943\n4944\n4945\n4946\n4947\n4948\n4949\n4950\n4951\n4952\n4953\n4954\n4955\n4956\n4957\n4958\n4959\n4960\n4961\n4962\n4963\n4964\n4965\n4966\n4967\n4968\n4969\n4970\n4971\n4972\n4973\n4974\n4975\n4976\n4977\n4978\n4979\n4980\n4981\n4982\n4983\n4984\n4985\n4986\n4987\n4988\n4989\n4990\n4991\n4992\n4993\n4994\n4995\n4996\n4997\n4998\n4999\n5000\n5001\n5002\n5003\n5004\n5005\n5006\n5007\n5008\n5009\n5010\n5011\n5012\n5013\n5014\n5015\n5016\n5017\n5018\n5019\n5020\n5021\n5022\n5023\n5024\n5025\n5026\n5027\n5028\n5029\n5030\n5031\n5032\n5033\n5034\n5035\n5036\n5037\n5038\n5039\n5040\n5041\n5042\n5043\n5044\n5045\n5046\n5047\n5048\n5049\n5050\n5051\n5052\n5053\n5054\n5055\n5056\n5057\n5058\n5059\n5060\n5061\n5062\n5063\n5064\n5065\n5066\n5067\n5068\n5069\n5070\n5071\n5072\n5073\n5074\n5075\n5076\n5077\n5078\n5079\n5080\n5081\n5082\n5083\n5084\n5085\n5086\n5087\n5088\n5089\n5090\n5091\n5092\n5093\n5094\n5095\n5096\n5097\n5098\n5099\n5100\n5101\n5102\n5103\n5104\n5105\n5106\n5107\n5108\n5109\n5110\n5111\n5112\n5113\n5114\n5115\n5116\n5117\n5118\n5119\n5120\n5121\n5122\n5123\n5124\n5125\n5126\n5127\n5128\n5129\n5130\n5131\n5132\n5133\n5134\n5135\n5136\n5137\n5138\n5139\n5140\n5141\n5142\n5143\n5144\n5145\n5146\n5147\n5148\n5149\n5150\n5151\n5152\n5153\n5154\n5155\n5156\n5157\n5158\n5159\n5160\n5161\n5162\n5163\n5164\n5165\n5166\n5167\n5168\n5169\n5170\n5171\n5172\n5173\n5174\n5175\n5176\n5177\n5178\n5179\n5180\n5181\n5182\n5183\n5184\n5185\n5186\n5187\n5188\n5189\n5190\n5191\n5192\n5193\n5194\n5195\n5196\n5197\n5198\n5199\n5200\n5201\n5202\n5203\n5204\n5205\n5206\n5207\n5208\n5209\n5210\n5211\n5212\n5213\n5214\n5215\n5216\n5217\n5218\n5219\n5220\n5221\n5222\n5223\n5224\n5225\n5226\n5227\n5228\n5229\n5230\n5231\n5232\n5233\n5234\n5235\n5236\n5237\n5238\n5239\n5240\n5241\n5242\n5243\n5244\n5245\n5246\n5247\n5248\n5249\n5250\n5251\n5252\n5253\n5254\n5255\n5256\n5257\n5258\n5259\n5260\n5261\n5262\n5263\n5264\n5265\n5266\n5267\n5268\n5269\n5270\n5271\n5272\n5273\n5274\n5275\n5276\n5277\n5278\n5279\n5280\n5281\n5282\n5283\n5284\n5285\n5286\n5287\n5288\n5289\n5290\n5291\n5292\n5293\n5294\n5295\n5296\n5297\n5298\n5299\n5300\n5301\n5302\n5303\n5304\n5305\n5306\n5307\n5308\n5309\n5310\n5311\n5312\n5313\n5314\n5315\n5316\n5317\n5318\n5319\n5320\n5321\n5322\n5323\n5324\n5325\n5326\n5327\n5328\n5329\n5330\n5331\n5332\n5333\n5334\n5335\n5336\n5337\n5338\n5339\n5340\n5341\n5342\n5343\n5344\n5345\n5346\n5347\n5348\n5349\n5350\n5351\n5352\n5353\n5354\n5355\n5356\n5357\n5358\n5359\n5360\n5361\n5362\n5363\n5364\n5365\n5366\n5367\n5368\n5369\n5370\n5371\n5372\n5373\n5374\n5375\n5376\n5377\n5378\n5379\n5380\n5381\n5382\n5383\n5384\n5385\n5386\n5387\n5388\n5389\n5390\n5391\n5392\n5393\n5394\n5395\n5396\n5397\n5398\n5399\n5400\n5401\n5402\n5403\n5404\n5405\n5406\n5407\n5408\n5409\n5410\n5411\n5412\n5413\n5414\n5415\n5416\n5417\n5418\n5419\n5420\n5421\n5422\n5423\n5424\n5425\n5426\n5427\n5428\n5429\n5430\n5431\n5432\n5433\n5434\n5435\n5436\n5437\n5438\n5439\n5440\n5441\n5442\n5443\n5444\n5445\n5446\n5447\n5448\n5449\n5450\n5451\n5452\n5453\n5454\n5455\n5456\n5457\n5458\n5459\n5460\n5461\n5462\n5463\n5464\n5465\n5466\n5467\n5468\n5469\n5470\n5471\n5472\n5473\n5474\n5475\n5476\n5477\n5478\n5479\n5480\n5481\n5482\n5483\n5484\n5485\n5486\n5487\n5488\n5489\n5490\n5491\n5492\n5493\n5494\n5495\n5496\n5497\n5498\n5499\n5500\n5501\n5502\n5503\n5504\n5505\n5506\n5507\n5508\n5509\n5510\n5511\n5512\n5513\n5514\n5515\n5516\n5517\n5518\n5519\n5520\n5521\n5522\n5523\n5524\n5525\n5526\n5527\n5528\n5529\n5530\n5531\n5532\n5533\n5534\n5535\n5536\n5537\n5538\n5539\n5540\n5541\n5542\n5543\n5544\n5545\n5546\n5547\n5548\n5549\n5550\n5551\n5552\n5553\n5554\n5555\n5556\n5557\n5558\n5559\n5560\n5561\n5562\n5563\n5564\n5565\n5566\n5567\n5568\n5569\n5570\n5571\n5572\n5573\n5574\n5575\n5576\n5577\n5578\n5579\n5580\n5581\n5582\n5583\n5584\n5585\n5586\n5587\n5588\n5589\n5590\n5591\n5592\n5593\n5594\n5595\n5596\n5597\n5598\n5599\n5600\n5601\n5602\n5603\n5604\n5605\n5606\n5607\n5608\n5609\n5610\n5611\n5612\n5613\n5614\n5615\n5616\n5617\n5618\n5619\n5620\n5621\n5622\n5623\n5624\n5625\n5626\n5627\n5628\n5629\n5630\n5631\n5632\n5633\n5634\n5635\n5636\n5637\n5638\n5639\n5640\n5641\n5642\n5643\n5644\n5645\n5646\n5647\n5648\n5649\n5650\n5651\n5652\n5653\n5654\n5655\n5656\n5657\n5658\n5659\n5660\n5661\n5662\n5663\n5664\n5665\n5666\n5667\n5668\n5669\n5670\n5671\n5672\n5673\n5674\n5675\n5676\n5677\n5678\n5679\n5680\n5681\n5682\n5683\n5684\n5685\n5686\n5687\n5688\n5689\n5690\n5691\n5692\n5693\n5694\n5695\n5696\n5697\n5698\n5699\n5700\n5701\n5702\n5703\n5704\n5705\n5706\n5707\n5708\n5709\n5710\n5711\n5712\n5713\n5714\n5715\n5716\n5717\n5718\n5719\n5720\n5721\n5722\n5723\n5724\n5725\n5726\n5727\n5728\n5729\n5730\n5731\n5732\n5733\n5734\n5735\n5736\n5737\n5738\n5739\n5740\n5741\n5742\n5743\n5744\n5745\n5746\n5747\n5748\n5749\n5750\n5751\n5752\n5753\n5754\n5755\n5756\n5757\n5758\n5759\n5760\n5761\n5762\n5763\n5764\n5765\n5766\n5767\n5768\n5769\n5770\n5771\n5772\n5773\n5774\n5775\n5776\n5777\n5778\n5779\n5780\n5781\n5782\n5783\n5784\n5785\n5786\n5787\n5788\n5789\n5790\n5791\n5792\n5793\n5794\n5795\n5796\n5797\n5798\n5799\n5800\n5801\n5802\n5803\n5804\n5805\n5806\n5807\n5808\n5809\n5810\n5811\n5812\n5813\n5814\n5815\n5816\n5817\n5818\n5819\n5820\n5821\n5822\n5823\n5824\n5825\n5826\n5827\n5828\n5829\n5830\n5831\n5832\n5833\n5834\n5835\n5836\n5837\n5838\n5839\n5840\n5841\n5842\n5843\n5844\n5845\n5846\n5847\n5848\n5849\n5850\n5851\n5852\n5853\n5854\n5855\n5856\n5857\n5858\n5859\n5860\n5861\n5862\n5863\n5864\n5865\n5866\n5867\n5868\n5869\n5870\n5871\n5872\n5873\n5874\n5875\n5876\n5877\n5878\n5879\n5880\n5881\n5882\n5883\n5884\n5885\n5886\n5887\n5888\n5889\n5890\n5891\n5892\n5893\n5894\n5895\n5896\n5897\n5898\n5899\n5900\n5901\n5902\n5903\n5904\n5905\n5906\n5907\n5908\n5909\n5910\n5911\n5912\n5913\n5914\n5915\n5916\n5917\n5918\n5919\n5920\n5921\n5922\n5923\n5924\n5925\n5926\n5927\n5928\n5929\n5930\n5931\n5932\n5933\n5934\n5935\n5936\n5937\n5938\n5939\n5940\n5941\n5942\n5943\n5944\n5945\n5946\n5947\n5948\n5949\n5950\n5951\n5952\n5953\n5954\n5955\n5956\n5957\n5958\n5959\n5960\n5961\n5962\n5963\n5964\n5965\n5966\n5967\n5968\n5969\n5970\n5971\n5972\n5973\n5974\n5975\n5976\n5977\n5978\n5979\n5980\n5981\n5982\n5983\n5984\n5985\n5986\n5987\n5988\n5989\n5990\n5991\n5992\n5993\n5994\n5995\n5996\n5997\n5998\n5999\n6000\n6001\n6002\n6003\n6004\n6005\n6006\n6007\n6008\n6009\n6010\n6011\n6012\n6013\n6014\n6015\n6016\n6017\n6018\n6019\n6020\n6021\n6022\n6023\n6024\n6025\n6026\n6027\n6028\n6029\n6030\n6031\n6032\n6033\n6034\n6035\n6036\n6037\n6038\n6039\n6040\n6041\n6042\n6043\n6044\n6045\n6046\n6047\n6048\n6049\n6050\n6051\n6052\n6053\n6054\n6055\n6056\n6057\n6058\n6059\n6060\n6061\n6062\n6063\n6064\n6065\n6066\n6067\n6068\n6069\n6070\n6071\n6072\n6073\n6074\n6075\n6076\n6077\n6078\n6079\n6080\n6081\n6082\n6083\n6084\n6085\n6086\n6087\n6088\n6089\n6090\n6091\n6092\n6093\n6094\n6095\n6096\n6097\n6098\n6099\n6100\n6101\n6102\n6103\n6104\n6105\n6106\n6107\n6108\n6109\n6110\n6111\n6112\n6113\n6114\n6115\n6116\n6117\n6118\n6119\n6120\n6121\n6122\n6123\n6124\n6125\n6126\n6127\n6128\n6129\n6130\n6131\n6132\n6133\n6134\n6135\n6136\n6137\n6138\n6139\n6140\n6141\n6142\n6143\n6144\n6145\n6146\n6147\n6148\n6149\n6150\n6151\n6152\n6153\n6154\n6155\n6156\n6157\n6158\n6159\n6160\n6161\n6162\n6163\n6164\n6165\n6166\n6167\n6168\n6169\n6170\n6171\n6172\n6173\n6174\n6175\n6176\n6177\n6178\n6179\n6180\n6181\n6182\n6183\n6184\n6185\n6186\n6187\n6188\n6189\n6190\n6191\n6192\n6193\n6194\n6195\n6196\n6197\n6198\n6199\n6200\n6201\n6202\n6203\n6204\n6205\n6206\n6207\n6208\n6209\n6210\n6211\n6212\n6213\n6214\n6215\n6216\n6217\n6218\n6219\n6220\n6221\n6222\n6223\n6224\n6225\n6226\n6227\n6228\n6229\n6230\n6231\n6232\n6233\n6234\n6235\n6236\n6237\n6238\n6239\n6240\n6241\n6242\n6243\n6244\n6245\n6246\n6247\n6248\n6249\n6250\n6251\n6252\n6253\n6254\n6255\n6256\n6257\n6258\n6259\n6260\n6261\n6262\n6263\n6264\n6265\n6266\n6267\n6268\n6269\n6270\n6271\n6272\n6273\n6274\n6275\n6276\n6277\n6278\n6279\n6280\n6281\n6282\n6283\n6284\n6285\n6286\n6287\n6288\n6289\n6290\n6291\n6292\n6293\n6294\n6295\n6296\n6297\n6298\n6299\n6300\n6301\n6302\n6303\n6304\n6305\n6306\n6307\n6308\n6309\n6310\n6311\n6312\n6313\n6314\n6315\n6316\n6317\n6318\n6319\n6320\n6321\n6322\n6323\n6324\n6325\n6326\n6327\n6328\n6329\n6330\n6331\n6332\n6333\n6334\n6335\n6336\n6337\n6338\n6339\n6340\n6341\n6342\n6343\n6344\n6345\n6346\n6347\n6348\n6349\n6350\n6351\n6352\n6353\n6354\n6355\n6356\n6357\n6358\n6359\n6360\n6361\n6362\n6363\n6364\n6365\n6366\n6367\n6368\n6369\n6370\n6371\n6372\n6373\n6374\n6375\n6376\n6377\n6378\n6379\n6380\n6381\n6382\n6383\n6384\n6385\n6386\n6387\n6388\n6389\n6390\n6391\n6392\n6393\n6394\n6395\n6396\n6397\n6398\n6399\n6400\n6401\n6402\n6403\n6404\n6405\n6406\n6407\n6408\n6409\n6410\n6411\n6412\n6413\n6414\n6415\n6416\n6417\n6418\n6419\n6420\n6421\n6422\n6423\n6424\n6425\n6426\n6427\n6428\n6429\n6430\n6431\n6432\n6433\n6434\n6435\n6436\n6437\n6438\n6439\n6440\n6441\n6442\n6443\n6444\n6445\n6446\n6447\n6448\n6449\n6450\n6451\n6452\n6453\n6454\n6455\n6456\n6457\n6458\n6459\n6460\n6461\n6462\n6463\n6464\n6465\n6466\n6467\n6468\n6469\n6470\n6471\n6472\n6473\n6474\n6475\n6476\n6477\n6478\n6479\n6480\n6481\n6482\n6483\n6484\n6485\n6486\n6487\n6488\n6489\n6490\n6491\n6492\n6493\n6494\n6495\n6496\n6497\n6498\n6499\n6500\n6501\n6502\n6503\n6504\n6505\n6506\n6507\n6508\n6509\n6510\n6511\n6512\n6513\n6514\n6515\n6516\n6517\n6518\n6519\n6520\n6521\n6522\n6523\n6524\n6525\n6526\n6527\n6528\n6529\n6530\n6531\n6532\n6533\n6534\n6535\n6536\n6537\n6538\n6539\n6540\n6541\n6542\n6543\n6544\n6545\n6546\n6547\n6548\n6549\n6550\n6551\n6552\n6553\n6554\n6555\n6556\n6557\n6558\n6559\n6560\n6561\n6562\n6563\n6564\n6565\n6566\n6567\n6568\n6569\n6570\n6571\n6572\n6573\n6574\n6575\n6576\n6577\n6578\n6579\n6580\n6581\n6582\n6583\n6584\n6585\n6586\n6587\n6588\n6589\n6590\n6591\n6592\n6593\n6594\n6595\n6596\n6597\n6598\n6599\n6600\n6601\n6602\n6603\n6604\n6605\n6606\n6607\n6608\n6609\n6610\n6611\n6612\n6613\n6614\n6615\n6616\n6617\n6618\n6619\n6620\n6621\n6622\n6623\n6624\n6625\n6626\n6627\n6628\n6629\n6630\n6631\n6632\n6633\n6634\n6635\n6636\n6637\n6638\n6639\n6640\n6641\n6642\n6643\n6644\n6645\n6646\n6647\n6648\n6649\n6650\n6651\n6652\n6653\n6654\n6655\n6656\n6657\n6658\n6659\n6660\n6661\n6662\n6663\n6664\n6665\n6666\n6667\n6668\n6669\n6670\n6671\n6672\n6673\n6674\n6675\n6676\n6677\n6678\n6679\n6680\n6681\n6682\n6683\n6684\n6685\n6686\n6687\n6688\n6689\n6690\n6691\n6692\n6693\n6694\n6695\n6696\n6697\n6698\n6699\n6700\n6701\n6702\n6703\n6704\n6705\n6706\n6707\n6708\n6709\n6710\n6711\n6712\n6713\n6714\n6715\n6716\n6717\n6718\n6719\n6720\n6721\n6722\n6723\n6724\n6725\n6726\n6727\n6728\n6729\n6730\n6731\n6732\n6733\n6734\n6735\n6736\n6737\n6738\n6739\n6740\n6741\n6742\n6743\n6744\n6745\n6746\n6747\n6748\n6749\n6750\n6751\n6752\n6753\n6754\n6755\n6756\n6757\n6758\n6759\n6760\n6761\n6762\n6763\n6764\n6765\n6766\n6767\n6768\n6769\n6770\n6771\n6772\n6773\n6774\n6775\n6776\n6777\n6778\n6779\n6780\n6781\n6782\n6783\n6784\n6785\n6786\n6787\n6788\n6789\n6790\n6791\n6792\n6793\n6794\n6795\n6796\n6797\n6798\n6799\n6800\n6801\n6802\n6803\n6804\n6805\n6806\n6807\n6808\n6809\n6810\n6811\n6812\n6813\n6814\n6815\n6816\n6817\n6818\n6819\n6820\n6821\n6822\n6823\n6824\n6825\n6826\n6827\n6828\n6829\n6830\n6831\n6832\n6833\n6834\n6835\n6836\n6837\n6838\n6839\n6840\n6841\n6842\n6843\n6844\n6845\n6846\n6847\n6848\n6849\n6850\n6851\n6852\n6853\n6854\n6855\n6856\n6857\n6858\n6859\n6860\n6861\n6862\n6863\n6864\n6865\n6866\n6867\n6868\n6869\n6870\n6871\n6872\n6873\n6874\n6875\n6876\n6877\n6878\n6879\n6880\n6881\n6882\n6883\n6884\n6885\n6886\n6887\n6888\n6889\n6890\n6891\n6892\n6893\n6894\n6895\n6896\n6897\n6898\n6899\n6900\n6901\n6902\n6903\n6904\n6905\n6906\n6907\n6908\n6909\n6910\n6911\n6912\n6913\n6914\n6915\n6916\n6917\n6918\n6919\n6920\n6921\n6922\n6923\n6924\n6925\n6926\n6927\n6928\n6929\n6930\n6931\n6932\n6933\n6934\n6935\n6936\n6937\n6938\n6939\n6940\n6941\n6942\n6943\n6944\n6945\n6946\n6947\n6948\n6949\n6950\n6951\n6952\n6953\n6954\n6955\n6956\n6957\n6958\n6959\n6960\n6961\n6962\n6963\n6964\n6965\n6966\n6967\n6968\n6969\n6970\n6971\n6972\n6973\n6974\n6975\n6976\n6977\n6978\n6979\n6980\n6981\n6982\n6983\n6984\n6985\n6986\n6987\n6988\n6989\n6990\n6991\n6992\n6993\n6994\n6995\n6996\n6997\n6998\n6999\n7000\n7001\n7002\n7003\n7004\n7005\n7006\n7007\n7008\n7009\n7010\n7011\n7012\n7013\n7014\n7015\n7016\n7017\n7018\n7019\n7020\n7021\n7022\n7023\n7024\n7025\n7026\n7027\n7028\n7029\n7030\n7031\n7032\n7033\n7034\n7035\n7036\n7037\n7038\n7039\n7040\n7041\n7042\n7043\n7044\n7045\n7046\n7047\n7048\n7049\n7050\n7051\n7052\n7053\n7054\n7055\n7056\n7057\n7058\n7059\n7060\n7061\n7062\n7063\n7064\n7065\n7066\n7067\n7068\n7069\n7070\n7071\n7072\n7073\n7074\n7075\n7076\n7077\n7078\n7079\n7080\n7081\n7082\n7083\n7084\n7085\n7086\n7087\n7088\n7089\n7090\n7091\n7092\n7093\n7094\n7095\n7096\n7097\n7098\n7099\n7100\n7101\n7102\n7103\n7104\n7105\n7106\n7107\n7108\n7109\n7110\n7111\n7112\n7113\n7114\n7115\n7116\n7117\n7118\n7119\n7120\n7121\n7122\n7123\n7124\n7125\n7126\n7127\n7128\n7129\n7130\n7131\n7132\n7133\n7134\n7135\n7136\n7137\n7138\n7139\n7140\n7141\n7142\n7143\n7144\n7145\n7146\n7147\n7148\n7149\n7150\n7151\n7152\n7153\n7154\n7155\n7156\n7157\n7158\n7159\n7160\n7161\n7162\n7163\n7164\n7165\n7166\n7167\n7168\n7169\n7170\n7171\n7172\n7173\n7174\n7175\n7176\n7177\n7178\n7179\n7180\n7181\n7182\n7183\n7184\n7185\n7186\n7187\n7188\n7189\n7190\n7191\n7192\n7193\n7194\n7195\n7196\n7197\n7198\n7199\n7200\n7201\n7202\n7203\n7204\n7205\n7206\n7207\n7208\n7209\n7210\n7211\n7212\n7213\n7214\n7215\n7216\n7217\n7218\n7219\n7220\n7221\n7222\n7223\n7224\n7225\n7226\n7227\n7228\n7229\n7230\n7231\n7232\n7233\n7234\n7235\n7236\n7237\n7238\n7239\n7240\n7241\n7242\n7243\n7244\n7245\n7246\n7247\n7248\n7249\n7250\n7251\n7252\n7253\n7254\n7255\n7256\n7257\n7258\n7259\n7260\n7261\n7262\n7263\n7264\n7265\n7266\n7267\n7268\n7269\n7270\n7271\n7272\n7273\n7274\n7275\n7276\n7277\n7278\n7279\n7280\n7281\n7282\n7283\n7284\n7285\n7286\n7287\n7288\n7289\n7290\n7291\n7292\n7293\n7294\n7295\n7296\n7297\n7298\n7299\n7300\n7301\n7302\n7303\n7304\n7305\n7306\n7307\n7308\n7309\n7310\n7311\n7312\n7313\n7314\n7315\n7316\n7317\n7318\n7319\n7320\n7321\n7322\n7323\n7324\n7325\n7326\n7327\n7328\n7329\n7330\n7331\n7332\n7333\n7334\n7335\n7336\n7337\n7338\n7339\n7340\n7341\n7342\n7343\n7344\n7345\n7346\n7347\n7348\n7349\n7350\n7351\n7352\n7353\n7354\n7355\n7356\n7357\n7358\n7359\n7360\n7361\n7362\n7363\n7364\n7365\n7366\n7367\n7368\n7369\n7370\n7371\n7372\n7373\n7374\n7375\n7376\n7377\n7378\n7379\n7380\n7381\n7382\n7383\n7384\n7385\n7386\n7387\n7388\n7389\n7390\n7391\n7392\n7393\n7394\n7395\n7396\n7397\n7398\n7399\n7400\n7401\n7402\n7403\n7404\n7405\n7406\n7407\n7408\n7409\n7410\n7411\n7412\n7413\n7414\n7415\n7416\n7417\n7418\n7419\n7420\n7421\n7422\n7423\n7424\n7425\n7426\n7427\n7428\n7429\n7430\n7431\n7432\n7433\n7434\n7435\n7436\n7437\n7438\n7439\n7440\n7441\n7442\n7443\n7444\n7445\n7446\n7447\n7448\n7449\n7450\n7451\n7452\n7453\n7454\n7455\n7456\n7457\n7458\n7459\n7460\n7461\n7462\n7463\n7464\n7465\n7466\n7467\n7468\n7469\n7470\n7471\n7472\n7473\n7474\n7475\n7476\n7477\n7478\n7479\n7480\n7481\n7482\n7483\n7484\n7485\n7486\n7487\n7488\n7489\n7490\n7491\n7492\n7493\n7494\n7495\n7496\n7497\n7498\n7499\n7500\n7501\n7502\n7503\n7504\n7505\n7506\n7507\n7508\n7509\n7510\n7511\n7512\n7513\n7514\n7515\n7516\n7517\n7518\n7519\n7520\n7521\n7522\n7523\n7524\n7525\n7526\n7527\n7528\n7529\n7530\n7531\n7532\n7533\n7534\n7535\n7536\n7537\n7538\n7539\n7540\n7541\n7542\n7543\n7544\n7545\n7546\n7547\n7548\n7549\n7550\n7551\n7552\n7553\n7554\n7555\n7556\n7557\n7558\n7559\n7560\n7561\n7562\n7563\n7564\n7565\n7566\n7567\n7568\n7569\n7570\n7571\n7572\n7573\n7574\n7575\n7576\n7577\n7578\n7579\n7580\n7581\n7582\n7583\n7584\n7585\n7586\n7587\n7588\n7589\n7590\n7591\n7592\n7593\n7594\n7595\n7596\n7597\n7598\n7599\n7600\n7601\n7602\n7603\n7604\n7605\n7606\n7607\n7608\n7609\n7610\n7611\n7612\n7613\n7614\n7615\n7616\n7617\n7618\n7619\n7620\n7621\n7622\n7623\n7624\n7625\n7626\n7627\n7628\n7629\n7630\n7631\n7632\n7633\n7634\n7635\n7636\n7637\n7638\n7639\n7640\n7641\n7642\n7643\n7644\n7645\n7646\n7647\n7648\n7649\n7650\n7651\n7652\n7653\n7654\n7655\n7656\n7657\n7658\n7659\n7660\n7661\n7662\n7663\n7664\n7665\n7666\n7667\n7668\n7669\n7670\n7671\n7672\n7673\n7674\n7675\n7676\n7677\n7678\n7679\n7680\n7681\n7682\n7683\n7684\n7685\n7686\n7687\n7688\n7689\n7690\n7691\n7692\n7693\n7694\n7695\n7696\n7697\n7698\n7699\n7700\n7701\n7702\n7703\n7704\n7705\n7706\n7707\n7708\n7709\n7710\n7711\n7712\n7713\n7714\n7715\n7716\n7717\n7718\n7719\n7720\n7721\n7722\n7723\n7724\n7725\n7726\n7727\n7728\n7729\n7730\n7731\n7732\n7733\n7734\n7735\n7736\n7737\n7738\n7739\n7740\n7741\n7742\n7743\n7744\n7745\n7746\n7747\n7748\n7749\n7750\n7751\n7752\n7753\n7754\n7755\n7756\n7757\n7758\n7759\n7760\n7761\n7762\n7763\n7764\n7765\n7766\n7767\n7768\n7769\n7770\n7771\n7772\n7773\n7774\n7775\n7776\n7777\n7778\n7779\n7780\n7781\n7782\n7783\n7784\n7785\n7786\n7787\n7788\n7789\n7790\n7791\n7792\n7793\n7794\n7795\n7796\n7797\n7798\n7799\n7800\n7801\n7802\n7803\n7804\n7805\n7806\n7807\n7808\n7809\n7810\n7811\n7812\n7813\n7814\n7815\n7816\n7817\n7818\n7819\n7820\n7821\n7822\n7823\n7824\n7825\n7826\n7827\n7828\n7829\n7830\n7831\n7832\n7833\n7834\n7835\n7836\n7837\n7838\n7839\n7840\n7841\n7842\n7843\n7844\n7845\n7846\n7847\n7848\n7849\n7850\n7851\n7852\n7853\n7854\n7855\n7856\n7857\n7858\n7859\n7860\n7861\n7862\n7863\n7864\n7865\n7866\n7867\n7868\n7869\n7870\n7871\n7872\n7873\n7874\n7875\n7876\n7877\n7878\n7879\n7880\n7881\n7882\n7883\n7884\n7885\n7886\n7887\n7888\n7889\n7890\n7891\n7892\n7893\n7894\n7895\n7896\n7897\n7898\n7899\n7900\n7901\n7902\n7903\n7904\n7905\n7906\n7907\n7908\n7909\n7910\n7911\n7912\n7913\n7914\n7915\n7916\n7917\n7918\n7919\n7920\n7921\n7922\n7923\n7924\n7925\n7926\n7927\n7928\n7929\n7930\n7931\n7932\n7933\n7934\n7935\n7936\n7937\n7938\n7939\n7940\n7941\n7942\n7943\n7944\n7945\n7946\n7947\n7948\n7949\n7950\n7951\n7952\n7953\n7954\n7955\n7956\n7957\n7958\n7959\n7960\n7961\n7962\n7963\n7964\n7965\n7966\n7967\n7968\n7969\n7970\n7971\n7972\n7973\n7974\n7975\n7976\n7977\n7978\n7979\n7980\n7981\n7982\n7983\n7984\n7985\n7986\n7987\n7988\n7989\n7990\n7991\n7992\n7993\n7994\n7995\n7996\n7997\n7998\n7999\n8000\n8001\n8002\n8003\n8004\n8005\n8006\n8007\n8008\n8009\n8010\n8011\n8012\n8013\n8014\n8015\n8016\n8017\n\n<!doctype html>\n<html lang=\"es\">\n <head >\n <script>\n var BASE_URL = 'https://www.hiperdino.es/c9495/';\n var require = {\n \"baseUrl\": \"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES\"\n };\n</script>\n <meta charset=\"utf-8\"/>\n<meta name=\"description\" content=\"HiperDino, los mejores precios de Canarias, también online. Haz tu compra online, descárgate nuestro folleto de ofertas, localiza tu tienda más cercana o accede a nuestro portal de empleo.\"/>\n<meta name=\"robots\" content=\"INDEX,FOLLOW\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<meta name=\"format-detection\" content=\"telephone=no\"/>\n<title>Hiperdino - Arroz - Alimentación</title>\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/mage/calendar.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-grid.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-reboot.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/main.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/custom.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/animate.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/style2.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/Itoris_MultipleWishlists/css/mwishlist.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/Magento_Swatches/css/swatches.css\" />\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\"https://fonts.googleapis.com/css?family=Source+Sans+Pro\" />\n<script type=\"text/javascript\" src=\"https://www.hiperdino.es/pub/static/version1556565682/_cache/merged/3db68f5875afbd8f7d2ae9564f6c96d6.min.js\"></script>\n<link rel=\"icon\" type=\"image/x-icon\" href=\"https://cdn.hiperdino.es/favicon/default/icono-online64x64.png\" />\n<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"https://cdn.hiperdino.es/favicon/default/icono-online64x64.png\" />\n <!-- Facebook Pixel Code -->\n <script>\n !function(f,b,e,v,n,t,s)\n {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n n.queue=[];t=b.createElement(e);t.async=!0;\n t.src=v;s=b.getElementsByTagName(e)[0];\n s.parentNode.insertBefore(t,s)}(window,\n document,'script','https://connect.facebook.net/en_US/fbevents.js');\n\n fbq('init', '517201008809116');\n fbq('track', 'PageView');\n </script>\n <noscript>\n <img height='1' width='1' style='display:none'\n src='https://www.facebook.com/tr?id=517201008809116&\n ev=PageView&noscript=1'/>\n </noscript>\n <!-- End Facebook Pixel Code -->\n<link rel=\"stylesheet\" type=\"text/css\" media=\"all\"\n href=\"//maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css\"/> </head>\n <body data-container=\"body\" data-mage-init='{\"loaderAjax\": {}, \"loader\": { \"icon\": \"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/images/loader-2.gif\"}}' class=\"page-with-filter page-products categorypath-alimentacion-arroz category-arroz catalog-category-view page-layout-1column\">\n <section>\n<script>\n try {\n if (!window.localStorage || !window.sessionStorage) {\n throw new Error();\n }\n\n localStorage.setItem('storage_test', 1);\n localStorage.removeItem('storage_test');\n } catch(e) {\n (function () {\n var Storage = function (type) {\n var data;\n\n function createCookie(name, value, days) {\n var date, expires;\n\n if (days) {\n date = new Date();\n date.setTime(date.getTime()+(days * 24 * 60 * 60 * 1000));\n expires = '; expires=' + date.toGMTString();\n } else {\n expires = '';\n }\n document.cookie = name + '=' + value+expires+'; path=/';\n }\n\n function readCookie(name) {\n var nameEQ = name + '=',\n ca = document.cookie.split(';'),\n i = 0,\n c;\n\n for (i=0; i < ca.length; i++) {\n c = ca[i];\n\n while (c.charAt(0) === ' ') {\n c = c.substring(1,c.length);\n }\n\n if (c.indexOf(nameEQ) === 0) {\n return c.substring(nameEQ.length, c.length);\n }\n }\n\n return null;\n }\n\n function setData(data) {\n data = encodeURIComponent(JSON.stringify(data));\n createCookie(type === 'session' ? getSessionName() : 'localStorage', data, 365);\n }\n\n function clearData() {\n createCookie(type === 'session' ? getSessionName() : 'localStorage', '', 365);\n }\n\n function getData() {\n var data = type === 'session' ? readCookie(getSessionName()) : readCookie('localStorage');\n\n return data ? JSON.parse(decodeURIComponent(data)) : {};\n }\n\n function getSessionName() {\n if (!window.name) {\n window.name = new Date().getTime();\n }\n\n return 'sessionStorage' + window.name;\n }\n\n data = getData();\n\n return {\n length: 0,\n clear: function () {\n data = {};\n this.length = 0;\n clearData();\n },\n\n getItem: function (key) {\n return data[key] === undefined ? null : data[key];\n },\n\n key: function (i) {\n var ctr = 0,\n k;\n\n for (k in data) {\n if (ctr.toString() === i.toString()) {\n return k;\n } else {\n ctr++\n }\n }\n\n return null;\n },\n\n removeItem: function (key) {\n delete data[key];\n this.length--;\n setData(data);\n },\n\n setItem: function (key, value) {\n data[key] = value.toString();\n this.length++;\n setData(data);\n }\n };\n };\n\n window.localStorage.__proto__ = window.localStorage = new Storage('local');\n window.sessionStorage.__proto__ = window.sessionStorage = new Storage('session');\n })();\n }\n</script>\n\n<script type=\"text/x-magento-init\">\n {\n \"*\": {\n \"mage/cookies\": {\n \"expires\": null,\n \"path\": \"/\",\n \"domain\": \".www.hiperdino.es\",\n \"secure\": false,\n \"lifetime\": \"86400\"\n }\n }\n }\n</script>\n <noscript>\n <div class=\"message global noscript\">\n <div class=\"content\">\n <p>\n <strong>Parece que JavaScript está deshabilitado en su navegador.</strong>\n <span>For the best experience on our site, be sure to turn on Javascript in your browser.</span>\n </p>\n </div>\n </div>\n </noscript>\n <div role=\"alertdialog\"\n tabindex=\"-1\"\n class=\"message global cookie\"\n id=\"notice-cookie-block\"\n style=\"display: none;\">\n <div role=\"document\" class=\"content\" tabindex=\"0\">\n <p class=\"block__text\">\n <strong>Este sitio usa cookies propias y de terceros para facilitar la navegación, obtener información y estadísticas de uso de nuestros visitantes, y ofrecer contenido multimedia integrado.</strong>\n <span>Para más información consulte nuestra <a href=\"https://www.hiperdino.es/c9495/politica-cookies/\">POLÍTICA DE COOKIES.</a></span>\n </p>\n <div class=\"actions\">\n <button id=\"btn-cookie-allow\" class=\"action allow primary\">\n <span>Aceptar</span>\n </button>\n </div>\n </div>\n </div>\n <script type=\"text/x-magento-init\">\n {\n \"#notice-cookie-block\": {\n \"cookieNotices\": {\n \"cookieAllowButtonSelector\": \"#btn-cookie-allow\",\n \"cookieName\": \"user_allowed_save_cookie\",\n \"cookieValue\": {\"4\":1},\n \"cookieLifetime\": 31536000,\n \"noCookiesUrl\": \"https\\u003A\\u002F\\u002Fwww.hiperdino.es\\u002Fc9495\\u002Fcookie\\u002Findex\\u002FnoCookies\\u002F\"\n }\n }\n }\n </script>\n\n\n <noscript>\n <iframe src=\"//www.googletagmanager.com/ns.html?id=GTM-MF35972\" height=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"></iframe>\n </noscript>\n <script type=\"text/x-magento-init\">\n {\"*\":{\"yireoGoogleTagManager\":{\"attributes\":{\"categoryId\":\"168\",\"categoryName\":\"Arroz\",\"categorySize\":44,\"categoryProducts\":[{\"id\":\"3308\",\"name\":\" Trevijano quinoa 300 gr\",\"sku\":\"000000000001239768\",\"price\":\"4.7000\"},{\"id\":\"14412\",\"name\":\"La Campana arroz basmati 1 kg\",\"sku\":\"000000000006306021\",\"price\":\"2.5700\"},{\"id\":\"15881\",\"name\":\"La Campana arroz bomba 1 kg\",\"sku\":\"000000000009699557\",\"price\":\"2.8600\"},{\"id\":\"19164\",\"name\":\"Nomen arroz basmati 1 kg\",\"sku\":\"000000000002362748\",\"price\":\"2.9500\"}],\"pageType\":\"catalog\\/category\\/view\"},\"id\":\"GTM-MF35972\"}}}\n </script>\n\n</section><div id=\"mainView\" class=\"main__window category-page\"><header class=\"page-header\"><div class=\"top-bar-menu\">\n <div class=\"top-bar-menu__wrapper block--container flex-container flex-row justify-between\">\n <div class=\"top-bar-menu-left block--wrapper flex-item\">\n <div class=\"block--container flex-container flex-row items-center\">\n <div class=\"top-bar-menu__item item--wrapper is-hidden-mobile flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/contact/\" class=\"item--container flex-container flex-row items-center\">\n\t <div class=\"menu__text flex-item\">\n\t\t\t\t\t\t\tAtención al cliente </div>\n </a>\n </div>\n <div class=\"top-bar-menu__item item--wrapper is-hidden-mobile flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/noticias/\" class=\"item--container flex-container flex-row items-center\">\n\t <div class=\"menu__text flex-item\">Noticias</div>\n </a>\n </div>\n\t <div class=\"top-bar-menu__item item--wrapper is-hidden-mobile flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/folletos/\" class=\"item--container flex-container flex-row items-center\">\n\t <div class=\"menu__text flex-item\">Folletos</div>\n </a>\n </div>\n <div class=\"top-bar-menu__item item--wrapper is-hidden-mobile flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/empleo/\" class=\"item--container flex-container flex-row items-center\">\n\t <div class=\"menu__text flex-item\">Empleo</div>\n </a>\n </div>\n <div class=\"top-bar-menu__item item--wrapper is-hidden-mobile flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/tiendas/\" class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu__text flex-item\">Nuestras tiendas</div>\n </a>\n </div>\n </div>\n </div>\n <div class=\"top-bar-menu-right block--wrapper flex-item\">\n <div class=\"block--container flex-container flex-row items-center\">\n\t\t\t\t\n<input type=\"hidden\" value=\"\" id=\"showModalCP\"/>\n\n\n <div class=\"top-bar-menu__item item--wrapper flex-item hide-in-hdcheckout\" data-myaction=\"openCustomModal\" data-target=\"dialogBox-modal-postcode\">\n <a href=\"#\" class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu__icon icon--location flex-item\"><i class=\"icon icon-location-pin\"></i></div>\n <div class=\"menu__text flex-item\">Comprando para</div>\n <div class=\"menu__box flex-item\">38201</div>\n </a>\n </div>\n\n <div class=\"top-bar-menu__item item--wrapper flex-item hide-out-hdcheckout\">\n <div class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu__icon icon--location flex-item\"><i class=\"icon icon-location-pin\"></i></div>\n <div class=\"menu__text flex-item\">Comprando para</div>\n <div class=\"menu__box flex-item\" id=\"hdcheckout-buying-for\">38201</div>\n </div>\n </div>\n\n\t <div class=\"top-bar-menu__item top-bar-menu__item--horary item--wrapper flex-item\">\n <a href=\"#\" class=\"item--container flex-container flex-row items-center action_timeslotsModal\" data-source-url=\"\"\n data-hasbooking=\"\" data-time=\"\" data-max-time=\"30\">\n <div class=\"menu__icon icon--clock flex-item\">\n <i class=\"icon icon-clock\"></i>\n </div>\n <div class=\"menu__text flex-item\">Horarios de entrega</div>\n </a>\n</div>\n\n </div>\n </div>\n </div>\n</div><div id=\"main-menu\" class=\"main-menu\">\n <div class=\"block--container flex-container flex-row justify-between\">\n <div class=\"main-menu-left block--wrapper flex-item\">\n <div class=\"block--container flex-container flex-row items-center\">\n <div class=\"main-menu__item category--wrapper flex-item\">\n <button class=\"button button__group category--button flex-container flex-row items-center\">\n <div class=\"menu__hamburger flex-item\">\n <div class=\"hamburger--line flex-item\"></div>\n <div class=\"hamburger--line flex-item\"></div>\n <div class=\"hamburger--line flex-item\"></div>\n </div>\n </button>\n </div>\n <div class=\"main-menu__item item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/\" class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu__logo flex-item\"></div>\n </a>\n </div>\n </div>\n </div>\n\n <div class=\"main-menu-center block--wrapper flex-item flex-double\">\n <div class=\"block--container flex-container flex-row justify-center items-center\">\n <div class=\"main-menu__item search--wrapper flex-item\">\n <form class=\"form\" id=\"search_mini_form\" action=\"https://www.hiperdino.es/c9495/catalogsearch/result/\" method=\"get\">\n <div class=\"item--container flex-container flex-row items-center\" id=\"search\">\n <div class=\"menu-search flex-item\">\n <div class=\"menu-search--container flex-container flex-row items-center\">\n <button type=\"submit\" class=\"button button--search flex-item\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon icon-search flex-item\"></i>\n </div>\n </button>\n <input class=\"input--search input-text input__text flex-item flex-double\"\n placeholder=\"Buscar productos\"\n id=\"search-input\"\n type=\"text\"\n name=\"q\"\n value=\"\"\n maxlength=\"128\"\n role=\"combobox\"\n aria-haspopup=\"false\"\n aria-autocomplete=\"both\"\n autocomplete=\"off\"/>\n <button class=\"button button--search search--clear flex-item is-invisible\"\n id=\"searchClear\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </button>\n </div>\n</div>\n </div>\n </form>\n </div>\n </div>\n </div>\n\n <div class=\"main-menu-right block--wrapper flex-item\">\n <div class=\"block--container flex-container flex-row justify-end items-center\">\n <div class=\"main-menu__item search-mobile item--wrapper flex-item\" >\n <a id=\"search-mobile-icon\" href=\"\" class=\"item--container flex-container flex-row justify-center items-center\">\n <div class=\"menu__icon flex-item\">\n <i class=\"icon icon-search\"></i>\n </div>\n </a>\n </div>\n <div class=\"main-menu__item item--wrapper flex-item\">\n <a id=\"show-wishlists\" href=\"#\" class=\"item--container flex-container flex-row justify-center items-center\" data-logged-in=\"\"\n data-url=\"https://www.hiperdino.es/c9495/hdwishlists/xhr/all/viewAll/1/\">\n <div class=\"menu__icon icon--options-vertical flex-item\">\n <i class=\"icon icon-option\"></i>\n </div>\n <div class=\"menu__text flex-item\">\n Mis listas </div>\n </a>\n </div>\n <div class=\"main-menu__item item--wrapper flex-item\">\n\t\t\t\t\t <a href=\"#\" class=\"item--container flex-container flex-row justify-center items-center\" data-myaction=\"openCustomModal\"\n data-target=\"dialogBox-modal-login\">\n <div class=\"menu__icon flex-item\">\n <i class=\"icon icon-user\"></i>\n </div>\n <div class=\"user-mobile menu__text flex-item\">Mi Cuenta</div>\n </a>\n\t\t\t\t\t </div>\n\t\t\t\t<div class=\"main-menu__item basket--wrapper basket--mobile flex-item\">\n <a id=\"show-cart-mobile\" href=\"#\" class=\"item--container flex-container flex-row justify-center items-center\">\n <div class=\"menu__icon icon--basket flex-item\">\n <i class=\"icon icon-icon-cart\"></i>\n </div>\n <i class=\"badge is-invisible\"></i>\n </a>\n</div>\n<div class=\"main-menu__item basket--wrapper flex-item\">\n <a id=\"show-cart\" href=\"#\" class=\"item--container flex-container flex-row justify-center items-center\"\n data-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/info/\">\n <div class=\"menu__icon icon--basket flex-item \">\n <i class=\"icon icon-basket\"></i>\n </div>\n <div class=\"menu__price flex-item\">\n <span class=\"price\">0,00 €</span> </div>\n </a>\n</div> </div>\n </div>\n </div>\n</div>\n<div id=\"main-menu-mobile\" class=\"main-menu main-menu--mobile is-invisible\">\n <div class=\"block--container flex-container flex-row justify-between\">\n <div class=\"main-menu-center block--wrapper flex-item flex-double\">\n <div class=\"block--container flex-container flex-row justify-center items-center\">\n <div class=\"main-menu__item search--wrapper-mobile flex-item\">\n <form class=\"form\" id=\"search_mini_form_mobile\" action=\"https://www.hiperdino.es/c9495/catalogsearch/result/\" method=\"get\">\n <div class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu-search flex-item\">\n <div class=\"menu-search--container menu-search--container-mobile flex-container justify-between items-center\">\n <div class=\"flex-item\">\n <div class=\"flex-container items-center\">\n <button class=\"button button--search flex-item\" type=\"submit\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon-search flex-item\"></i>\n </div>\n </button>\n <input class=\"input--search input__text flex-item flex-double\"\n placeholder=\"Buscar productos\"\n id=\"search-mobile-input\"\n type=\"text\"\n name=\"q\"\n value=\"\"\n maxlength=\"128\"\n role=\"combobox\"\n aria-haspopup=\"false\"\n aria-autocomplete=\"both\"\n autocomplete=\"off\" />\n </div>\n </div>\n\n <button class=\"button button--search search--clear flex-item is-invisible\" id=\"searchMobileClear\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </button>\n </div>\n</div>\n </div>\n </form>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-login flex-container flex-row justify-center items-center\">\n <div class=\"dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n <div class=\"dialogBox__item dialogBox__login dialogBox__item--sixe-fixed flex-container flex-row-toggle justify-between\">\n <div class=\"login__control quickview__control--back\">\n <div class=\"button button__icon quickview__back flex-container flex-row justify-center items-center login__back\" data-myaction=\"backPostcodeFromLogin\">\n <i class=\"icon icon-arrow_back flex-item\"></i>\n </div>\n </div>\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-login\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n <div class=\"dialogBox__left flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n <div class=\"dialogBox__sub-title dialogBox__description--has-not-margin flex-item\">\n <div class=\"sub-title__text\">\n\t\t\t\t\t\t\tYa tengo una cuenta. </div>\n </div>\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t\t\t\t\tIniciar sesión. </div>\n </div>\n <div class=\"error-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n <div class=\"success-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n <form class=\"form form-login\" action=\"https://www.hiperdino.es/c9495/hiperdino_customer/account/loginAjax/\" method=\"post\" id=\"login-form\">\n\t\t\t\t\t\t<input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" /> <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"email\" name=\"login[username]\" class=\"input__text flex-item flex-double required-entry\" placeholder=\"Correo electrónico\" required>\n <label class=\"control-label\" for=\"input\">Correo electrónico</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"password\" name=\"login[password]\" class=\"input__text flex-item flex-double required-entry\" placeholder=\"Contraseña\" required>\n <label class=\"control-label\" for=\"input\">Contraseña</label>\n <div class=\"button button--password flex-item\" data-myaction=\"togglePasswordVisibility\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon icon-visibility flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"button__forgetPassword flex-item\">\n <div class=\"button flex-container flex-row items-center\" data-myaction=\"showForgotPassword\">\n <div class=\"button__text flex-item\">\n\t\t\t\t ¿Has olvidado tu contraseña? </div>\n </div>\n </div>\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container flex-container flex-row justify-center items-center\" data-myaction=\"tryLogin\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tContinuar </div>\n </div>\n </div>\n </button>\n </div>\n </form>\n </div>\n </div>\n\n <div class=\"dialogBox__right flex-item has-margin-top\">\n <div class=\"dialogBox__content flex-container flex-column\">\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n Crear una cuenta Hiperdino. </div>\n </div>\n <div class=\"dialogBox__description dialogBox__description--has-not-margin flex-item\">\n <div class=\"description__text\">\n Por favor introduce tu información para crear una nueva cuenta. </div>\n </div>\n <div class=\"cart__button block--wrapper flex-item has-margin-top\">\n <div class=\"button button__complex button__complex--modal has-border button__complex--container flex-container flex-row justify-center items-center\" data-myaction=\"showRegister\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n Crear cuenta </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n \n </div>\n </div>\n</div>\n\n<div class=\"dialogBox-modal dialogBox-modal-newsletter flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n\n <div class=\"dialogBox__item dialogBox__item--little not-padding dialogBox__newsMod dialogBox__item--sixe-fixed flex-container justify-between\">\n\n <div class=\"dialogBox__left dialogBox__left--fullheight-image flex-item postal-results-wrapper__image is-hidden-mobile\">\n <div class=\"dialogBox__content flex-container flex-column\">\n </div>\n </div>\n\n <div class=\"dialogBox__right dialogBox__right-has-padding newsletterBox__right flex-item\">\n <div class=\"dialogBox__content flex-container flex-column justify-center\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text title__text--newsMod\">\n ¡Gracias por formar parte de HiperDino Online! </div>\n </div>\n\n <div class=\"dialogBox__description newsletter__description flex-item\">\n <div class=\"description__text\">\n Si no te quieres perder nuestras ofertas especiales, únete: </div>\n </div>\n\n <input type=\"hidden\" value=\"\" id=\"showModalNewsletter\"/>\n\n <form class=\"form\" action=\"https://www.hiperdino.es/c9495/hiperdino_newsletter/newsletter/subscribeAjax/\" method=\"post\" id=\"subscribe-newsletter-form\">\n\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\"\n class=\"button button__complex button__complex--container button__complex--modal has-margin-bottom flex-container flex-row justify-center items-center\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\t Sí, deseo estar informado de todas las promociones. </div>\n </div>\n </div>\n </button>\n </div>\n\n </form>\n\n <form class=\"form\" action=\"https://www.hiperdino.es/c9495/hiperdino_newsletter/newsletter/denySubscribeAjax/\" method=\"post\" id=\"deny-newsletter-form\">\n\n <div class=\"cart__button block--wrapper flex-item\">\n <div class=\"button button__complex has-border button__complex--container button__complex--modal flex-container flex-row justify-center items-center\" data-myaction=\"denyNewsletter\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tNo me interesa, gracias </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n\n <div class=\"info__small_text\">\n Responsable: DINOSOL SUPERMERCADOS S.L. Finalidad: envío de newsletter y comunicaciones comerciales con ofertas y promociones que puedan resultar de su interés. Base de Legitimación: su consentimiento. Sus datos podrán ser cedidos a terceros. Sus datos serán conservados mientras no ejerza sus derechos de supresión u oposición o revoque su consentimiento. Derechos: Acceso, Rectificación, Supresión, Oposición, Portabilidad y Limitación del tratamiento. Puede revisar la información ampliada en nuestra <a target='_blank' href='https://www.hiperdino.es/c9495/politica-privacidad/'>P.Privacidad</a> </div>\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-discount flex-container flex-row justify-center items-center\">\n\t<div class=\"dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n\t\t<div class=\"dialogBox__item dialogBox__login dialogBox__item--sixe-fixed flex-container flex-row-toggle justify-between\">\n\t\t\t<div class=\"login__control quickview__control quickview__control-modal\">\n\t\t\t\t<div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\" data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-discount\">\n\t\t\t\t\t<i class=\"icon icon-close flex-item\"></i>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"dialogBox__full flex-item\">\n\t\t\t\t<div id=\"discount-table\" class=\"dialogBox__content flex-container flex-column\" data-url=\"https://www.hiperdino.es/c9495/hdpromotions/cart/promotionsajax/\"></div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n\n\n<div class=\"dialogBox-modal-register dialogBox-modal flex-container flex-row justify-center items-center\">\n <div class=\"register-modal dialogBox--wrapper flex-item\">\n\n <form class=\"form form-register\" action=\"https://www.hiperdino.es/c9495/hiperdino_customer/account/createAjax/\" method=\"post\" id=\"register-form\">\n\t <input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" /> <div class=\"dialogBox__item dialogBox__register flex-container flex-column flex-row-toggle justify-between\">\n <div class=\"login__control quickview__control--back\">\n <div class=\"button button__icon quickview__back flex-container flex-row justify-center items-center\" data-myaction=\"backLoginFromRegister\">\n <i class=\"icon icon-arrow_back flex-item\"></i>\n </div>\n </div>\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\" data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-register\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n <div class=\"dialogBox__register-item flex-item\">\n <div class=\"dialogBox__content flex-container\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t\t\t\t\t\tCrear una cuenta </div>\n </div>\n </div>\n </div>\n <div class=\"dialogBox__register-item flex-item\">\n <div class=\"dialogBox__content dialogBox__content-columns flex-container flex-wrap justify-between\">\n <div class=\"dialogBox__left flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n <div class=\"error-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n <div class=\"dialogBox__sub-title flex-item\">\n <div class=\"sub-title__text\">\n Datos personales </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"firstname\" class=\"input__text text--input flex-item flex-double required-entry\"\n placeholder=\"Nombre\" required>\n <label class=\"control-label\" for=\"firstname\">Nombre</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"lastname\" class=\"input__text text--input flex-item flex-double required-entry\"\n placeholder=\"Apellidos\" required>\n <label class=\"control-label\" for=\"lastname\">Apellidos</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"email\" name=\"email\" class=\"input__text flex-item flex-double required-entry\" required placeholder=\"Correo electrónico\">\n <label class=\"control-label\" for=\"email\">Correo electrónico</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"tel\" name=\"telephone\" class=\"input__text flex-item flex-double required-entry\" required placeholder=\"Teléfono\">\n <label class=\"control-label\" for=\"telephone\">Teléfono</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"date\" name=\"dob\" class=\"input__text flex-item flex-double required-entry\" required placeholder=\"Fecha de nacimiento\">\n <label class=\"control-label\" for=\"dob\">Fecha de nacimiento</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"password\" name=\"password\" class=\"input__text flex-item flex-double required-entry\"\n placeholder=\"Contraseña\" required>\n <label class=\"control-label\" for=\"password\">Contraseña</label>\n <div class=\"button button--password flex-item\" data-myaction=\"togglePasswordVisibility\">\n <div class=\"button__icon flex-container flex-row justify-center items-center\">\n <i class=\"icon icon-visibility flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"dialogBox__right flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__sub-title flex-item\">\n <div class=\"sub-title__text\">\n Dirección </div>\n </div>\n\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"street\" class=\"input__text flex-item flex-double required-entry\" required placeholder=\"Calle\">\n <label class=\"control-label\" for=\"street\">Calle / Nº / Piso / Puerta</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"city\" class=\"input__text flex-item flex-double required-entry\" required placeholder=\"Ciudad\">\n <label class=\"control-label\" for=\"city\">Municipio</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"postcode\" class=\"input__text flex-item flex-double required-entry\"\n placeholder=\"Código Postal\" required value=\"38201\">\n <label class=\"control-label\" for=\"postcode\">Código Postal</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"type-select type__select block--wrapper flex-item\">\n <div class=\"items--container flex-container flex-row justify-between normal-select\">\n <div class=\"select__item item--wrapper quickview-type__select flex-item\">\n <select class=\"select2-normal required-entry select2\" required name=\"region\" data-placeholder=\"Provincia\">\n <option></option>\n <option value=\"157\">Las Palmas</option>\n <option value=\"170\">Santa Cruz de Tenerife</option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"block__text info__small_text no-margin justify__text\">Sus datos serán tratados por DINOSOL SUPERMERCADOS S.L., con el fin de gestionar su registro como usuario, gestionar sus compras online y enviarle comunicaciones comerciales. Sus datos son tratados en base al consentimiento prestado. Sus datos personales no serán cedidos o comunicados a terceros . Los usuarios cuyos datos sean objeto de tratamiento podrán ejercitar gratuitamente los derechos de acceso e información, rectificación, cancelación/supresión o, en su caso, oposición de sus datos, en los términos especificados en el Reglamento General de Protección de Datos de Carácter Personal, conforme al procedimiento legalmente establecido de acuerdo con la información ampliada en nuestra <a target=\"_blank\" href=\"https://www.hiperdino.es/c9495/politica-privacidad/\">P.Privacidad</a></div>\n\n <div class=\"input input-radio-container flex-container flex-row items-center no-margin\">\n <div class=\"input--radio input--radio--card flex-item\">\n <input type=\"checkbox\" value=\"retrieve\" id=\"subscribe\" name=\"is_subscribed\"/>\n <label for=\"subscribe\">\n <span></span>\n </label>\n </div>\n\n <p class=\"block__text block__text--register info__small_text\">\n <label for=\"subscribe\">Deseo suscribirme al newsletter semanal con ofertas especiales</label>\n </p>\n </div>\n\n <div class=\"input input-radio-container flex-container flex-row items-center\">\n <div class=\"input--radio input--radio--card flex-item\">\n <input type=\"checkbox\" value=\"retrieve\" id=\"terms\" name=\"terms_and_conditions\"\n class=\"required-entry\" required>\n <label for=\"terms\">\n <span></span>\n </label>\n </div>\n <p class=\"block__text block__text--register info__small_text\">\n <label for=\"terms\">Soy mayor de edad y declaro que he leído y acepto la política <a href=\"https://www.hiperdino.es/c9495/politica-privacidad/\">política de privacidad</a> y las <a href=\"https://www.hiperdino.es/c9495/condiciones-compra/\"> condiciones de compra.</a></label>\n </p>\n </div>\n </div>\n </div></div>\n </div>\n <div class=\"dialogBox__register-item cart__button block--wrapper flex-item flex-double\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container flex-container flex-row justify-center items-center\" data-myaction=\"tryRegister\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">Continuar</div>\n </div>\n </div>\n </button>\n </div>\n </div>\n </form>\n </div>\n</div>\n\n<div class=\"dialogBox-modal dialogBox-modal-forgotpassword flex-container flex-row justify-center items-center\">\n <div class=\"dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n <div class=\"dialogBox__item dialogBox__item--little dialogBox__recover flex-container justify-between\">\n\n <form class=\"form form-forgotpassword\" action=\"https://www.hiperdino.es/c9495/hiperdino_customer/account/forgotpasswordAjax/\" method=\"post\"\n id=\"forgotpassword-form\">\n\t\t\t\t<input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" />\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-forgotpassword\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t\t\t\t\t\tRecordar contraseña. </div>\n </div>\n\n <div class=\"dialogBox__sub-title dialogBox__description flex-item\">\n <div class=\"sub-title__text\">\n\t\t\t\t\t\t\t\tPor favor introduce tu información para reestablecer su contraseña. </div>\n </div>\n\n <div class=\"error-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"email\" name=\"email\" class=\"input__text flex-item flex-double required-entry\" required\n placeholder=\"Correo electrónico\">\n <label class=\"control-label\" for=\"email\">Correo electrónico</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container flex-container flex-row justify-center items-center\"\n data-myaction=\"tryForgotPassword\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tContinuar </div>\n </div>\n </div>\n </button>\n <div class=\"button__forgetPassword flex-item\">\n <div class=\"button flex-container flex-row items-center\" data-myaction=\"backLoginFromForgotPassword\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\tCrear una cuenta hiperdino </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n\n </form>\n\n </div>\n </div>\n</div>\n\n\n<div class=\"dialogBox-modal dialogBox-modal-forgotpasswordsuccess flex-container flex-row justify-center items-center\">\n <div class=\"dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n\n <div class=\"dialogBox__item dialogBox__item--little dialogBox__recover flex-container justify-between\">\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-forgotpasswordsuccess\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-container items-center flex-item\">\n <div class=\"dialogBox__content flex-container flex-column justify-center\">\n <div class=\"main-menu__item dialogBox__recover-item item--wrapper flex-item\">\n <a href=\"/\" class=\"item--container flex-container flex-row items-center\">\n <div class=\"menu__logo flex-item\">\n\n </div>\n </a>\n </div>\n <div class=\"dialogBox__sub-title dialogBox__description flex-item\">\n <div class=\"sub-title__text\">\n\t\t\t\t\t\t\tPerfecto, te hemos enviado un email de recuperación a: </div>\n </div>\n\n <div class=\"flex-item\">\n <h3 class=\"sub__title\" id=\"forgotpasswordEmail\">\n </h3>\n </div>\n\n\n </div>\n\n\n </div>\n\n\n </div>\n </div>\n</div>\n\n\n<div class=\"dialogBox-modal-postcode dialogBox-modal flex-container flex-row justify-center items-center\">\n\n <div class=\"postal-wrapper dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n\n <div class=\"dialogBox__item dialogBox__item--little not-padding dialogBox__postal dialogBox__item--sixe-fixed flex-container justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-postcode\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__left dialogBox__left--fullheight-image flex-item postal-results-wrapper__image is-hidden-mobile\">\n <div class=\"dialogBox__content flex-container flex-column\">\n </div>\n </div>\n\n <div class=\"dialogBox__right dialogBox__right-has-padding flex-item\">\n <div class=\"dialogBox__content flex-container flex-column justify-center\">\n\n <div class=\"dialogBox__sub-title dialogBox__description--has-not-margin flex-item\">\n <div class=\"sub-title__text has-less-height\">\n\t\t\t\t\t\t\t¡Bienvenido! </div>\n </div>\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t\t\t\t\tIntroduce tu Código Postal. </div>\n </div>\n\n <div class=\"dialogBox__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\t\t\tTe mostraremos la mejor oferta de productos de tu zona. </div>\n </div>\n\n <form class=\"form form-postcode\" action=\"https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/postcodeAjax/\" method=\"post\" id=\"postcode-form\">\n\t\t\t\t\t\t<input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" />\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"number\" name=\"postcode\" class=\"input__text flex-item flex-double required-entry\" placeholder=\"Código Postal\"\n value=\"38201\" required>\n <label class=\"control-label\" for=\"postcode\">Código Postal</label>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\" class=\"button button__complex button__complex--container button__complex--modal has-margin-bottom flex-container flex-row justify-center items-center\"\n data-myaction=\"checkCp\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tEmpezar a comprar </div>\n </div>\n </div>\n </button>\n </div>\n\n </form>\n\n <div class=\"cart__button block--wrapper flex-item\">\n <div class=\"button button__complex has-border button__complex--container button__complex--modal flex-container flex-row justify-center items-center\"\n data-myaction=\"showLogin\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n Ya tengo una cuenta </div>\n </div>\n </div>\n </div>\n </div>\n\t </div>\n </div>\n\n </div>\n\n </div>\n\n</div>\n\n<div class=\"dialogBox-modal-pickup dialogBox-modal flex-container flex-row justify-center items-center\">\n\n <div class=\"postal-code-results dialogBox--wrapper dialogBox--wrapper-modal flex-item\">\n\n <div class=\"dialogBox__item dialogBox__item--little not-padding dialogBox__postal dialogBox__item--sixe-fixed flex-container justify-between\">\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-pickup\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n <div class=\"dialogBox__left dialogBox__left--fullheight-image flex-item pickup-results-wrapper__image is-hidden-mobile\">\n <div class=\"dialogBox__content flex-container flex-column\">\n </div>\n </div>\n <div class=\"dialogBox__right dialogBox__right-has-padding flex-item\">\n\n <div class=\"dialogBox__content flex-container flex-column justify-center\">\n\n <div class=\"dialogBox__sub-title flex-item\">\n <div class=\"sub-title__text\">\n\t\t\t\t\t\t\tPara el código postal: </div>\n </div>\n\n <div class=\"dialogBox__title flex-item\">\n <div id=\"postcodePickupShop\" class=\"title__text\">\n </div>\n </div>\n\n <div class=\"dialogBox__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\t\t\tNo disponemos de entrega a domicilio en tu zona pero puedes recoger tu pedido en alguna de estas tiendas: </div>\n </div>\n\n <div class=\"dialogBox__sub-title has-margin flex-item\">\n <div class=\"sub-title__text\">\n\t\t\t\t\t\t\tElige una tienda </div>\n </div>\n <form class=\"form form-pickup\" action=\"https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/pickupShopAjax/\" method=\"post\" id=\"pickup-form\">\n\t\t\t\t\t\t<input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" />\n <div class=\"type-select type-select-modal block--wrapper flex-item\">\n <div class=\"items--container flex-container flex-row justify-between normal-select\">\n <div class=\"select__item item--wrapper flex-item\">\n\t\t\t\t\t\t\t\t\t <select class=\"select2-normal required-entry select2\" name=\"pickupShop\" data-placeholder=\"Elige una Tienda\" required>\n <option></option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"4\">HIPERDINO MILLER</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"6\">HIPERDINO TOME CANO</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"7\">HIPERDINO CHAFIRAS II</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"8\">HIPERDINO PIEDRA REDONDA</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"9\">HIPERDINO VECINDARIO</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"13\">HIPERDINO GRAN TARAJAL</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"17\">HIPERDINO LAS ROTONDAS</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"222\">HIPERDINO SAN BARTOLOMÉ</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"234\">HIPERDINO EL PASO</option>\n\t\t\t\t\t\t\t\t\t\t <option value=\"250\">HIPERDINO AVDA. EL PUENTE</option>\n\t\t\t\t\t\t\t\t\t\t </select>\n </div>\n </div>\n </div>\n\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container has-margin-bottom flex-container flex-row justify-center items-center\"\n data-myaction=\"setPickupShop\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tEmpezar a comprar </div>\n </div>\n </div>\n </button>\n </div>\n </form>\n\n <div class=\"cart__button block--wrapper flex-item\">\n <div class=\"button button__complex has-border button__complex--modal button__complex--container flex-container flex-row justify-center items-center\"\n data-myaction=\"showPostcodeModal\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\tIntroduce otro código postal </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-warning flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t\t\t\t\t¡Cuidado! </div>\n </div>\n\n <div class=\"dialogBox__sub-title dialogBox__description flex-item\">\n <div class=\"sub-title__text is-invisible\" data-type=\"1\">\n\t\t\t\t\t\t\tSi cambias el código postal, es posible que se te redirija a otra tienda y pierdas las configuraciones actuales. </div>\n <div class=\"sub-title__text is-invisible\" data-type=\"2\">\n\t\t\t\t\t\t\tLa información de tu cuenta no coincide con la configuración actual. ¿Deseas continuar con los datos de tu cuenta? Si cambias es posible que se te redirija a otra tienda y pierdas las configuraciones actuales. </div>\n <div class=\"sub-title__text is-invisible\" data-type=\"3\">\n\t\t\t\t\t\t\tAun no tienes información sobre tu tienda preferida. ¡Puedes cambiarla en cualquier momento cambiando el código postal! </div>\n <div class=\"sub-title__text is-invisible\" data-type=\"4\">\n\t\t\t\t\t\t\tPor favor introduce tu información para crear una nueva cuenta. </div>\n </div>\n <form class=\"form form-warning\" action=\"https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/acceptWarningAjax/\" method=\"post\" id=\"warning-form\">\n\t\t\t\t\t\t<input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" />\n <input type=\"hidden\" name=\"postcode\" value=\"\">\n <input type=\"hidden\" name=\"pickup\" value=\"\">\n\n <div class=\"cart__button block--wrapper flex-item\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container has-margin-bottom flex-container flex-row justify-center items-center\"\n data-myaction=\"acceptWarning\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\t\tContinuar </div>\n </div>\n </div>\n </button>\n </div>\n </form>\n <div class=\"cart__button block--wrapper flex-item\">\n <div id=\"cancel-warning\" class=\"button button__complex has-border button__complex--modal button__complex--container flex-container flex-row justify-center items-center\"\n data-myaction=\"cancelWarning\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\t\t\t\tMe quedo como estaba </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div>\n\n<div class=\"quickview-modal flex-container flex-row justify-center items-center\">\n\n <div class=\"quickview--wrapper flex-item\">\n\n <div class=\"quickview__item flex-container flex-row-toggle justify-between\" id=\"quickview-demo\">\n\n <div class=\"quickview__left flex-item\">\n <div class=\"quickview__gallery flex-container flex-column\">\n\n <div class=\"top__badges is-hidden-desktop flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n <div class=\"offer--badge is-invisible badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n Oferta </div>\n </div>\n <div class=\"promotion--badge is-invisible badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n <!-- Promotion Description -->\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"quickview__title is-hidden-desktop flex-item\">\n <div class=\"title__text\">\n <!-- Product Name -->\n </div>\n </div>\n\n <div class=\"gallery__swiper swiper-container flex-item\">\n <div class=\"swiper-wrapper items-center\">\n <!-- Product Big Images -->\n </div>\n </div>\n\n <div class=\"gallery__thumbs swiper-container flex-item\">\n <div class=\"swiper-wrapper items-center\">\n <!-- Product Thumb -->\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"quickview__right flex-item\">\n <div class=\"quickview__content flex-container flex-column\">\n\n <div class=\"top__badges is-hidden-mobile flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n <div class=\"offer--badge is-invisible badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t Oferta </div>\n </div>\n <div class=\"promotion--badge is-invisible badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n <!-- Promotion Description -->\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"quickview__title is-hidden-mobile flex-item\">\n <div class=\"title__text\">\n <!-- Product Name -->\n </div>\n </div>\n\n <div class=\"quickview__description flex-item\">\n <!-- Product Price Text -->\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n <!-- Tags -->\n </div>\n </div>\n\n <div class=\"quickview__price flex-item\">\n <div class=\"quickview__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">\n <!-- Special Price -->\n </div>\n </div>\n <div class=\"price__right price--previous flex-item is-invisible\">\n <div class=\"price__text\">\n <!-- Price -->\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"wrapper_addToCartComponent\">\n <div class=\"quickview__buttons flex-item\">\n <div class=\"quickview__buttons--container flex-container flex-column\">\n\n <div class=\"button__type flex-item is-invisible\">\n <div class=\"button__type--container flex-container flex-row justify-between\">\n <div class=\"type__item flex-item flex-half\"\n data-product-id=\"\"\n data-item-id=\"\"\n data-min_qty=\"\"\n data-qty-unit=\"\"\n data-qty=\"\"\n data-qty_label=\"\"\n data-options=\"\">\n <div class=\"button button__complex button--units is-selected border--grey has-border flex-container flex-row justify-center items-center\"\n data-myaction=\"addUnits\">\n <div class=\"button__content border--grey flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-between items-center\">\n <div class=\"button__text flex-item\">\n Por unidades </div>\n\n <div class=\"button__checkdot flex-item\"></div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"type__item flex-item flex-half\"\n data-product-id=\"\"\n data-item-id=\"\"\n data-min_qty=\"\"\n data-qty-unit=\"\"\n data-qty=\"\"\n data-qty_label=\"\"\n data-options=\"\">\n <div class=\"button button__complex button--weight border--grey has-border flex-container flex-row justify-center items-center\"\n data-myaction=\"addWeight\">\n <div class=\"button__content border--grey flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-between items-center\">\n <div class=\"button__text flex-item\">\n Por peso </div>\n\n <div class=\"button__checkdot flex-item\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"selector__buttons is-disabled flex-item wrapper_weightSelector\">\n <div class=\"weight__title flex-container flex-row items-center\">\n <div class=\"weight__line flex-item\"></div>\n <div class=\"weight__text flex-item\">Selecciona el peso</div>\n <div class=\"weight__line flex-item\"></div>\n </div>\n <div class=\"selector__buttons--container flex-container flex-row justify-between\">\n <div class=\"type__item type__item--kg flex-item flex-half\">\n <div class=\"button__complex border--grey has-border has-buttons flex-container flex-row justify-center items-center\">\n <div class=\"button__content border--grey flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-between items-center wrapper_weightKgs\">\n <div class=\"button__text flex-item flex-double\">\n <span class=\"weight-qty\"></span> <span> Kg</span>\n </div>\n <div class=\"block--wrapper flex-item\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"button button__icon flex-container flex-row justify-center items-center productview-item-modify-qty\"\n data-action=\"decrease\"\n data-unit=\"kg\"\n data-item-id=\"\"\n data-real-item-id=\"\"\n data-min-qty=\"\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"button button__icon flex-container flex-row justify-center items-center productview-item-modify-qty\"\n data-action=\"increase\"\n data-unit=\"kg\"\n data-item-id=\"\"\n data-real-item-id=\"\"\n data-max-qty=\"20\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"type__item type__item--gr flex-item flex-half\">\n <div class=\"button__complex border--grey has-border has-buttons flex-container flex-row justify-center items-center\">\n <div class=\"button__content border--grey flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-between items-center wrapper_weightGrs\">\n <div class=\"button__text flex-item flex-double\">\n <span class=\"weight-qty\"></span> <span> gr</span>\n </div>\n <div class=\"block--wrapper flex-item\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"button button__icon flex-container flex-row justify-center items-center productview-item-modify-qty\"\n data-action=\"decrease\"\n data-unit=\"gr\"\n data-item-id=\"\"\n data-real-item-id=\"\"\n data-min-qty=\"\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"button button__icon flex-container flex-row justify-center items-center productview-item-modify-qty\"\n data-action=\"increase\"\n data-unit=\"gr\"\n data-item-id=\"\"\n data-real-item-id=\"\"\n data-max-qty=\"950\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"type-select block--wrapper flex-item is-invisible\">\n <div class=\"items--container flex-container flex-row-toggle justify-between\">\n <!-- Custom Options -->\n </div>\n </div>\n\n <div class=\"button__add2cart flex-item\">\n <div class=\"button button__complex flex-container flex-row justify-center items-center action-productViewAddToCart productViewAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"\"\n data-parent-id=\"\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"\"\n data-modify-url=\"\"\n data-remove-action-url=\"\"\n data-current-qty=\"\"\n data-min_qty=\"\"\n data-must-select=\"\"\n data-selected-options=\"\"\n data-product-qty-unit=\"\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item label-addToCart\">\n <span><!-- Cantidad --></span>\n <span>Añadir</span>\n </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQVQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeQVProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addQVProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"button__add2list flex-item\">\n <div class=\"button flex-container flex-row items-center action_wishlistAddProduct\" data-product-id=\"\">\n <div class=\"button__icon--small flex-item\">\n <i class=\"icon icon-option\"></i>\n </div>\n <div class=\"button__text flex-item\">\n Añadir a mi lista </div>\n </div>\n </div>\n\n </div>\n</div>\n </div>\n\n </div>\n </div>\n\n <div class=\"quickview__control\">\n <div class=\"button button__icon quickview__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeQuickview\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div><div class=\"dialogBox-modal dialogBox-modal-error flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-error\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n Ha ocurrido un error </div>\n </div>\n\n <div class=\"dialogBox__sub-title dialogBox__description flex-item\">\n <div id=\"error-modal-message\" class=\"sub-title__text\">\n </div>\n </div>\n\n </div>\n </div>\n\n </div>\n\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-timeslots flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-timeslots\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"w-100\">\n\n <div class=\"error-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n <div class=\"success-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n\n <div id=\"timeslots-modal-content-wrapper\"\n data-logged-in=\"0\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/xhr/selectMethod/form_key/JTZ8TY7ZrxstF7cc/\"\n data-source-url=\"https://www.hiperdino.es/c9495/hdcheckout/timeslots/getbooking/\"\n data-in-checkout=\"0\">\n\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-renewalert flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-renewalert\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column timeslots-renewalert-content-wrapper\">\n\n <div class=\"error-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n <div class=\"success-message is-invisible input input__complex--container flex-container\n flex-row justify-center items-center\"></div>\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n\t\t\t ¡Cuidado! </div>\n </div>\n\n <div class=\"dialogBox__sub-title dialogBox__description flex-item\">\n <div id=\"bookingText\">\n\t\t\t Tu reserva está a punto de caducar </div>\n <div class=\"\">\n <span class=\"timeleft\" data-time=\"\">\n </span>\n </div>\n </div>\n\n <form class=\"form form-timeslots-renew\" action=\"https://www.hiperdino.es/c9495/hdcheckout/timeslots/renew/\" method=\"post\"\n id=\"form-timeslots-renew\">\n <input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" />\n <div class=\"cart__button block--wrapper flex-item\">\n <div class=\"button button__complex button__complex--modal button__complex--container has-border has-margin-bottom flex-container flex-row justify-center items-center action-renewBooking\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">\n Renovar Reserva </div>\n </div>\n </div>\n </div>\n </div>\n </form>\n\n </div>\n </div>\n\n </div>\n\n </div>\n\n</div></header><main id=\"maincontent\" class=\"page-main\"><a id=\"contentarea\" tabindex=\"-1\"></a>\n<div class=\"window-content flex-container flex-row justify-start\">\n<div class=\"side-menu side-menu-user-account flex-container flex-column\">\n <div class=\"side-menu-body flex-item\">\n <div class=\"side-menu-body--container flex-container flex-column\">\n\n <div class=\"side-menu-controls--wrapper flex-item\">\n <div class=\"side-menu-controls--container flex-container flex-row justify-between\">\n <div class=\"side-menu-contols-left--wrapper flex-item flex-double\">\n <div class=\"side-menu-contols-left--container flex-container flex-row\">\n <div class=\"side-menu-controls__item item--wrapper flex-item\">\n <a href=\"#\" class=\"item--container flex-container flex-row items-center\" data-myaction=\"openCustomModal\" data-target=\"dialogBox-modal-postcode\">\n <div class=\"menu__icon icon--location flex-item\">\n <i class=\"icon icon-location-pin\"></i>\n </div>\n <div class=\"menu__text flex-item\">\n\t\t\tComprando para </div>\n <div class=\"menu__box flex-item\">38201</div>\n </a>\n</div> <div class=\"side-menu-controls__item side-menu-controls__item--horary item--wrapper flex-item\">\n <a href=\"#\" class=\"item--container flex-container flex-row items-center action_timeslotsModal\"\n data-source-url=\"https://www.hiperdino.es/c9495/hdcheckout/timeslots/get/\">\n <div class=\"menu__icon icon--clock flex-item\">\n <i class=\"icon icon-clock\"></i>\n </div>\n <div class=\"menu__text flex-item\">\n Horarios de entrega </div>\n </a>\n </div>\n </div>\n </div>\n <div class=\"side-menu-contols-right--wrapper flex-item\">\n <button class=\"button button__group category--button category--button-sidebar is-active flex-container flex-row items-center\">\n <div class=\"menu__hamburger flex-item\">\n <div class=\"hamburger--line flex-item\"></div>\n <div class=\"hamburger--line flex-item\"></div>\n <div class=\"hamburger--line flex-item\"></div>\n </div>\n </button>\n </div>\n </div>\n</div>\n\n <div class=\"side-menu-category--wrapper flex-item is-hidden-mobile\">\n <div class=\"side-menu-category--container flex-container flex-column\">\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-alimentacion flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Alimentación</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/aceites.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Aceites</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/aperitivo.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Aperitivo</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item is-selected\">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/arroz.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Arroz</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Azúcar y edulcorantes</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cacao y café</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Caldos, sopas y cremas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/cereales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cereales</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/chocolate.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Chocolate</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Comida internacional</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/condimentos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Condimentos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Conservas carne</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Conservas fruta y dulces</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Conservas pescado</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Conservas platos preparados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Conservas vegetales</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/dieteticos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Dietéticos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/galletas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Galletas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/golosinas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Golosinas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Harinas y gofio</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Infusiones y tés</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Legumbres secas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/panaderia.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Panadería</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/pasta.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Pasta</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Pastelería industrial</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/reposteria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Repostería</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/salsas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Salsas</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bebidas flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bebidas</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/agua.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Agua</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/alcoholicas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Alcohólicas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/cervezas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cervezas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/refrescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Refrescos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Zumos y néctares</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bodega flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bodega</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/espumosos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Espumosos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Sangría y tinto de verano</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/sidras.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Sidras</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-blanco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino blanco</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino de Jerez</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino de mesa</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-dulce.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino dulce</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-rosado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino rosado</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-tinto.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Vino tinto</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-frescos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Frescos</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Carne</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cárnicos envasados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Charcutería al corte</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Charcuteria envasada</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/fruta.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Fruta</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Panadería y pastelería</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Pescado y marisco</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Platos preparados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Quesos al corte</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/quesos-envasados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Quesos envasados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Salsas refrigeradas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Verduras y Hortalizas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Zumos y sopas refrigeradas</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-congelados flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Congelados</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/bases-y-masas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bases y masas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Carne</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/helados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Helados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/hielo.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Hielo</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Panadería y pastelería</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Pescado y marisco</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Platos preparados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Verduras y hortalizas</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-derivados-lacteos-y-huevos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Derivados lácteos y huevos</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Batidos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bebidas vegetales</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Café frío</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Flan</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Huevos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Leches</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Mantequilla</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Margarina</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Nata líquida</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Nata montada</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Natillas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Postres</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Yogur y petit</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bebe flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bebé</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/accesorios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Accesorios</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Alimentación</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/higiene.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Higiene</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-higiene-y-perfumeria flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Higiene y perfumería</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Afeitado</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cuidado corporal</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cuidado del cabello</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Cuidado facial</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Depilación</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Desodorantes</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Fragancias</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Higiene bucal</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Maquillaje</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Parafarmacia</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Protección e higiene íntima</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-drogueria-y-limpieza flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Droguería y limpieza</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Celulosa</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Detergentes ropa</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Limpieza</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Suavizantes ropa</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Tratamientos ropa</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-hogar flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Hogar</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Accesorios baño</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Limpieza del hogar</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-cocina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Menaje cocina</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-desechable.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Menaje desechable</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-mesa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Menaje mesa</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/ordenacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Ordenación</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Pequeño aparato eléctrico</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bazar flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bazar</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/automovil.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Automóvil</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/bricolaje.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bricolaje</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/jardineria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Jardinería</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/kiosco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Kiosco</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Menaje decoración</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/papeleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Papelería</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-mascotas flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Mascotas</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/mascotas/accesorios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Accesorios</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/mascotas/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Alimentación</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-ecologicos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Ecológicos</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Alimentación</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bebé</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/bebidas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bebidas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Derivados lácteos y huevos</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/frescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Frescos</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-gourmet flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Gourmet</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Alimentación</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/bebidas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Bebidas</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/congelados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Congelados</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/frescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Frescos</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group flex-item \">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-ocio flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Ocio</div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/camping.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Camping</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/jardin.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Jardín</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Playa y piscina</div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/varios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">Varios</div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"side-menu-category--wrapper user-menu flex-item\">\n <div class=\"side-menu-category--container flex-container flex-column\">\n <div class=\"category-group flex-item\">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header dropdown--trigger flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"menu__text dropdown--info flex-item flex-double\">Categorías</div>\n <div class=\"dropdown__control--container flex-container flex-row items-center\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-alimentacion flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Alimentación</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/aceites.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Aceites </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/aperitivo.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Aperitivo </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item is-selected\">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/arroz.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Arroz </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Azúcar y edulcorantes </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cacao y café </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Caldos, sopas y cremas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/cereales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cereales </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/chocolate.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Chocolate </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Comida internacional </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/condimentos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Condimentos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Conservas carne </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Conservas fruta y dulces </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Conservas pescado </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Conservas platos preparados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Conservas vegetales </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/dieteticos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Dietéticos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/galletas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Galletas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/golosinas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Golosinas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Harinas y gofio </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Infusiones y tés </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Legumbres secas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/panaderia.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Panadería </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/pasta.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Pasta </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Pastelería industrial </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/reposteria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Repostería </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion/salsas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Salsas </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bebidas flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bebidas</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/agua.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Agua </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/alcoholicas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Alcohólicas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/cervezas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cervezas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/refrescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Refrescos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Zumos y néctares </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bodega flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bodega</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/espumosos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Espumosos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Sangría y tinto de verano </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/sidras.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Sidras </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-blanco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino blanco </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino de Jerez </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino de mesa </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-dulce.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino dulce </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-rosado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino rosado </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bodega/vino-tinto.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Vino tinto </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-frescos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Frescos</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Carne </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cárnicos envasados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Charcutería al corte </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Charcuteria envasada </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/fruta.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Fruta </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Panadería y pastelería </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Pescado y marisco </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Platos preparados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Quesos al corte </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/quesos-envasados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Quesos envasados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Salsas refrigeradas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Verduras y Hortalizas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Zumos y sopas refrigeradas </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-congelados flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Congelados</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/bases-y-masas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bases y masas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/carne.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Carne </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/helados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Helados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/hielo.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Hielo </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Panadería y pastelería </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Pescado y marisco </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/platos-preparados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Platos preparados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Verduras y hortalizas </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-derivados-lacteos-y-huevos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Derivados lácteos y huevos</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Batidos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bebidas vegetales </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Café frío </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Flan </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Huevos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Leches </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Mantequilla </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Margarina </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Nata líquida </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Nata montada </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Natillas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Postres </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Yogur y petit </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bebe flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bebé</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/accesorios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Accesorios </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Alimentación </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bebe/higiene.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Higiene </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-higiene-y-perfumeria flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Higiene y perfumería</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Afeitado </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cuidado corporal </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cuidado del cabello </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Cuidado facial </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Depilación </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Desodorantes </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Fragancias </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Higiene bucal </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Maquillaje </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Parafarmacia </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Protección e higiene íntima </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-drogueria-y-limpieza flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Droguería y limpieza</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Celulosa </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Detergentes ropa </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Limpieza </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Suavizantes ropa </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Tratamientos ropa </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-hogar flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Hogar</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Accesorios baño </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Limpieza del hogar </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-cocina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Menaje cocina </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-desechable.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Menaje desechable </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/menaje-mesa.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Menaje mesa </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/ordenacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Ordenación </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Pequeño aparato eléctrico </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-bazar flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Bazar</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/automovil.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Automóvil </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/bricolaje.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bricolaje </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/jardineria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Jardinería </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/kiosco.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Kiosco </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Menaje decoración </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/bazar/papeleria.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Papelería </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-mascotas flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Mascotas</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/mascotas/accesorios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Accesorios </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/mascotas/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Alimentación </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-ecologicos flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Ecológicos</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Alimentación </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bebé </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/bebidas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bebidas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Derivados lácteos y huevos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ecologicos/frescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Frescos </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-gourmet flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Gourmet</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/alimentacion.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Alimentación </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/bebidas.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Bebidas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/congelados.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Congelados </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/gourmet/frescos.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Frescos </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n <div class=\"subcategory-group flex-item \">\n <div class=\"subcategory-group--container flex-container flex-column\">\n <div class=\"subcategory-group__header subdropdown--trigger flex-item\">\n <div class=\"subcategory-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"subdropdown__icon icon icon-right flex-item\"></i>\n </div>\n </div>\n <i class=\"category__icon cat-icon cat-icon-ocio flex-item\"></i>\n <div class=\"menu__text dropdown--header flex-item flex-double\">Ocio</div>\n </div>\n </div>\n <div class=\"subcategory-group__content flex-item \">\n <div class=\"subcategory-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/camping.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Camping </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/jardin.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Jardín </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Playa y piscina </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item \">\n <a href=\"https://www.hiperdino.es/c9495/ocio/varios.html\" class=\"link--wrapper\">\n <div class=\"sidebar__item menu--link\">\n Varios </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div> <div class=\"side-menu-info--wrapper flex-item\">\n <div class=\"side-menu-info--container flex-container flex-column \">\n <div class=\"category-group dropdown--trigger flex-item\">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control dropdown__control--info flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon--info icon icon-user\"></i>\n </div>\n </div>\n <div class=\"menu__text dropdown--info flex-item flex-double\">Mi cuenta</div>\n <div class=\"dropdown__control--container flex-container flex-row items-center\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"#\"\n class=\"link-info item--container flex-container flex-row items-center\"\n data-myaction=\"openCustomModal\"\n data-target=\"dialogBox-modal-login\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-user\"></i>\n </div>\n <div class=\"link--wrapper menu--link dropdown---info flex-item\">\n Iniciar sesión </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"#\"\n class=\"link-info item--container flex-container flex-row items-center\"\n data-myaction=\"openCustomModal\"\n data-target=\"dialogBox-modal-login\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-add\"></i>\n </div>\n <div class=\"link--wrapper menu--link dropdown---info flex-item\">\n Crear nueva cuenta </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <div class=\"category-group dropdown--trigger flex-item\">\n <div class=\"category-group--container flex-container flex-column\">\n <div class=\"category-group__header flex-item\">\n <div class=\"category-group__header--container flex-container flex-row items-center\">\n <div class=\"dropdown__control dropdown__control--info flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row justify-center items-center\">\n <i class=\"dropdown__icon--info icon icon-info\"></i>\n </div>\n </div>\n <div class=\"menu__text dropdown--info flex-item flex-double\">Información corporativa</div>\n <div class=\"dropdown__control--container flex-container flex-row items-center\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n <div class=\"category-group__content flex-item\">\n <ul class=\"category__list flex-container flex-column\">\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/contact/\" class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-Bubble\"></i>\n </div>\n <div class=\"linl--wrapper menu--link dropdown---info flex-item\">\n Atención al cliente </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/folletos/\" class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-Openbook\"></i>\n </div>\n <div class=\"flex-item\">\n Folletos </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/noticias/\" class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-news\"></i>\n </div>\n <div class=\"flex-item\">\n Noticias </div>\n </a>\n </li>\n\t <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/empleo/\"\n class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-Briefcase\"></i>\n </div>\n <div class=\"flex-item\">\n Empleo </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/tiendas/\" class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-house\"></i>\n </div>\n <div class=\"flex-item\">\n Nuestras tiendas </div>\n </a>\n </li>\n <li class=\"sidebar-item--wrapper flex-item\">\n <a href=\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\" class=\"link-info item--container flex-container flex-row items-center\">\n <div class=\"sidebar__item-info flex-item\">\n <i class=\"icon icon-payment\"></i>\n </div>\n <div class=\"flex-item\">\n Tarjeta Hiperdino </div>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n</div> </div>\n </div>\n</div>\n<div class=\"content--wrapper has-category flex-item flex-double\"><div class=\"page messages\"><div data-placeholder=\"messages\"></div>\n<div class=\"container container-message\" data-bind=\"scope: 'messages'\">\n <!-- ko if: cookieMessages && cookieMessages.length > 0 -->\n <div role=\"alert\" data-bind=\"foreach: { data: cookieMessages, as: 'message' }\" class=\"messages\">\n <div data-bind=\"attr: {\n class: 'message-' + message.type + ' ' + message.type + ' message ' + message.type + '-message input input__complex--container flex-container flex-row items-center',\n 'data-ui-id': 'message-' + message.type\n }\">\n <div data-bind=\"html: message.text\"></div>\n </div>\n </div>\n <!-- /ko -->\n <!-- ko if: messages().messages && messages().messages.length > 0 -->\n <div role=\"alert\" data-bind=\"foreach: { data: messages().messages, as: 'message' }\" class=\"messages\">\n <div data-bind=\"attr: {\n class: 'message-' + message.type + ' ' + message.type + ' message ' + message.type + '-message input input__complex--container flex-container flex-row items-center',\n 'data-ui-id': 'message-' + message.type\n }\">\n <div data-bind=\"html: message.text\"></div>\n </div>\n </div>\n <!-- /ko -->\n</div>\n\n<script type=\"text/x-magento-init\">\n {\n \"*\": {\n \"Magento_Ui/js/core/app\": {\n \"components\": {\n \"messages\": {\n \"component\": \"Magento_Theme/js/view/messages\"\n }\n }\n }\n }\n }\n</script>\n</div><section class=\"catalogue-products section--block\"><div class=\"section--header\"><div class=\"container\"> <div class=\"breadcrumbs\">\n <ul class=\"block--container flex-container flex-row\">\n <li class=\"breadcrumb__item flex-item home\">\n <a href=\"https://www.hiperdino.es/c9495/\" class=\"link--text\" title=\"Ir a la página de inicio\">Página de inicio</a>\n </li>\n <li class=\"breadcrumb__item flex-item category3\">\n <a href=\"https://www.hiperdino.es/c9495/alimentacion.html\" class=\"link--text\" title=\"\">Alimentación</a>\n </li>\n <li class=\"breadcrumb__item flex-item category168\">\n <a href=\"\" class=\"link--text\">Arroz</a>\n </li>\n </ul>\n </div>\n <h1 class=\"header__text category--header \">\n Arroz </h1>\n \n<div class=\"product-selector\">\n <div class=\"block--container flex-container flex-row flex-wrap justify-between\">\n\n <div class=\"products-filter-left block--wrapper flex-item flex-double\">\n <div class=\"items--container flex-container flex-row-toggle\">\n\n <div class=\"button__filter flex-item\">\n <div class=\"button flex-container flex-row items-center\" data-myaction=\"clearFilters\">\n <div class=\"button__icon--small flex-item\">\n <i class=\"icon icon-close\"></i>\n </div>\n <div class=\"button__text flex-item\">\n\t\t\t\t\t\t\tEliminar filtros </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"products-filter-right block--wrapper flex-item flex-double\">\n <div class=\"items--container flex-container flex-row justify-end\">\n <div class=\"order-select filter-select item--wrapper flex-item\">\n <div class=\"select__complex select--right has-border flex-container flex-row justify-center items-center\">\n <div class=\"select__item flex-item\">\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n</div></div></div><input name=\"form_key\" type=\"hidden\" value=\"JTZ8TY7ZrxstF7cc\" /><script type=\"text/x-magento-init\">\n{\"*\":{\"Magento_Customer\\/js\\/section-config\":{\"sections\":{\"stores\\/store\\/switch\":\"*\",\"directory\\/currency\\/switch\":\"*\",\"*\":[\"messages\"],\"customer\\/account\\/logout\":[\"recently_viewed_product\",\"recently_compared_product\"],\"customer\\/account\\/loginpost\":\"*\",\"customer\\/account\\/createpost\":\"*\",\"customer\\/account\\/editpost\":\"*\",\"customer\\/ajax\\/login\":[\"checkout-data\",\"cart\"],\"catalog\\/product_compare\\/add\":[\"compare-products\"],\"catalog\\/product_compare\\/remove\":[\"compare-products\"],\"catalog\\/product_compare\\/clear\":[\"compare-products\"],\"sales\\/guest\\/reorder\":[\"cart\"],\"sales\\/order\\/reorder\":[\"cart\"],\"review\\/product\\/post\":[\"review\"],\"checkout\\/cart\\/add\":[\"cart\"],\"checkout\\/cart\\/delete\":[\"cart\"],\"checkout\\/cart\\/updatepost\":[\"cart\",\"yireo-gtm-order\",\"yireo-gtm-quote\"],\"checkout\\/cart\\/updateitemoptions\":[\"cart\"],\"checkout\\/cart\\/couponpost\":[\"cart\"],\"checkout\\/cart\\/estimatepost\":[\"cart\"],\"checkout\\/cart\\/estimateupdatepost\":[\"cart\"],\"checkout\\/onepage\\/saveorder\":[\"cart\",\"checkout-data\",\"last-ordered-items\",\"checkout-fields\",\"yireo-gtm-order\",\"yireo-gtm-quote\"],\"checkout\\/sidebar\\/removeitem\":[\"cart\"],\"checkout\\/sidebar\\/updateitemqty\":[\"cart\"],\"rest\\/*\\/v1\\/carts\\/*\\/payment-information\":[\"cart\",\"checkout-data\",\"last-ordered-items\",\"instant-purchase\"],\"rest\\/*\\/v1\\/guest-carts\\/*\\/payment-information\":[\"cart\",\"checkout-data\"],\"rest\\/*\\/v1\\/guest-carts\\/*\\/selected-payment-method\":[\"cart\",\"checkout-data\"],\"rest\\/*\\/v1\\/carts\\/*\\/selected-payment-method\":[\"cart\",\"checkout-data\",\"instant-purchase\"],\"wishlist\\/index\\/update\":[\"cart\",\"wishlist\"],\"wishlist\\/index\\/add\":[\"wishlist\"],\"wishlist\\/index\\/remove\":[\"wishlist\"],\"wishlist\\/index\\/updateitemoptions\":[\"wishlist\"],\"wishlist\\/index\\/cart\":[\"wishlist\",\"cart\"],\"wishlist\\/index\\/fromcart\":[\"wishlist\",\"cart\"],\"wishlist\\/index\\/allcart\":[\"wishlist\",\"cart\"],\"wishlist\\/shared\\/allcart\":[\"wishlist\",\"cart\"],\"wishlist\\/shared\\/cart\":[\"cart\"],\"paypal\\/express\\/placeorder\":[\"cart\",\"checkout-data\"],\"paypal\\/payflowexpress\\/placeorder\":[\"cart\",\"checkout-data\"],\"authorizenet\\/directpost_payment\\/place\":[\"cart\",\"checkout-data\"],\"braintree\\/paypal\\/placeorder\":[\"cart\",\"checkout-data\"],\"customer\\/address\\/*\":[\"instant-purchase\"],\"customer\\/account\\/*\":[\"instant-purchase\"],\"vault\\/cards\\/deleteaction\":[\"instant-purchase\"],\"multishipping\\/checkout\\/overviewpost\":[\"cart\"],\"checkout\\/onepage\\/success\":[\"yireo-gtm-order\",\"yireo-gtm-quote\"]},\"clientSideSections\":[\"checkout-data\",\"cart-data\"],\"baseUrls\":[\"https:\\/\\/www.hiperdino.es\\/c9495\\/\"]}}}</script>\n<script type=\"text/x-magento-init\">\n{\"*\":{\"Magento_Customer\\/js\\/customer-data\":{\"sectionLoadUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/customer\\/section\\/load\\/\",\"expirableSectionLifetime\":60,\"expirableSectionNames\":[\"cart\"],\"cookieLifeTime\":\"86400\",\"updateSessionUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/customer\\/account\\/updateSession\\/\"}}}</script>\n<script type=\"text/x-magento-init\">\n{\"*\":{\"Magento_Customer\\/js\\/invalidation-processor\":{\"invalidationRules\":{\"website-rule\":{\"Magento_Customer\\/js\\/invalidation-rules\\/website-rule\":{\"scopeConfig\":{\"websiteId\":4}}}}}}}</script>\n<script type=\"text/x-magento-init\">\n {\n \"body\": {\n \"pageCache\": {\"url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/page_cache\\/block\\/render\\/id\\/168\\/\",\"handles\":[\"default\",\"catalog_category_view\",\"catalog_category_view_type_layered\",\"catalog_category_view_id_168\"],\"originalRequest\":{\"route\":\"catalog\",\"controller\":\"category\",\"action\":\"view\",\"uri\":\"\\/c9495\\/alimentacion\\/arroz.html\"},\"versionCookieName\":\"private_content_version\"} }\n }\n</script>\n \n<div class=\"section-container\">\n <div class=\"container has-nopadding--mobile\">\n <div class=\"message info empty is-invisible\"><div>No podemos encontrar productos que coincida con la selección.</div></div>\n <ul class=\"products-list flex-container flex-row flex-wrap\">\n \n<li class=\"product-list-item flex-item\" data-id=\"3308\" data-url=\"trevijano-quinoa-300-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"253\",\"label\":\"TREVIJANO\"},\"product_tags\":[{\"label\":\"Sin gluten\",\"id\":\"9\"},{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\" Trevijano quinoa 300 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"4.7\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3308\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3308\",\"name\":\" Trevijano quinoa 300 gr\",\"description\":[\"La unidad sale a 15.67 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"4,70\\u00a0\\u20ac\",\"price\":\"4,70\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Sin gluten\",\"class\":\"sin-gluten\"},{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001239768\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001239768\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\" Trevijano quinoa 300 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001239768_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\t Trevijano quinoa 300 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"sin-gluten--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tSin gluten </div>\n </div>\n\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">4,70 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3308\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3308\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3308\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"14412\" data-url=\"la-campana-arroz-basmati-1-kg\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz basmati 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.57\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"14412\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"14412\",\"name\":\"La Campana arroz basmati 1 kg\",\"description\":[\"El Kilo sale a 2.57 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,57\\u00a0\\u20ac\",\"price\":\"2,57\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000006306021\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000006306021\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz basmati 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000006306021_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz basmati 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,57 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-14412\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"14412\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-14412\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"15881\" data-url=\"la-campana-arroz-bomba-1-kg\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz bomba 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.86\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"15881\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"15881\",\"name\":\"La Campana arroz bomba 1 kg\",\"description\":[\"El Kilo sale a 2.86 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,86\\u00a0\\u20ac\",\"price\":\"2,86\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000009699557\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000009699557\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz bomba 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000009699557_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz bomba 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,86 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-15881\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"15881\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-15881\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"19164\" data-url=\"nomen-arroz-basmati-1-kg\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz basmati 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.95\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"19164\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"19164\",\"name\":\"Nomen arroz basmati 1 kg\",\"description\":[\"El Kilo sale a 2.95 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,95\\u00a0\\u20ac\",\"price\":\"2,95\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"2 dinitos\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000002362748\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000002362748\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz basmati 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000002362748_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz basmati 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t2 dinitos </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,95 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-19164\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"19164\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-19164\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"19236\" data-url=\"nomen-arroz-bomba-1-kg\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz bomba 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"3.13\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"19236\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"19236\",\"name\":\"Nomen arroz bomba 1 kg\",\"description\":[\"El Kilo sale a 3.13 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"3,13\\u00a0\\u20ac\",\"price\":\"3,13\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"2 dinitos\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000004351160\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000004351160\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz bomba 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000004351160_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz bomba 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t2 dinitos </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">3,13 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-19236\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"19236\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-19236\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3784\" data-url=\"nomen-arroz-cocion-rapida-250-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Productos en oferta\",\"id\":\"oferta\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz coci&oacute;n r&aacute;pida 250 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.7500\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3784\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3784\",\"name\":\"Nomen arroz coci&oacute;n r&aacute;pida 250 gr\",\"description\":[\"El Kilo sale a 3.00 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,75\\u00a0\\u20ac\",\"price\":\"0,89\\u00a0\\u20ac\",\"on_sale\":true,\"on_sale_no_promotion\":true,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001270013\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001270013\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz coción rápida 250 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001270013_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t <div class=\"top__badges flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n\t\t\t\t\t\t <div class=\"offer--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">Oferta</div>\n </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n </div>\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz coción rápida 250 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,75 € </div>\n </div>\n\t\t\t\t\t <div class=\"price__right price--previous flex-item\">\n <div class=\"price__text\">0,89 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3784\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3784\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3784\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"19277\" data-url=\"nomen-arroz-thai-1-kg\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz thai 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.95\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"19277\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"19277\",\"name\":\"Nomen arroz thai 1 kg\",\"description\":[\"El Kilo sale a 2.95 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,95\\u00a0\\u20ac\",\"price\":\"2,95\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"2 dinitos\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000002362755\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000002362755\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz thai 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000002362755_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz thai 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t2 dinitos </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,95 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-19277\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"19277\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-19277\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"14669\" data-url=\"nomen-trigo-tierno-pte-500-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen trigo tierno pte 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.14\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"14669\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"14669\",\"name\":\"Nomen trigo tierno pte 500 gr\",\"description\":[\"El Kilo sale a 4.28 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,14\\u00a0\\u20ac\",\"price\":\"2,14\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000006755911\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000006755911\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen trigo tierno pte 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000006755911_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen trigo tierno pte 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,14 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-14669\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"14669\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-14669\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"20497\" data-url=\"nomen-vasitos-arroz-basmati-2x125-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Productos en oferta\",\"id\":\"oferta\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen vasitos arroz basmati 2x125 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.9900\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"20497\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"20497\",\"name\":\"Nomen vasitos arroz basmati 2x125 gr\",\"description\":[\"El Kilo sale a 3.96 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,99\\u00a0\\u20ac\",\"price\":\"1,20\\u00a0\\u20ac\",\"on_sale\":true,\"on_sale_no_promotion\":true,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000002388717\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000002388717\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen vasitos arroz basmati 2x125 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000002388717_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t <div class=\"top__badges flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n\t\t\t\t\t\t <div class=\"offer--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">Oferta</div>\n </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n </div>\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen vasitos arroz basmati 2x125 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,99 € </div>\n </div>\n\t\t\t\t\t <div class=\"price__right price--previous flex-item\">\n <div class=\"price__text\">1,20 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-20497\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"20497\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-20497\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"2552\" data-url=\"scotti-arroz-risotto-500-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"948\",\"label\":\"SCOTTI\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Scotti arroz risotto 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.57\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"2552\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"2552\",\"name\":\"Scotti arroz risotto 500 gr\",\"description\":[\"El Kilo sale a 3.14 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,57\\u00a0\\u20ac\",\"price\":\"1,57\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001156027\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001156027\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Scotti arroz risotto 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001156027_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tScotti arroz risotto 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,57 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-2552\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"2552\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-2552\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"8161\" data-url=\"sos-3-quinoas-200-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos 3 quinoas 200 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.63\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"8161\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"8161\",\"name\":\"Sos 3 quinoas 200 gr\",\"description\":[\"El Kilo sale a 8.15 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,63\\u00a0\\u20ac\",\"price\":\"1,63\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001925241\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001925241\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos 3 quinoas 200 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001925241_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos 3 quinoas 200 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,63 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-8161\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"8161\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-8161\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"13368\" data-url=\"sos-arroz-especial-caldo-500-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos arroz especial caldo 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.09\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"13368\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"13368\",\"name\":\"Sos arroz especial caldo 500 gr\",\"description\":[\"El Kilo sale a 2.18 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,09\\u00a0\\u20ac\",\"price\":\"1,09\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000004903062\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000004903062\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos arroz especial caldo 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000004903062_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos arroz especial caldo 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,09 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-13368\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"13368\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-13368\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"4505\" data-url=\"sos-arroz-integral-quinoa-1-2\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos arroz integral quinoa 1\\/2\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.68\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"4505\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"4505\",\"name\":\"Sos arroz integral quinoa 1\\/2\",\"description\":[\"La unidad sale a 1.68 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,68\\u00a0\\u20ac\",\"price\":\"1,68\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001360912\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001360912\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos arroz integral quinoa 1/2\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001360912_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos arroz integral quinoa 1/2 </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,68 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-4505\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"4505\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-4505\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"8164\" data-url=\"sos-chia-200-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos ch&iacute;a 200 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.6\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"8164\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"8164\",\"name\":\"Sos ch&iacute;a 200 gr\",\"description\":[\"El Kilo sale a 8.00 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,60\\u00a0\\u20ac\",\"price\":\"1,60\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001925289\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001925289\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos chía 200 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001925289_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos chía 200 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,60 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-8164\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"8164\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-8164\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"4560\" data-url=\"sos-quinoa-100-250-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos quinoa 100% 250 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.59\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"4560\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"4560\",\"name\":\"Sos quinoa 100% 250 gr\",\"description\":[\"El Kilo sale a 6.36 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,59\\u00a0\\u20ac\",\"price\":\"1,59\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001369854\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001369854\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos quinoa 100% 250 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001369854_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos quinoa 100% 250 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,59 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-4560\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"4560\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-4560\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"6947\" data-url=\"sos-quinoa-integral-con-quinoa-roja-200-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos quinoa integral con quinoa roja 200 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.65\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"6947\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"6947\",\"name\":\"Sos quinoa integral con quinoa roja 200 gr\",\"description\":[\"El Kilo sale a 8.25 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,65\\u00a0\\u20ac\",\"price\":\"1,65\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001829341\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001829341\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos quinoa integral con quinoa roja 200 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001829341_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos quinoa integral con quinoa roja 200 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,65 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-6947\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"6947\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-6947\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"8162\" data-url=\"sos-quinoa-negra-200-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos quinoa negra 200 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.68\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"8162\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"8162\",\"name\":\"Sos quinoa negra 200 gr\",\"description\":[\"El Kilo sale a 8.40 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,68\\u00a0\\u20ac\",\"price\":\"1,68\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001925258\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001925258\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos quinoa negra 200 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001925258_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos quinoa negra 200 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,68 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-8162\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"8162\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-8162\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"8163\" data-url=\"sos-quinoa-roja-200-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos quinoa roja 200 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.25\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"8163\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"8163\",\"name\":\"Sos quinoa roja 200 gr\",\"description\":[\"El Kilo sale a 11.25 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,25\\u00a0\\u20ac\",\"price\":\"2,25\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"2 dinitos\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001925265\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001925265\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos quinoa roja 200 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001925265_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos quinoa roja 200 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t2 dinitos </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,25 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-8163\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"8163\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-8163\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"11612\" data-url=\"sundari-arroz-sushi-500-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"2928\",\"label\":\"SUNDARI\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sundari arroz sushi 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.68\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"11612\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"11612\",\"name\":\"Sundari arroz sushi 500 gr\",\"description\":[\"El Kilo sale a 3.36 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,68\\u00a0\\u20ac\",\"price\":\"1,68\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000003101285\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000003101285\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sundari arroz sushi 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000003101285_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSundari arroz sushi 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,68 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-11612\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"11612\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-11612\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"4483\" data-url=\"trabel-quinoa-real-blanca-est-250-gr\" data-filters='{\"cat\":{\"id\":\"178\"},\"brand\":{\"id\":\"324\",\"label\":\"TRABEL\"},\"product_tags\":[{\"label\":\"Sin gluten\",\"id\":\"9\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Trabel quinoa real blanca est 250 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.39\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"4483\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"4483\",\"name\":\"Trabel quinoa real blanca est 250 gr\",\"description\":[\"El Kilo sale a 5.56 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,39\\u00a0\\u20ac\",\"price\":\"1,39\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Sin gluten\",\"class\":\"sin-gluten\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001348927\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001348927\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Trabel quinoa real blanca est 250 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001348927_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tTrabel quinoa real blanca est 250 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"sin-gluten--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tSin gluten </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,39 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-4483\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"4483\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-4483\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"14345\" data-url=\"la-campana-arroz-integral-1-kg\" data-filters='{\"cat\":{\"id\":\"637\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz integral 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.08\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"14345\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"14345\",\"name\":\"La Campana arroz integral 1 kg\",\"description\":[\"El Kilo sale a 1.08 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,08\\u00a0\\u20ac\",\"price\":\"1,08\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000006195793\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000006195793\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz integral 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000006195793_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz integral 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,08 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-14345\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"14345\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-14345\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3677\" data-url=\"nomen-arroz-integral-1-kg\" data-filters='{\"cat\":{\"id\":\"637\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz integral 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.74\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3677\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3677\",\"name\":\"Nomen arroz integral 1 kg\",\"description\":[\"El Kilo sale a 1.74 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,74\\u00a0\\u20ac\",\"price\":\"1,74\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"2 dinitos\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260069\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260069\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz integral 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260069_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz integral 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t2 dinitos </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,74 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3677\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3677\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3677\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"20496\" data-url=\"nomen-vasitos-arroz-integral-2x125-gr\" data-filters='{\"cat\":{\"id\":\"637\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Productos en oferta\",\"id\":\"oferta\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen vasitos arroz integral 2x125 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.9900\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"20496\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"20496\",\"name\":\"Nomen vasitos arroz integral 2x125 gr\",\"description\":[\"El Kilo sale a 3.96 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,99\\u00a0\\u20ac\",\"price\":\"1,15\\u00a0\\u20ac\",\"on_sale\":true,\"on_sale_no_promotion\":true,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000002388700\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000002388700\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen vasitos arroz integral 2x125 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000002388700_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t <div class=\"top__badges flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n\t\t\t\t\t\t <div class=\"offer--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">Oferta</div>\n </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n </div>\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen vasitos arroz integral 2x125 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,99 € </div>\n </div>\n\t\t\t\t\t <div class=\"price__right price--previous flex-item\">\n <div class=\"price__text\">1,15 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-20496\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"20496\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-20496\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"14254\" data-url=\"sos-arroz-integral-20-minutos-1-kg\" data-filters='{\"cat\":{\"id\":\"637\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos arroz integral 20 minutos 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.63\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"14254\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"14254\",\"name\":\"Sos arroz integral 20 minutos 1 kg\",\"description\":[\"El Kilo sale a 1.63 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,63\\u00a0\\u20ac\",\"price\":\"1,63\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000006019228\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000006019228\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos arroz integral 20 minutos 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000006019228_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos arroz integral 20 minutos 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,63 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-14254\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"14254\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-14254\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3683\" data-url=\"uncle-bens-arroz-integral-500-gr\" data-filters='{\"cat\":{\"id\":\"637\"},\"brand\":{\"id\":\"161\",\"label\":\"UNCLE BENS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Uncle Bens arroz integral 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.98\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3683\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3683\",\"name\":\"Uncle Bens arroz integral 500 gr\",\"description\":[\"El Kilo sale a 3.96 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,98\\u00a0\\u20ac\",\"price\":\"1,98\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260199\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260199\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Uncle Bens arroz integral 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260199_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tUncle Bens arroz integral 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,98 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3683\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3683\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3683\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"15366\" data-url=\"hiperdino-arroz-largo-1-kg\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"36\",\"label\":\"HIPERDINO\"},\"product_tags\":[{\"label\":\"Hiperdino\",\"id\":\"6\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"HiperDino arroz largo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.68\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"15366\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"15366\",\"name\":\"HiperDino arroz largo 1 kg\",\"description\":[\"El Kilo sale a 0.68 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,68\\u00a0\\u20ac\",\"price\":\"0,68\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Hiperdino\",\"class\":\"hiperdino\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000007971112\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000007971112\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"HiperDino arroz largo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000007971112_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tHiperDino arroz largo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"hiperdino--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tHiperdino </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,68 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-15366\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"15366\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-15366\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"633\" data-url=\"hiperdino-arroz-largo-paquete-1-kg\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"36\",\"label\":\"HIPERDINO\"},\"product_tags\":[{\"label\":\"Hiperdino\",\"id\":\"6\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Hiperdino arroz largo primera cart&oacute;n 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.85\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"633\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"633\",\"name\":\"Hiperdino arroz largo primera cart&oacute;n 1 kg\",\"description\":[\"El Kilo sale a 0.85 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,85\\u00a0\\u20ac\",\"price\":\"0,85\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Hiperdino\",\"class\":\"hiperdino\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000599658\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000599658\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Hiperdino arroz largo primera cartón 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000599658_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tHiperdino arroz largo primera cartón 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"hiperdino--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tHiperdino </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,85 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-633\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"633\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-633\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"522\" data-url=\"la-campana-arroz-largo-1-kg\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz largo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.99\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"522\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"522\",\"name\":\"La Campana arroz largo 1 kg\",\"description\":[\"El Kilo sale a 0.99 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,99\\u00a0\\u20ac\",\"price\":\"0,99\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000410564\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000410564\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz largo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000410564_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz largo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,99 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-522\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"522\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-522\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3681\" data-url=\"la-cigala-arroz-largo-1-kg\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"54\",\"label\":\"LA CIGALA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Cigala arroz largo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.22\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3681\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3681\",\"name\":\"La Cigala arroz largo 1 kg\",\"description\":[\"El Kilo sale a 1.22 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,22\\u00a0\\u20ac\",\"price\":\"1,22\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260137\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260137\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Cigala arroz largo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260137_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Cigala arroz largo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,22 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3681\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3681\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3681\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3678\" data-url=\"nomen-arroz-largo-1-kg-100-g-gratis\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Productos en oferta\",\"id\":\"oferta\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz largo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.7500\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3678\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3678\",\"name\":\"Nomen arroz largo 1 kg\",\"description\":[\"El Kilo sale a 0.75 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,75\\u00a0\\u20ac\",\"price\":\"1,03\\u00a0\\u20ac\",\"on_sale\":true,\"on_sale_no_promotion\":true,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260090\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260090\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz largo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260090_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t <div class=\"top__badges flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n\t\t\t\t\t\t <div class=\"offer--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">Oferta</div>\n </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n </div>\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz largo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,75 € </div>\n </div>\n\t\t\t\t\t <div class=\"price__right price--previous flex-item\">\n <div class=\"price__text\">1,03 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3678\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3678\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3678\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3682\" data-url=\"rocio-arroz-largo-1-kg\" data-filters='{\"cat\":{\"id\":\"169\"},\"brand\":{\"id\":\"684\",\"label\":\"ROCIO\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Roc&iacute;o arroz largo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.3\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3682\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3682\",\"name\":\"Roc&iacute;o arroz largo 1 kg\",\"description\":[\"El Kilo sale a 1.30 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,30\\u00a0\\u20ac\",\"price\":\"1,30\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260151\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260151\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Rocío arroz largo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260151_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tRocío arroz largo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,30 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3682\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3682\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3682\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"632\" data-url=\"hiperdino-arroz-extra-1-kg\" data-filters='{\"cat\":{\"id\":\"210\"},\"brand\":{\"id\":\"36\",\"label\":\"HIPERDINO\"},\"product_tags\":[{\"label\":\"Hiperdino\",\"id\":\"6\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"HiperDino arroz extra 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.8\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"632\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"632\",\"name\":\"HiperDino arroz extra 1 kg\",\"description\":[\"El Kilo sale a 0.80 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,80\\u00a0\\u20ac\",\"price\":\"0,80\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Hiperdino\",\"class\":\"hiperdino\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000599498\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000599498\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"HiperDino arroz extra 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000599498_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tHiperDino arroz extra 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"hiperdino--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tHiperdino </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,80 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-632\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"632\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-632\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"14342\" data-url=\"la-campana-arroz-redondo-d-o-valencia-1-kg\" data-filters='{\"cat\":{\"id\":\"210\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz redondo d.o. valencia 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.19\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"14342\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"14342\",\"name\":\"La Campana arroz redondo d.o. valencia 1 kg\",\"description\":[\"El Kilo sale a 1.19 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,19\\u00a0\\u20ac\",\"price\":\"1,19\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000006193423\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000006193423\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz redondo d.o. valencia 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000006193423_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz redondo d.o. valencia 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,19 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-14342\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"14342\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-14342\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"20495\" data-url=\"nomen-vasitos-arroz-redondo-2x125-gr\" data-filters='{\"cat\":{\"id\":\"210\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Productos en oferta\",\"id\":\"oferta\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen vasitos arroz redondo 2x125 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.9900\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"20495\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"20495\",\"name\":\"Nomen vasitos arroz redondo 2x125 gr\",\"description\":[\"El Kilo sale a 3.96 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,99\\u00a0\\u20ac\",\"price\":\"1,15\\u00a0\\u20ac\",\"on_sale\":true,\"on_sale_no_promotion\":true,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000002388397\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000002388397\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen vasitos arroz redondo 2x125 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000002388397_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t <div class=\"top__badges flex-item\">\n <div class=\"top__badges--container flex-container flex-row\">\n\t\t\t\t\t\t <div class=\"offer--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">Oferta</div>\n </div>\n\t\t\t\t\t\t\n\t\t\t\t\t\t </div>\n </div>\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen vasitos arroz redondo 2x125 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,99 € </div>\n </div>\n\t\t\t\t\t <div class=\"price__right price--previous flex-item\">\n <div class=\"price__text\">1,15 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-20495\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"20495\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-20495\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3365\" data-url=\"sos-arroz-redondo-1-kg\" data-filters='{\"cat\":{\"id\":\"210\"},\"brand\":{\"id\":\"167\",\"label\":\"SOS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Sos arroz redondo 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.49\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3365\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3365\",\"name\":\"Sos arroz redondo 1 kg\",\"description\":[\"El Kilo sale a 1.49 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,49\\u00a0\\u20ac\",\"price\":\"1,49\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001250138\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001250138\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Sos arroz redondo 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001250138_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tSos arroz redondo 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,49 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3365\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3365\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3365\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3366\" data-url=\"brillante-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"160\",\"label\":\"BRILLANTE\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Brillante arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.59\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3366\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3366\",\"name\":\"Brillante arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 1.59 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,59\\u00a0\\u20ac\",\"price\":\"1,59\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001250169\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001250169\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Brillante arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001250169_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tBrillante arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,59 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3366\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3366\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3366\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"16482\" data-url=\"divenca-arroz-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"3888\",\"label\":\"DIVENCA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Divenca arroz 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.34\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"16482\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"16482\",\"name\":\"Divenca arroz 1 kg\",\"description\":[\"El Kilo sale a 1.34 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,34\\u00a0\\u20ac\",\"price\":\"1,34\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000371360\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000371360\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"1\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Divenca arroz 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000371360_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tDivenca arroz 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,34 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-16482\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"16482\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-16482\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"16483\" data-url=\"divenca-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"3888\",\"label\":\"DIVENCA\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Divenca arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.49\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"16483\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"16483\",\"name\":\"Divenca arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 1.49 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,49\\u00a0\\u20ac\",\"price\":\"1,49\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000371377\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000371377\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Divenca arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000371377_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tDivenca arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,49 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-16483\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"16483\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-16483\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"19378\" data-url=\"hiperdino-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"36\",\"label\":\"HIPERDINO\"},\"product_tags\":[{\"label\":\"Hiperdino\",\"id\":\"6\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"HiperDino arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"0.99\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"19378\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"19378\",\"name\":\"HiperDino arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 0.99 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"0,99\\u00a0\\u20ac\",\"price\":\"0,99\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Hiperdino\",\"class\":\"hiperdino\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001155204\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001155204\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"HiperDino arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001155204_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tHiperDino arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"hiperdino--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tHiperdino </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">0,99 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-19378\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"19378\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-19378\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"634\" data-url=\"hiperdino-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"36\",\"label\":\"HIPERDINO\"},\"product_tags\":[{\"label\":\"Hiperdino\",\"id\":\"6\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"HiperDino arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.09\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"634\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"634\",\"name\":\"HiperDino arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 1.09 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,09\\u00a0\\u20ac\",\"price\":\"1,09\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"Hiperdino\",\"class\":\"hiperdino\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000000599672\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000000599672\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"HiperDino arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000000599672_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tHiperDino arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"hiperdino--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\tHiperdino </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,09 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-634\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"634\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-634\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"15880\" data-url=\"la-campana-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"619\",\"label\":\"LA CAMPANA\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"La Campana arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.35\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"15880\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"15880\",\"name\":\"La Campana arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 1.35 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,35\\u00a0\\u20ac\",\"price\":\"1,35\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000009694835\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000009694835\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"La Campana arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000009694835_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tLa Campana arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,35 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-15880\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"15880\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-15880\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3679\" data-url=\"nomen-arroz-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"211\",\"label\":\"NOMEN\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Nomen arroz vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.49\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3679\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3679\",\"name\":\"Nomen arroz vaporizado 1 kg\",\"description\":[\"El Kilo sale a 1.49 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,49\\u00a0\\u20ac\",\"price\":\"1,49\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260106\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260106\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"2\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Nomen arroz vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260106_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tNomen arroz vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,49 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3679\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3679\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3679\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3680\" data-url=\"uncle-bens-arroz-largo-vaporizado-1-kg\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"161\",\"label\":\"UNCLE BENS\"},\"product_tags\":\"\"}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Uncle Bens arroz largo vaporizado 1 kg\",\"label\":\"Nombre\"},\"price\":{\"value\":\"2.72\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3680\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3680\",\"name\":\"Uncle Bens arroz largo vaporizado 1 kg\",\"description\":[\"El Kilo sale a 2.72 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"2,72\\u00a0\\u20ac\",\"price\":\"2,72\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260113\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260113\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Uncle Bens arroz largo vaporizado 1 kg\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260113_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tUncle Bens arroz largo vaporizado 1 kg </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">2,72 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3680\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3680\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3680\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> \n<li class=\"product-list-item flex-item\" data-id=\"3687\" data-url=\"uncle-bens-arroz-largo-vaporizado-500-gr\" data-filters='{\"cat\":{\"id\":\"211\"},\"brand\":{\"id\":\"161\",\"label\":\"UNCLE BENS\"},\"product_tags\":[{\"label\":\"Dinitos\",\"id\":\"4036\"}]}' data-sort='{\"position\":{\"value\":\"\",\"label\":\"Defecto\"},\"name\":{\"value\":\"Uncle Bens arroz largo vaporizado 500 gr\",\"label\":\"Nombre\"},\"price\":{\"value\":\"1.81\",\"label\":\"Precio\"}}'>\n\n <div class=\"button button__icon button--product flex-container flex-row justify-center items-center action_wishlistAddProduct\"\n data-product-id=\"3687\">\n <i class=\"icon icon-option flex-item\"></i>\n </div>\n \n <div class=\"item--container flex-container flex-column\">\n\n <div class=\"action-container\" data-myaction=\"openQuickview\" data-all='{\"id\":\"3687\",\"name\":\"Uncle Bens arroz largo vaporizado 500 gr\",\"description\":[\"El Kilo sale a 3.62 \\u20ac\"],\"more_info\":\"\",\"final_price\":\"1,81\\u00a0\\u20ac\",\"price\":\"1,81\\u00a0\\u20ac\",\"on_sale\":false,\"on_sale_no_promotion\":false,\"promotion\":\"\",\"tags\":[{\"label\":\"1 dinito\",\"class\":\"dinitos\"}],\"base_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/000000000001260335\",\"thumb_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/110x110\\/000000000001260335\",\"not_found_image\":\"https:\\/\\/cdn.hiperdino.es\\/catalog\\/product\\/placeholder\\/default\\/Pendiente-foto_1.jpg\",\"image_count\":\"3\",\"show_unit\":\"UN\",\"add_to_cart_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcheckout\\/cart\\/add\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\",\"item_id\":0,\"qty\":0,\"min_qty\":1,\"qty_label\":\"A\\u00f1adir\",\"has_options\":0,\"is_grouped\":false,\"childs_action_url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/hdcatalog\\/product\\/childs\\/form_key\\/JTZ8TY7ZrxstF7cc\\/\"}'>\n <div class=\"product__image flex-item\">\n <img alt=\"Uncle Bens arroz largo vaporizado 500 gr\"\n src=\"https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg\"\n data-src=\"https://cdn.hiperdino.es/catalog/product/200x200/000000000001260335_1.jpg\" class=\"image--wrapper lazy\"\n onerror=\"this.src='https://cdn.hiperdino.es/catalog/product/placeholder/default/Pendiente-foto_1.jpg'\">\n </div>\n\n\t\t\t\n <div class=\"product__description flex-item\">\n <div class=\"description__text\">\n\t\t\t\t\tUncle Bens arroz largo vaporizado 500 gr </div>\n </div>\n\n <div class=\"bottom__badges flex-item\">\n <div class=\"bottom__badges--container flex-container flex-row\">\n\t\t\t\t\t\t\t\t\t\t <div class=\"dinitos--badge badge__item flex-item\">\n <div class=\"badge__text text--semi-bold\">\n\t\t\t\t\t\t\t\t1 dinito </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n\n <div class=\"product__price flex-item\">\n <div class=\"product__price--container flex-container flex-row justify-between items-center\">\n <div class=\"price__left price--final flex-item\">\n <div class=\"price__text\">1,81 € </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n\n <div class=\"product__add2cart flex-item\">\n <div id=\"product-list-addtocart-button-3687\"\n class=\"button__complex has-border button__complex--container flex-container\n flex-row justify-center items-center action-productListAddToCart\"\n data-item-id=\"0\"\n data-product-id=\"3687\"\n data-min-qty=\"1\"\n data-can-add-to-cart=\"1\"\n data-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/add/form_key/JTZ8TY7ZrxstF7cc/\"\n data-modify-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/updateItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-remove-action-url=\"https://www.hiperdino.es/c9495/hdcheckout/cart/removeItem/form_key/JTZ8TY7ZrxstF7cc/\"\n data-current-qty=\"0\"\n data-options-qty=\"\">\n <div class=\"button__content flex-item\">\n\t\t\t\t\t <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div id=\"product-list-addtocart-label-3687\"\n class=\"button__text flex-item \">\n\t\t\t\t\t\t\t\tAñadir </div>\n <div class=\"block--wrapper flex-item is-invisible\">\n <div class=\"item--container flex-container justify-between items-center\">\n <div class=\"price__bottom price--final flex-item\">\n <div class=\"flex-container justify-between\">\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center is-invisible\"\n data-myaction=\"removeQty\">\n <i class=\"icon icon-remove flex-item\"></i>\n </div>\n <div class=\"list__icon list__icon--first button button__icon flex-container flex-row justify-center items-center \"\n data-myaction=\"removeProduct\">\n <i class=\"icon icon-trash flex-item\"></i>\n </div>\n <div class=\"list__icon button button__icon flex-container flex-row justify-center items-center\"\n data-myaction=\"addProduct\">\n <i class=\"icon icon-add flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\t\t\t\t\t </div>\n </div>\n </div>\n </div>\n</li> <li class=\"dummy--item flex-item flex-double\"></li>\n </ul>\n\n <script type=\"text/x-magento-init\">\n {\n \"[data-role=tocart-form], .form.map.checkout\": {\n \"catalogAddToCart\": {\n \"product_sku\": \"000000000001260335\"\n }\n }\n }\n </script>\n \n </div>\n\n</div>\n\n<script type=\"text/javascript\">\n var categoriesData = {\"169\":\"Arroz largo\",\"178\":\"Arroz especialidades\",\"210\":\"Arroz redondo\",\"211\":\"Arroz vaporizado\",\"637\":\"Arroz integral\"};\n var positionData = [{\"position\":0,\"id\":\"3308\"},{\"position\":1,\"id\":\"14412\"},{\"position\":2,\"id\":\"15881\"},{\"position\":3,\"id\":\"19164\"},{\"position\":4,\"id\":\"19236\"},{\"position\":5,\"id\":\"3784\"},{\"position\":6,\"id\":\"19277\"},{\"position\":7,\"id\":\"14669\"},{\"position\":8,\"id\":\"20497\"},{\"position\":9,\"id\":\"2552\"},{\"position\":10,\"id\":\"8161\"},{\"position\":11,\"id\":\"13368\"},{\"position\":12,\"id\":\"4505\"},{\"position\":13,\"id\":\"8164\"},{\"position\":14,\"id\":\"4560\"},{\"position\":15,\"id\":\"6947\"},{\"position\":16,\"id\":\"8162\"},{\"position\":17,\"id\":\"8163\"},{\"position\":18,\"id\":\"11612\"},{\"position\":19,\"id\":\"4483\"},{\"position\":20,\"id\":\"14345\"},{\"position\":21,\"id\":\"3677\"},{\"position\":22,\"id\":\"20496\"},{\"position\":23,\"id\":\"14254\"},{\"position\":24,\"id\":\"3683\"},{\"position\":25,\"id\":\"15366\"},{\"position\":26,\"id\":\"633\"},{\"position\":27,\"id\":\"522\"},{\"position\":28,\"id\":\"3681\"},{\"position\":29,\"id\":\"3678\"},{\"position\":30,\"id\":\"3682\"},{\"position\":31,\"id\":\"632\"},{\"position\":32,\"id\":\"14342\"},{\"position\":33,\"id\":\"20495\"},{\"position\":34,\"id\":\"3365\"},{\"position\":35,\"id\":\"3366\"},{\"position\":36,\"id\":\"16482\"},{\"position\":37,\"id\":\"16483\"},{\"position\":38,\"id\":\"19378\"},{\"position\":39,\"id\":\"634\"},{\"position\":40,\"id\":\"15880\"},{\"position\":41,\"id\":\"3679\"},{\"position\":42,\"id\":\"3680\"},{\"position\":43,\"id\":\"3687\"}];\n</script><script type=\"text/x-magento-init\">\n {\n \"body\": {\n \"requireCookie\": {\"noCookieUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/cookie\\/index\\/noCookies\\/\",\"triggers\":[\".action.towishlist\"]} }\n }\n</script>\n</section><footer class=\"page-footer\"><div class=\"ban-news\">\n <div class=\"ban-news__wrapper\">\n <h2 class=\"header__text text--center tit--news\">Recibe nuestras ofertas por Email</h2>\n <form id=\"newsletter-form\" class=\"form\" action=\"https://www.hiperdino.es/c9495/hiperdino_newsletter/subscribe/\" method=\"post\">\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center ban-news__email\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input class=\"input__text flex-item flex-double\" name=\"email\" type=\"text\" placeholder=\"\"/>\n <label class=\"control-label\" for=\"input\">Correo electrónico</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"cart__button block--wrapper flex-item ban-news__button\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal button__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text flex-item\">Suscribirse</div>\n </div>\n </div>\n </button>\n </div>\n </form>\n </div>\n</div>\n<div class=\"main-footer\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"footer__left--wrapper col-md-12 col-lg-4\">\n <div class=\"footer-left--container flex-container flex-column\">\n <div class=\"menu__logo flex-item\">\n </div>\n <div class=\"footer__text flex-item\">Haz tu compra Online en cualquier lugar, en cualquier momento.</div>\n <div class=\"footer-store--wrapper flex-item\">\n <div class=\"footer-store--container flex-container flex-row flex-wrap justify-start items-center\">\n <div class=\"store__item flex-item\">\n <a href=\"https://itunes.apple.com/es/app/hiperdino-online/id1195964502\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge app-store--badge\"></div>\n </a>\n </div>\n <div class=\"store__item flex-item\">\n <a href=\"https://play.google.com/store/apps/details?id=com.hiperdino.compraonline\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge google-play--badge\"></div>\n </a>\n </div>\n </div>\n </div>\n <div class=\"footer__text flex-item\">Síguenos en:</div>\n <div class=\"footer-store--wrapper flex-item\">\n <div class=\"footer-store--container flex-container flex-row flex-wrap justify-start items-center\">\n <div class=\"store__item flex-item\">\n <a href=\"https://twitter.com/HiperDino_\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge twitter--badge\"></div>\n </a>\n </div>\n <div class=\"store__item flex-item\">\n <a href=\"https://www.facebook.com/HiperdinoSupermercados.es\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge facebook--badge\"></div>\n </a>\n </div>\n <div class=\"store__item flex-item\">\n <a href=\"https://www.instagram.com/hiperdino_\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge instagram--badge\"></div>\n </a>\n </div>\n <div class=\"store__item flex-item\">\n <a href=\"https://www.pinterest.es/hiperdinosuper\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge pinterest--badge\"></div>\n </a>\n </div>\n <div class=\"store__item flex-item\">\n <a href=\"https://www.youtube.com/user/Hiperdinomercado\" target=\"_blank\" class=\"link--wrapper\">\n <div class=\"store--badge youtube--badge\"></div>\n </a>\n </div>\n </div>\n </div>\n <div class=\"footer-cards--wrapper flex-item\">\n <div class=\"footer-cards--container flex-container flex-row justify-start items-center\">\n <div class=\"card__item flex-item\">\n <div class=\"card--badge visa--badge\"></div>\n </div>\n <div class=\"card__item flex-item\">\n <div class=\"card--badge mastercard--badge\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footer__right--wrapper col-md-12 col-lg-8\">\n <div class=\"row\">\n <div class=\"footer-sections--wrapper col-sm-6 col-md-4\">\n <h3 class=\"header__text footer--header\">\n <h3 class=\"header__text footer--header\">Información corporativa</h3>\n <ul class=\"footer__list\">\n <ul>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/folletos/\">Folletos</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/noticias/\">Noticias</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/tiendas/\">Nuestras tiendas</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/empleo/\">Empleo</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\">Tarjeta HiperDino</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://fundaciondinosol.org/\" target=\"_blank\">Fundacion DinoSol</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"http://www.hiperdinoexpress.es/\" target=\"_blank\">HiperDino Express</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.dinosol.es/\" target=\"_blank\">Grupo DinoSol</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/instagram-alisiosygaldar/\">Concurso Instagram Alisios y Gáldar</a></li>\n</ul> </ul>\n </div>\n <div class=\"footer-help--wrapper col-sm-6 col-md-4\">\n <h3 class=\"header__text footer--header\">Información compra online</h3>\n <ul class=\"footer__list\">\n <li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/pago/\" class=\"item__text\">Pago</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/condiciones-entrega/\" class=\"item__text\">Condiciones de entrega</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/producto-hiperdino/\" class=\"item__text\">Producto HiperDino</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/devoluciones/\" class=\"item__text\">Devoluciones</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/condiciones-compra/\" class=\"item__text\">Condiciones de compra</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/recetas/\" class=\"item__text\">Recetas</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/campana-lanzamiento/\" class=\"item__text\">Campaña Lanzamiento</a></li> </ul>\n </div>\n <div class=\"footer-services--wrapper col-sm-6 col-md-4\">\n <h3 class=\"header__text footer--header\">Servicio atención al cliente</h3>\n <ul class=\"footer__list\">\n <ul>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/politica-privacidad/\" class=\"item__text\">Política de privacidad</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/politica-cookies/\" class=\"item__text\">Política de cookies</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/aviso-legal/\" class=\"item__text\">Aviso legal</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/conexion-segura/\" class=\"item__text\">Conexión segura</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/contact/\" class=\"item__text\">Contacto</a></li>\n</ul> </ul>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n\n<div class=\"footer-mobile\">\n <div class=\"footer-mobile__wrapper flex-column flex-container\">\n <div class=\"footer-group click--trigger flex-item\">\n <div class=\"footer-group--container flex-container justify-between flex-column\">\n <div class=\"footer-group__header flex-item\">\n <div class=\"footer-group__header--container flex-container flex-row justify-between items-center\">\n <div class=\"menu__text dropdown--info flex-item flex-double\">\n <h3 class=\"header__text footer--header\">\n\t\t\t\t\t\t\t\tInformación corporativa </h3>\n </div>\n <div class=\"dropdown__control--wrapper flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row items-cente justify-end\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footer-group__content flex-item\">\n <ul class=\"footer__list flex-container flex-column\">\n <ul>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/folletos/\">Folletos</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/noticias/\">Noticias</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/tiendas/\">Nuestras tiendas</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/empleo/\">Empleo</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\">Tarjeta HiperDino</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://fundaciondinosol.org/\" target=\"_blank\">Fundacion DinoSol</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"http://www.hiperdinoexpress.es/\" target=\"_blank\">HiperDino Express</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.dinosol.es/\" target=\"_blank\">Grupo DinoSol</a></li>\n<li class=\"list__item\"><a class=\"item__text\" href=\"https://www.hiperdino.es/c9495/instagram-alisiosygaldar/\">Concurso Instagram Alisios y Gáldar</a></li>\n</ul> </ul>\n </div>\n </div>\n </div>\n <div class=\"footer-group click--trigger flex-item\">\n <div class=\"footer-group--container flex-container justify-between flex-column\">\n <div class=\"footer-group__header flex-item\">\n <div class=\"footer-group__header--container flex-container flex-row justify-between items-center\">\n <div class=\"menu__text dropdown--info flex-item flex-double\">\n <h3 class=\"header__text footer--header\">\n\t\t\t\t\t\t\t\tInformación compra online </h3>\n </div>\n <div class=\"dropdown__control--wrapper flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row items-cente justify-end\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footer-group__content flex-item\">\n <ul class=\"footer__list flex-container flex-column\">\n <li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/pago/\" class=\"item__text\">Pago</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/condiciones-entrega/\" class=\"item__text\">Condiciones de entrega</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/producto-hiperdino/\" class=\"item__text\">Producto HiperDino</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/devoluciones/\" class=\"item__text\">Devoluciones</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/condiciones-compra/\" class=\"item__text\">Condiciones de compra</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/recetas/\" class=\"item__text\">Recetas</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/campana-lanzamiento/\" class=\"item__text\">Campaña Lanzamiento</a></li> </ul>\n </div>\n </div>\n </div>\n <div class=\"footer-group click--trigger flex-item\">\n <div class=\"footer-group--container flex-container justify-between flex-column\">\n <div class=\"footer-group__header flex-item\">\n <div class=\"footer-group__header--container flex-container flex-row justify-between items-center\">\n <div class=\"menu__text dropdown--info flex-item flex-double\">\n <h3 class=\"header__text footer--header\">\n\t\t\t\t\t\t\t\tServicio atención al cliente </h3>\n </div>\n <div class=\"dropdown__control--wrapper flex-item\">\n <div class=\"dropdown__control--container flex-container flex-row items-cente justify-end\">\n <i class=\"dropdown__icon dropdown__icon--info icon icon-right flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n <div class=\"footer-group__content flex-item\">\n <ul class=\"footer__list flex-container flex-column\">\n <ul>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/politica-privacidad/\" class=\"item__text\">Política de privacidad</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/politica-cookies/\" class=\"item__text\">Política de cookies</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/aviso-legal/\" class=\"item__text\">Aviso legal</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/conexion-segura/\" class=\"item__text\">Conexión segura</a></li>\n<li class=\"list__item\"><a href=\"https://www.hiperdino.es/c9495/contact/\" class=\"item__text\">Contacto</a></li>\n</ul> </ul>\n </div>\n </div>\n </div>\n </div>\n</div>\n</footer></div></div></main><script type=\"text/x-magento-init\">\n {\n \"*\": {\n \"Magento_Ui/js/core/app\": {\n \"components\": {\n \"storage-manager\": {\n \"component\": \"Magento_Catalog/js/storage-manager\",\n \"appendTo\": \"\",\n \"storagesConfiguration\" :\n {\"recently_viewed_product\":{\"requestConfig\":{\"syncUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/catalog\\/product\\/frontend_action_synchronize\\/\"},\"lifetime\":\"1000\",\"allowToSendRequest\":null},\"recently_compared_product\":{\"requestConfig\":{\"syncUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/catalog\\/product\\/frontend_action_synchronize\\/\"},\"lifetime\":\"1000\",\"allowToSendRequest\":null},\"product_data_storage\":{\"updateRequestConfig\":{\"url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/rest\\/c9494\\/V1\\/products-render-info\"},\"allowToSendRequest\":null}} }\n }\n }\n }\n }\n</script>\n\n<div class=\"cart-modal flex-container flex-row justify-end items-start\">\n\n <div class=\"cart--wrapper flex-item\">\n\n <div id=\"cart-modal-info-wrapper\" class=\"block--container flex-container flex-column justify-start\">\n </div>\n\n <div class=\"cart__control\">\n <div class=\"button button__icon cart__close flex-container flex-row justify-center items-center\" data-myaction=\"closeCustomModal\" data-target=\"cart-modal\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n </div>\n\n</div><div class=\"listas-modal flex-container flex-row justify-end items-center\">\n <div class=\"cart--wrapper flex-item\">\n\n <div class=\"listas--container listas--container--full flex-container flex-column\">\n\n <div class=\"cart__controls--wrapper flex-item\">\n <div class=\"cart__controls--container flex-row justify-between items-center\">\n <div class=\"cart__control cart__control--lists flex-item\">\n <div class=\"button button__icon cart__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"listas-modal\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n <div class=\"cart__control--list cart__control--lists flex-item\">\n <div class=\"button button__icon cart__back--list flex-container flex-row justify-center items-center action_openDinolistasModal\"\n data-url=\"https://www.hiperdino.es/c9495/hdwishlists/xhr/dinolistasAll/viewAll/1/\">\n <span class=\"flex-item text-base\">Ver listas HiperDino</span>\n <i class=\"icon icon-arrow_forward flex-item\"></i>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"wishlists-all-wrapper\">\n </div>\n\n </div>\n\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-wishlists-add flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-wishlists-add\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n Selecciona una lista </div>\n </div>\n\n <form id=\"wishlists-add-form\" method=\"post\" action=\"https://www.hiperdino.es/c9495/hdwishlists/xhr/addWishlistProduct/\">\n <input type=\"hidden\" name=\"product_id\" value=\"\" />\n <input type=\"hidden\" name=\"qty\" value=\"\" />\n <input type=\"hidden\" name=\"from_cart\" value=\"\" />\n <input type=\"hidden\" name=\"from_dinolista\" value=\"\" />\n <input type=\"hidden\" name=\"from_recipe\" value=\"\" />\n <input type=\"hidden\" name=\"product_options\" value=\"\" />\n <input type=\"hidden\" name=\"recipe_products\" value=\"\" />\n <div id=\"wishlists-add-form-content\" data-url=\"https://www.hiperdino.es/c9495/hdwishlists/xhr/addForm/\">\n </div>\n </form>\n\n </div>\n </div>\n\n </div>\n\n </div>\n</div>\n<div class=\"dinolistas-modal flex-container flex-row justify-end items-center\">\n <div class=\"cart--wrapper flex-item\">\n\n <div class=\"listas--container listas--container--full flex-container flex-column\">\n\n <div class=\"cart__controls--wrapper flex-item\">\n <div class=\"cart__controls--container flex-row justify-between items-center\">\n <div class=\"cart__control cart__control--lists flex-item\">\n <div class=\"button button__icon cart__close flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dinolistas-modal\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n <div class=\"cart__control--list cart__control--lists flex-item\">\n <div class=\"button button__icon cart__back--list flex-container flex-row justify-center items-center action_backToListas\">\n <i class=\"icon icon-arrow_back flex-item\"></i>\n <span class=\"flex-item text-base\">Volver a Mis Listas</span>\n </div>\n </div>\n </div>\n </div>\n\n <div id=\"dinolistas-all-wrapper\">\n </div>\n\n </div>\n\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-wishlists-share flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-wishlists-share\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\" style=\"line-height: 1;\">\n Escribe el email de la persona con la que quieres compartir esta lista </div>\n </div>\n\n <form id=\"wishlists-share-form\" method=\"post\" action=\"https://www.hiperdino.es/c9495/hdwishlists/xhr/shareWishlist/\">\n <input type=\"hidden\" name=\"wishlist_id\" value=\"\" />\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"text\" name=\"email\" value=\"\" placeholder=\"\" />\n <label class=\"control-label\" for=\"input\">Correo electrónico</label>\n </div>\n </div>\n </div>\n </div>\n <div class=\"\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal checked has-margin-bottom flex-container flex-row justify-center items-center\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text button__text--checkout flex-item\">\n Compartir </div>\n </div>\n </div>\n </button>\n </div>\n </form>\n\n </div>\n </div>\n\n </div>\n\n </div>\n</div>\n<div class=\"dialogBox-modal dialogBox-modal-checkoutpswd flex-container flex-row justify-center items-center\">\n\n <div class=\"dialogBox--wrapper dialogBox--wrapper--height-fixed postal-wrapper has-not-padding flex-item\">\n\n <div class=\"dialogBox__item dialogBox__recover flex-container flex-row-toggle justify-between\">\n\n <div class=\"login__control quickview__control quickview__control-modal\">\n <div class=\"button button__icon quickview__close control-position flex-container flex-row justify-center items-center\"\n data-myaction=\"closeCustomModal\" data-target=\"dialogBox-modal-checkoutpswd\">\n <i class=\"icon icon-close flex-item\"></i>\n </div>\n </div>\n\n <div class=\"dialogBox__recover-content flex-item\">\n <div class=\"dialogBox__content flex-container flex-column\">\n\n <div class=\"dialogBox__title flex-item\">\n <div class=\"title__text\">\n Introduce tu contraseña </div>\n </div>\n\n <div class=\"dialogBox__sub-title flex-item\">\n <div class=\"sub-title__text\">\n Para usar una tarjeta guardada es necesario que introduzcas nuevamente tu clave de usuario. </div>\n </div>\n\n <br/>\n\n <form id=\"modalCheckoutPswdForm\">\n <div class=\"form-control no-border\">\n <div class=\"input input__complex input__complex--modal input__complex--container flex-container flex-row justify-center items-center\">\n <div class=\"input__content flex-item\">\n <div class=\"flex-container flex-row justify-center items-center\">\n <div class=\"input-wrapper\">\n <input type=\"password\" name=\"modal-checkoutpswd\" value=\"\" placeholder=\"\" />\n <label class=\"control-label\" for=\"input\">Contraseña</label>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"form-control no-border\">\n <button type=\"submit\" class=\"button button__complex button__complex--modal checked has-margin-bottom flex-container flex-row justify-center items-center\">\n <div class=\"button__content flex-item\">\n <div class=\"button__content--container flex-container flex-row justify-center items-center\">\n <div class=\"button__text button__text--checkout flex-item\">\n Realizar pedido </div>\n </div>\n </div>\n </button>\n </div>\n </form>\n\n </div>\n </div>\n\n </div>\n\n </div>\n</div>\n</div><div class=\"full-select--wrapper\"><div class=\"full-select--container\">&nbsp;</div></div> </body>\n</html>\n\n\n", "url": "/tema3-web/practicas/p9-t3-transforming-data/arroz.html" }, { "title": "Página Completa https://www.hiperdino.es/c9495/", "excerpt": "\n", "content": "Página Completa https://www.hiperdino.es/c9495/\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n206\n207\n208\n209\n210\n211\n212\n213\n214\n215\n216\n217\n218\n219\n220\n221\n222\n223\n224\n225\n226\n227\n228\n229\n230\n231\n232\n233\n234\n235\n236\n237\n238\n239\n240\n241\n242\n243\n244\n245\n246\n247\n248\n249\n250\n251\n252\n253\n254\n255\n256\n257\n258\n259\n260\n261\n262\n263\n264\n265\n266\n267\n268\n269\n270\n271\n272\n273\n274\n275\n276\n277\n278\n279\n280\n281\n282\n283\n284\n285\n286\n287\n288\n289\n290\n291\n292\n293\n294\n295\n296\n297\n298\n299\n300\n301\n302\n303\n304\n305\n306\n307\n308\n309\n310\n311\n312\n313\n314\n315\n316\n317\n318\n319\n320\n321\n322\n323\n324\n325\n326\n327\n328\n329\n330\n331\n332\n333\n334\n335\n336\n337\n338\n339\n340\n341\n342\n343\n344\n345\n346\n347\n348\n349\n350\n351\n352\n353\n354\n355\n356\n357\n358\n359\n360\n361\n362\n363\n364\n365\n366\n367\n368\n369\n370\n371\n372\n373\n374\n375\n376\n377\n378\n379\n380\n381\n382\n383\n384\n385\n386\n387\n388\n389\n390\n391\n392\n393\n394\n395\n396\n397\n398\n399\n400\n401\n402\n403\n404\n405\n406\n407\n408\n409\n410\n411\n412\n413\n414\n415\n416\n417\n418\n419\n420\n421\n422\n423\n424\n425\n426\n427\n428\n429\n430\n431\n432\n433\n434\n435\n436\n437\n438\n439\n440\n441\n442\n443\n444\n445\n446\n447\n448\n449\n450\n451\n452\n453\n454\n455\n456\n457\n458\n459\n460\n461\n462\n463\n464\n465\n466\n467\n468\n469\n470\n471\n472\n473\n474\n475\n476\n477\n478\n479\n480\n481\n482\n483\n484\n485\n486\n487\n488\n489\n490\n491\n492\n493\n494\n495\n496\n497\n498\n499\n500\n501\n502\n503\n504\n505\n506\n507\n508\n509\n510\n511\n512\n513\n514\n515\n516\n517\n518\n519\n520\n521\n522\n523\n524\n525\n526\n527\n528\n529\n530\n531\n532\n533\n534\n535\n536\n537\n538\n539\n540\n541\n542\n543\n544\n545\n546\n547\n548\n549\n550\n551\n552\n553\n554\n555\n556\n557\n558\n559\n560\n561\n562\n563\n564\n565\n566\n567\n568\n569\n570\n571\n572\n573\n574\n575\n576\n577\n578\n579\n580\n581\n582\n583\n584\n585\n586\n587\n588\n589\n590\n591\n592\n593\n594\n595\n596\n597\n598\n599\n600\n601\n602\n603\n604\n605\n606\n607\n608\n609\n610\n611\n612\n613\n614\n615\n616\n617\n618\n619\n620\n621\n622\n623\n624\n625\n626\n627\n628\n629\n630\n631\n632\n633\n634\n635\n636\n637\n638\n639\n640\n641\n642\n643\n644\n645\n646\n647\n648\n649\n650\n651\n652\n653\n654\n655\n656\n657\n658\n659\n660\n661\n662\n663\n664\n665\n666\n667\n668\n669\n670\n671\n672\n673\n674\n675\n676\n677\n678\n679\n680\n681\n682\n683\n684\n685\n686\n687\n688\n689\n690\n691\n692\n693\n694\n695\n696\n697\n698\n699\n700\n701\n702\n703\n704\n705\n706\n707\n708\n709\n710\n711\n712\n713\n714\n715\n716\n717\n718\n719\n720\n721\n722\n723\n724\n725\n726\n727\n728\n729\n730\n731\n732\n733\n734\n735\n736\n737\n738\n739\n740\n741\n742\n743\n744\n745\n746\n747\n748\n749\n750\n751\n752\n753\n754\n755\n756\n757\n758\n759\n760\n761\n762\n763\n764\n765\n766\n767\n768\n769\n770\n771\n772\n773\n774\n775\n776\n777\n778\n779\n780\n781\n782\n783\n784\n785\n786\n787\n788\n789\n790\n791\n792\n793\n794\n795\n796\n797\n798\n799\n800\n801\n802\n803\n804\n805\n806\n807\n808\n809\n810\n811\n812\n813\n814\n815\n816\n817\n818\n819\n820\n821\n822\n823\n824\n825\n826\n827\n828\n829\n830\n831\n832\n833\n834\n835\n836\n837\n838\n839\n840\n841\n842\n843\n844\n845\n846\n847\n848\n849\n850\n851\n852\n853\n854\n855\n856\n857\n858\n859\n860\n861\n862\n863\n864\n865\n866\n867\n868\n869\n870\n871\n872\n873\n874\n875\n876\n877\n878\n879\n880\n881\n882\n883\n884\n885\n886\n887\n888\n889\n890\n891\n892\n893\n894\n895\n896\n897\n898\n899\n900\n901\n902\n903\n904\n905\n906\n907\n908\n909\n910\n911\n912\n913\n914\n915\n916\n917\n918\n919\n920\n921\n922\n923\n924\n925\n926\n927\n928\n929\n930\n931\n932\n933\n934\n935\n936\n937\n938\n939\n940\n941\n942\n943\n944\n945\n946\n947\n948\n949\n950\n951\n952\n953\n954\n955\n956\n957\n958\n959\n960\n961\n962\n963\n964\n965\n966\n967\n968\n969\n970\n971\n972\n973\n974\n975\n976\n977\n978\n979\n980\n981\n982\n983\n984\n985\n986\n987\n988\n989\n990\n991\n992\n993\n994\n995\n996\n997\n998\n999\n1000\n1001\n1002\n1003\n1004\n1005\n1006\n1007\n1008\n1009\n1010\n1011\n1012\n1013\n1014\n1015\n1016\n1017\n1018\n1019\n1020\n1021\n1022\n1023\n1024\n1025\n1026\n1027\n1028\n1029\n1030\n1031\n1032\n1033\n1034\n1035\n1036\n1037\n1038\n1039\n1040\n1041\n1042\n1043\n1044\n1045\n1046\n1047\n1048\n1049\n1050\n1051\n1052\n1053\n1054\n1055\n1056\n1057\n1058\n1059\n1060\n1061\n1062\n1063\n1064\n1065\n1066\n1067\n1068\n1069\n1070\n1071\n1072\n1073\n1074\n1075\n1076\n1077\n1078\n1079\n1080\n1081\n1082\n1083\n1084\n1085\n1086\n1087\n1088\n1089\n1090\n1091\n1092\n1093\n1094\n1095\n1096\n1097\n1098\n1099\n1100\n1101\n1102\n1103\n1104\n1105\n1106\n1107\n1108\n1109\n1110\n1111\n1112\n1113\n1114\n1115\n1116\n1117\n1118\n1119\n1120\n1121\n1122\n1123\n1124\n1125\n1126\n1127\n1128\n1129\n1130\n1131\n1132\n1133\n1134\n1135\n1136\n1137\n1138\n1139\n1140\n1141\n1142\n1143\n1144\n1145\n1146\n1147\n1148\n1149\n1150\n1151\n1152\n1153\n1154\n1155\n1156\n1157\n1158\n1159\n1160\n1161\n1162\n1163\n1164\n1165\n1166\n1167\n1168\n1169\n1170\n1171\n1172\n1173\n1174\n1175\n1176\n1177\n1178\n1179\n1180\n1181\n1182\n1183\n1184\n1185\n1186\n1187\n1188\n1189\n1190\n1191\n1192\n1193\n1194\n1195\n1196\n1197\n1198\n1199\n1200\n1201\n1202\n1203\n1204\n1205\n1206\n1207\n1208\n1209\n1210\n1211\n1212\n1213\n1214\n1215\n1216\n1217\n1218\n1219\n1220\n1221\n1222\n1223\n1224\n1225\n1226\n1227\n1228\n1229\n1230\n1231\n1232\n1233\n1234\n1235\n1236\n1237\n1238\n1239\n1240\n1241\n1242\n1243\n1244\n1245\n1246\n1247\n1248\n1249\n1250\n1251\n1252\n1253\n1254\n1255\n1256\n1257\n1258\n1259\n1260\n1261\n1262\n1263\n1264\n1265\n1266\n1267\n1268\n1269\n1270\n1271\n1272\n1273\n1274\n1275\n1276\n1277\n1278\n1279\n1280\n1281\n1282\n1283\n1284\n1285\n1286\n1287\n1288\n1289\n1290\n1291\n1292\n1293\n1294\n1295\n1296\n1297\n1298\n1299\n1300\n1301\n1302\n1303\n1304\n1305\n1306\n1307\n1308\n1309\n1310\n1311\n1312\n1313\n1314\n1315\n1316\n1317\n1318\n1319\n1320\n1321\n1322\n1323\n1324\n1325\n1326\n1327\n1328\n1329\n1330\n1331\n1332\n1333\n1334\n1335\n1336\n1337\n1338\n1339\n1340\n1341\n1342\n1343\n1344\n1345\n1346\n1347\n1348\n1349\n1350\n1351\n1352\n1353\n1354\n1355\n1356\n1357\n1358\n1359\n1360\n1361\n1362\n1363\n1364\n1365\n1366\n1367\n1368\n1369\n1370\n1371\n1372\n1373\n1374\n1375\n1376\n1377\n1378\n1379\n1380\n1381\n1382\n1383\n1384\n1385\n1386\n1387\n1388\n1389\n1390\n1391\n1392\n1393\n1394\n1395\n1396\n1397\n1398\n1399\n1400\n1401\n1402\n1403\n1404\n1405\n1406\n1407\n1408\n1409\n1410\n1411\n1412\n1413\n1414\n1415\n1416\n1417\n1418\n1419\n1420\n1421\n1422\n1423\n1424\n1425\n1426\n1427\n1428\n1429\n1430\n1431\n1432\n1433\n1434\n1435\n1436\n1437\n1438\n1439\n1440\n1441\n1442\n1443\n1444\n1445\n1446\n1447\n1448\n1449\n1450\n1451\n1452\n1453\n1454\n1455\n1456\n1457\n1458\n1459\n1460\n1461\n1462\n1463\n1464\n1465\n1466\n1467\n1468\n1469\n1470\n1471\n1472\n1473\n1474\n1475\n1476\n1477\n1478\n1479\n1480\n1481\n1482\n1483\n1484\n1485\n1486\n1487\n1488\n1489\n1490\n1491\n1492\n1493\n1494\n1495\n1496\n1497\n1498\n1499\n1500\n1501\n1502\n1503\n1504\n1505\n1506\n1507\n1508\n1509\n1510\n1511\n1512\n1513\n1514\n1515\n1516\n1517\n1518\n1519\n1520\n1521\n1522\n1523\n1524\n1525\n1526\n1527\n1528\n1529\n1530\n1531\n1532\n1533\n1534\n1535\n1536\n1537\n1538\n1539\n1540\n1541\n1542\n1543\n1544\n1545\n1546\n1547\n1548\n1549\n1550\n1551\n1552\n1553\n1554\n1555\n1556\n1557\n1558\n1559\n1560\n1561\n1562\n1563\n1564\n1565\n1566\n1567\n1568\n1569\n1570\n1571\n1572\n1573\n1574\n1575\n1576\n1577\n1578\n1579\n1580\n1581\n1582\n1583\n1584\n1585\n1586\n1587\n1588\n1589\n1590\n1591\n1592\n1593\n1594\n1595\n1596\n1597\n1598\n1599\n1600\n1601\n1602\n1603\n1604\n1605\n1606\n1607\n1608\n1609\n1610\n1611\n1612\n1613\n1614\n1615\n1616\n1617\n1618\n1619\n1620\n1621\n1622\n1623\n1624\n1625\n1626\n1627\n1628\n1629\n1630\n1631\n1632\n1633\n1634\n1635\n1636\n1637\n1638\n1639\n1640\n1641\n1642\n1643\n1644\n1645\n1646\n1647\n1648\n1649\n1650\n1651\n1652\n1653\n1654\n1655\n1656\n1657\n1658\n1659\n1660\n1661\n1662\n1663\n1664\n1665\n1666\n1667\n1668\n1669\n1670\n1671\n1672\n1673\n1674\n1675\n1676\n1677\n1678\n1679\n1680\n1681\n1682\n1683\n1684\n1685\n1686\n1687\n1688\n1689\n1690\n1691\n1692\n1693\n1694\n1695\n1696\n1697\n1698\n1699\n1700\n1701\n1702\n1703\n1704\n1705\n1706\n1707\n1708\n1709\n1710\n1711\n1712\n1713\n1714\n1715\n1716\n1717\n1718\n1719\n1720\n1721\n1722\n1723\n1724\n1725\n1726\n1727\n1728\n1729\n1730\n1731\n1732\n1733\n1734\n1735\n1736\n1737\n1738\n1739\n1740\n1741\n1742\n1743\n1744\n1745\n1746\n1747\n1748\n1749\n1750\n1751\n1752\n1753\n1754\n1755\n1756\n1757\n1758\n1759\n1760\n1761\n1762\n1763\n1764\n1765\n1766\n1767\n1768\n1769\n1770\n1771\n1772\n1773\n1774\n1775\n1776\n1777\n1778\n1779\n1780\n1781\n1782\n1783\n1784\n1785\n1786\n1787\n1788\n1789\n1790\n1791\n1792\n1793\n1794\n1795\n1796\n1797\n1798\n1799\n1800\n1801\n1802\n1803\n1804\n1805\n1806\n1807\n1808\n1809\n1810\n1811\n1812\n1813\n1814\n1815\n1816\n1817\n1818\n1819\n1820\n1821\n1822\n1823\n1824\n1825\n1826\n1827\n1828\n1829\n1830\n1831\n1832\n1833\n1834\n1835\n1836\n1837\n1838\n1839\n1840\n1841\n1842\n1843\n1844\n1845\n1846\n1847\n1848\n1849\n1850\n1851\n1852\n1853\n1854\n1855\n1856\n1857\n1858\n1859\n1860\n1861\n1862\n1863\n1864\n1865\n1866\n1867\n1868\n1869\n1870\n1871\n1872\n1873\n1874\n1875\n1876\n1877\n1878\n1879\n1880\n1881\n1882\n1883\n1884\n1885\n1886\n1887\n1888\n1889\n1890\n1891\n1892\n1893\n1894\n1895\n1896\n1897\n1898\n1899\n1900\n1901\n1902\n1903\n1904\n1905\n1906\n1907\n1908\n1909\n1910\n1911\n1912\n1913\n1914\n1915\n1916\n1917\n1918\n1919\n1920\n1921\n1922\n1923\n1924\n1925\n1926\n1927\n1928\n1929\n1930\n1931\n1932\n1933\n1934\n1935\n1936\n1937\n1938\n1939\n1940\n1941\n1942\n1943\n1944\n1945\n1946\n1947\n1948\n1949\n1950\n1951\n1952\n1953\n1954\n1955\n1956\n1957\n1958\n1959\n1960\n1961\n1962\n1963\n1964\n1965\n1966\n1967\n1968\n1969\n1970\n1971\n1972\n1973\n1974\n1975\n1976\n1977\n1978\n1979\n1980\n1981\n1982\n1983\n1984\n1985\n1986\n1987\n1988\n1989\n1990\n1991\n1992\n1993\n1994\n1995\n1996\n1997\n1998\n1999\n2000\n2001\n2002\n2003\n2004\n2005\n2006\n2007\n2008\n2009\n2010\n2011\n2012\n2013\n2014\n2015\n2016\n2017\n2018\n2019\n2020\n2021\n2022\n2023\n2024\n2025\n2026\n2027\n2028\n2029\n2030\n2031\n2032\n2033\n2034\n2035\n2036\n2037\n2038\n2039\n2040\n2041\n2042\n2043\n2044\n2045\n2046\n2047\n2048\n2049\n2050\n2051\n2052\n2053\n2054\n2055\n2056\n2057\n2058\n2059\n2060\n2061\n2062\n2063\n2064\n2065\n2066\n2067\n2068\n2069\n2070\n2071\n2072\n2073\n2074\n2075\n2076\n2077\n2078\n2079\n2080\n2081\n2082\n2083\n2084\n2085\n2086\n2087\n2088\n2089\n2090\n2091\n2092\n2093\n2094\n2095\n2096\n2097\n2098\n2099\n2100\n2101\n2102\n2103\n2104\n2105\n2106\n2107\n2108\n2109\n2110\n2111\n2112\n2113\n2114\n2115\n2116\n2117\n2118\n2119\n2120\n2121\n2122\n2123\n2124\n2125\n2126\n2127\n2128\n2129\n2130\n2131\n2132\n2133\n2134\n2135\n2136\n2137\n2138\n2139\n2140\n2141\n2142\n2143\n2144\n2145\n2146\n2147\n2148\n2149\n2150\n2151\n2152\n2153\n2154\n2155\n2156\n2157\n2158\n2159\n2160\n2161\n2162\n2163\n2164\n2165\n2166\n2167\n2168\n2169\n2170\n2171\n2172\n2173\n2174\n2175\n2176\n2177\n2178\n2179\n2180\n2181\n2182\n2183\n2184\n2185\n2186\n2187\n2188\n2189\n2190\n2191\n2192\n2193\n2194\n2195\n2196\n2197\n2198\n2199\n2200\n2201\n2202\n2203\n2204\n2205\n2206\n2207\n2208\n2209\n2210\n2211\n2212\n2213\n2214\n2215\n2216\n2217\n2218\n2219\n2220\n2221\n2222\n2223\n2224\n2225\n2226\n2227\n2228\n2229\n2230\n2231\n2232\n2233\n2234\n2235\n2236\n2237\n2238\n2239\n2240\n2241\n2242\n2243\n2244\n2245\n2246\n2247\n2248\n2249\n2250\n2251\n2252\n2253\n2254\n2255\n2256\n2257\n2258\n2259\n2260\n2261\n2262\n2263\n2264\n2265\n2266\n2267\n2268\n2269\n2270\n2271\n2272\n2273\n2274\n2275\n2276\n2277\n2278\n2279\n2280\n2281\n2282\n2283\n2284\n2285\n2286\n2287\n2288\n2289\n2290\n2291\n2292\n2293\n2294\n2295\n2296\n2297\n2298\n2299\n2300\n2301\n2302\n2303\n2304\n2305\n2306\n2307\n2308\n2309\n2310\n2311\n2312\n2313\n2314\n2315\n2316\n2317\n2318\n2319\n2320\n2321\n2322\n2323\n2324\n2325\n2326\n2327\n2328\n2329\n2330\n2331\n2332\n2333\n2334\n2335\n2336\n2337\n2338\n2339\n2340\n2341\n2342\n2343\n2344\n2345\n2346\n2347\n2348\n2349\n2350\n2351\n2352\n2353\n2354\n2355\n2356\n2357\n2358\n2359\n2360\n2361\n2362\n2363\n2364\n2365\n2366\n2367\n2368\n2369\n2370\n2371\n2372\n2373\n2374\n2375\n2376\n2377\n2378\n2379\n2380\n2381\n2382\n2383\n2384\n2385\n2386\n2387\n2388\n2389\n2390\n2391\n2392\n2393\n2394\n2395\n2396\n2397\n2398\n2399\n2400\n2401\n2402\n2403\n2404\n2405\n2406\n2407\n2408\n2409\n2410\n2411\n2412\n2413\n2414\n2415\n2416\n2417\n2418\n2419\n2420\n2421\n2422\n2423\n2424\n2425\n2426\n2427\n2428\n2429\n2430\n2431\n2432\n2433\n2434\n2435\n2436\n2437\n2438\n2439\n2440\n2441\n2442\n2443\n2444\n2445\n2446\n2447\n2448\n2449\n2450\n2451\n2452\n2453\n2454\n2455\n2456\n2457\n2458\n2459\n2460\n2461\n2462\n2463\n2464\n2465\n2466\n2467\n2468\n2469\n2470\n2471\n2472\n2473\n2474\n2475\n2476\n2477\n2478\n2479\n2480\n2481\n2482\n2483\n2484\n2485\n2486\n2487\n2488\n2489\n2490\n2491\n2492\n2493\n2494\n2495\n2496\n2497\n2498\n2499\n2500\n2501\n2502\n2503\n2504\n2505\n2506\n2507\n2508\n2509\n2510\n2511\n2512\n2513\n2514\n2515\n2516\n2517\n2518\n2519\n2520\n2521\n2522\n2523\n2524\n2525\n2526\n2527\n2528\n2529\n2530\n2531\n2532\n2533\n2534\n2535\n2536\n2537\n2538\n2539\n2540\n2541\n2542\n2543\n2544\n2545\n2546\n2547\n2548\n2549\n2550\n2551\n2552\n2553\n2554\n2555\n2556\n2557\n2558\n2559\n2560\n2561\n2562\n2563\n2564\n2565\n2566\n2567\n2568\n2569\n2570\n2571\n2572\n2573\n2574\n2575\n2576\n2577\n2578\n2579\n2580\n2581\n2582\n2583\n2584\n2585\n2586\n2587\n2588\n2589\n2590\n2591\n2592\n2593\n2594\n2595\n2596\n2597\n2598\n2599\n2600\n2601\n2602\n2603\n2604\n2605\n2606\n2607\n2608\n2609\n2610\n2611\n2612\n2613\n2614\n2615\n2616\n2617\n2618\n2619\n2620\n2621\n2622\n2623\n2624\n2625\n2626\n2627\n2628\n2629\n2630\n2631\n2632\n2633\n2634\n2635\n2636\n2637\n2638\n2639\n2640\n2641\n2642\n2643\n2644\n2645\n2646\n2647\n2648\n2649\n2650\n2651\n2652\n2653\n2654\n2655\n2656\n2657\n2658\n2659\n2660\n2661\n2662\n2663\n2664\n2665\n2666\n2667\n2668\n2669\n2670\n2671\n2672\n2673\n2674\n2675\n2676\n2677\n2678\n2679\n2680\n2681\n2682\n2683\n2684\n2685\n2686\n2687\n2688\n2689\n2690\n2691\n2692\n2693\n2694\n2695\n2696\n2697\n2698\n2699\n2700\n2701\n2702\n2703\n2704\n2705\n2706\n2707\n2708\n2709\n2710\n2711\n2712\n2713\n2714\n2715\n2716\n2717\n2718\n2719\n2720\n2721\n2722\n2723\n2724\n2725\n2726\n2727\n2728\n2729\n2730\n2731\n2732\n2733\n2734\n2735\n2736\n2737\n2738\n2739\n2740\n2741\n2742\n2743\n2744\n2745\n2746\n2747\n2748\n2749\n2750\n2751\n2752\n2753\n2754\n2755\n2756\n2757\n2758\n2759\n2760\n2761\n2762\n2763\n2764\n2765\n2766\n2767\n2768\n2769\n2770\n2771\n2772\n2773\n2774\n2775\n2776\n2777\n2778\n2779\n2780\n2781\n2782\n2783\n2784\n2785\n2786\n2787\n2788\n2789\n2790\n2791\n2792\n2793\n2794\n2795\n2796\n2797\n2798\n2799\n2800\n2801\n2802\n2803\n2804\n2805\n2806\n2807\n2808\n2809\n2810\n2811\n2812\n2813\n2814\n2815\n2816\n2817\n2818\n2819\n2820\n2821\n2822\n2823\n2824\n2825\n2826\n2827\n2828\n2829\n2830\n2831\n2832\n2833\n2834\n2835\n2836\n2837\n2838\n2839\n2840\n2841\n2842\n2843\n2844\n2845\n2846\n2847\n2848\n2849\n2850\n2851\n2852\n2853\n2854\n2855\n2856\n2857\n2858\n2859\n2860\n2861\n2862\n2863\n2864\n2865\n2866\n2867\n2868\n2869\n2870\n2871\n2872\n2873\n2874\n2875\n2876\n2877\n2878\n2879\n2880\n2881\n2882\n2883\n2884\n2885\n2886\n2887\n2888\n2889\n2890\n2891\n2892\n2893\n2894\n2895\n2896\n2897\n2898\n2899\n2900\n2901\n2902\n2903\n2904\n2905\n2906\n2907\n2908\n2909\n2910\n2911\n2912\n2913\n2914\n2915\n2916\n2917\n2918\n2919\n2920\n2921\n2922\n2923\n2924\n2925\n2926\n2927\n2928\n2929\n2930\n2931\n2932\n2933\n2934\n2935\n2936\n2937\n2938\n2939\n2940\n2941\n2942\n2943\n2944\n2945\n2946\n2947\n2948\n2949\n2950\n2951\n2952\n2953\n2954\n2955\n2956\n2957\n2958\n2959\n2960\n2961\n2962\n2963\n2964\n2965\n2966\n2967\n2968\n2969\n2970\n2971\n2972\n2973\n2974\n2975\n2976\n2977\n2978\n2979\n2980\n2981\n2982\n2983\n2984\n2985\n2986\n2987\n2988\n2989\n2990\n2991\n2992\n2993\n2994\n2995\n2996\n2997\n2998\n2999\n3000\n3001\n3002\n3003\n3004\n3005\n3006\n3007\n3008\n3009\n3010\n3011\n3012\n3013\n3014\n3015\n3016\n3017\n3018\n3019\n3020\n3021\n3022\n3023\n3024\n3025\n3026\n3027\n3028\n3029\n3030\n3031\n3032\n3033\n3034\n3035\n3036\n3037\n3038\n3039\n3040\n3041\n3042\n3043\n3044\n3045\n3046\n3047\n3048\n3049\n3050\n3051\n3052\n3053\n3054\n3055\n3056\n3057\n3058\n3059\n3060\n3061\n3062\n3063\n3064\n3065\n3066\n3067\n3068\n3069\n3070\n3071\n3072\n3073\n3074\n3075\n3076\n3077\n3078\n3079\n3080\n3081\n3082\n3083\n3084\n3085\n3086\n3087\n3088\n3089\n3090\n3091\n3092\n3093\n3094\n3095\n3096\n3097\n3098\n3099\n3100\n3101\n3102\n3103\n3104\n3105\n3106\n3107\n3108\n3109\n3110\n3111\n3112\n3113\n3114\n3115\n3116\n3117\n3118\n3119\n3120\n3121\n3122\n3123\n3124\n3125\n3126\n3127\n3128\n3129\n3130\n3131\n3132\n3133\n3134\n3135\n3136\n3137\n3138\n3139\n3140\n3141\n3142\n3143\n3144\n3145\n3146\n3147\n3148\n3149\n3150\n3151\n3152\n3153\n3154\n3155\n3156\n3157\n3158\n3159\n3160\n3161\n3162\n3163\n3164\n3165\n3166\n3167\n3168\n3169\n3170\n3171\n3172\n3173\n3174\n3175\n3176\n3177\n3178\n3179\n3180\n3181\n3182\n3183\n3184\n3185\n3186\n3187\n3188\n3189\n3190\n3191\n3192\n3193\n3194\n3195\n3196\n3197\n3198\n3199\n3200\n3201\n3202\n3203\n3204\n3205\n3206\n3207\n3208\n3209\n3210\n3211\n3212\n3213\n3214\n3215\n3216\n3217\n3218\n3219\n3220\n3221\n3222\n3223\n3224\n3225\n3226\n3227\n3228\n3229\n3230\n3231\n3232\n3233\n3234\n3235\n3236\n3237\n3238\n3239\n3240\n3241\n3242\n3243\n3244\n3245\n3246\n3247\n3248\n3249\n3250\n3251\n3252\n3253\n3254\n3255\n3256\n3257\n3258\n3259\n3260\n3261\n3262\n3263\n3264\n3265\n3266\n3267\n3268\n3269\n3270\n3271\n3272\n3273\n3274\n3275\n3276\n3277\n3278\n3279\n3280\n3281\n3282\n3283\n3284\n3285\n3286\n3287\n3288\n3289\n3290\n3291\n3292\n3293\n3294\n3295\n3296\n3297\n3298\n3299\n3300\n3301\n3302\n3303\n3304\n3305\n3306\n3307\n3308\n3309\n3310\n3311\n3312\n3313\n3314\n3315\n3316\n3317\n3318\n3319\n3320\n3321\n3322\n3323\n3324\n3325\n3326\n3327\n3328\n3329\n3330\n3331\n3332\n3333\n3334\n3335\n3336\n3337\n3338\n3339\n3340\n3341\n3342\n3343\n3344\n3345\n3346\n3347\n3348\n3349\n3350\n3351\n3352\n3353\n3354\n3355\n3356\n3357\n3358\n3359\n3360\n3361\n3362\n3363\n3364\n3365\n3366\n3367\n3368\n3369\n3370\n3371\n3372\n3373\n3374\n3375\n3376\n3377\n3378\n3379\n3380\n3381\n3382\n3383\n3384\n3385\n3386\n3387\n3388\n3389\n3390\n3391\n3392\n3393\n3394\n3395\n3396\n3397\n3398\n3399\n3400\n3401\n3402\n3403\n3404\n3405\n3406\n3407\n3408\n3409\n3410\n3411\n3412\n3413\n3414\n3415\n3416\n3417\n3418\n3419\n3420\n3421\n3422\n3423\n3424\n3425\n3426\n3427\n3428\n3429\n3430\n3431\n3432\n3433\n3434\n3435\n3436\n3437\n3438\n3439\n3440\n3441\n3442\n3443\n3444\n3445\n3446\n3447\n3448\n3449\n3450\n3451\n3452\n3453\n3454\n3455\n3456\n3457\n3458\n3459\n3460\n3461\n3462\n3463\n3464\n3465\n3466\n3467\n3468\n3469\n3470\n3471\n3472\n3473\n3474\n3475\n3476\n3477\n3478\n3479\n3480\n3481\n3482\n3483\n3484\n3485\n3486\n3487\n3488\n3489\n3490\n3491\n3492\n3493\n3494\n3495\n3496\n3497\n3498\n3499\n3500\n3501\n3502\n3503\n3504\n3505\n3506\n3507\n3508\n3509\n3510\n3511\n3512\n3513\n3514\n3515\n3516\n3517\n3518\n3519\n3520\n3521\n3522\n3523\n3524\n3525\n3526\n3527\n3528\n3529\n3530\n3531\n3532\n3533\n3534\n3535\n3536\n3537\n3538\n3539\n3540\n3541\n3542\n3543\n3544\n3545\n3546\n3547\n3548\n3549\n3550\n3551\n3552\n3553\n3554\n3555\n3556\n3557\n3558\n3559\n3560\n3561\n3562\n3563\n3564\n3565\n3566\n3567\n3568\n3569\n3570\n3571\n3572\n3573\n3574\n3575\n3576\n3577\n3578\n3579\n3580\n3581\n3582\n3583\n3584\n3585\n3586\n3587\n3588\n3589\n3590\n3591\n3592\n3593\n3594\n3595\n3596\n3597\n3598\n3599\n3600\n3601\n3602\n3603\n3604\n3605\n3606\n3607\n3608\n3609\n3610\n3611\n3612\n3613\n3614\n3615\n3616\n3617\n3618\n3619\n3620\n3621\n3622\n3623\n3624\n3625\n3626\n3627\n3628\n3629\n3630\n3631\n3632\n3633\n3634\n3635\n3636\n3637\n3638\n3639\n3640\n3641\n3642\n3643\n3644\n3645\n3646\n3647\n3648\n3649\n3650\n3651\n3652\n3653\n3654\n3655\n3656\n3657\n3658\n3659\n3660\n3661\n3662\n3663\n3664\n3665\n3666\n3667\n3668\n3669\n3670\n3671\n3672\n3673\n3674\n3675\n3676\n3677\n3678\n3679\n3680\n3681\n3682\n3683\n3684\n3685\n3686\n3687\n3688\n3689\n3690\n3691\n3692\n3693\n3694\n3695\n3696\n3697\n3698\n3699\n3700\n3701\n3702\n3703\n3704\n3705\n3706\n3707\n3708\n3709\n3710\n3711\n3712\n3713\n3714\n3715\n3716\n3717\n3718\n3719\n3720\n3721\n3722\n3723\n3724\n3725\n3726\n3727\n3728\n3729\n3730\n3731\n3732\n3733\n3734\n3735\n3736\n3737\n3738\n3739\n3740\n3741\n3742\n3743\n3744\n3745\n3746\n3747\n3748\n3749\n3750\n3751\n3752\n3753\n3754\n3755\n3756\n3757\n3758\n3759\n3760\n3761\n3762\n3763\n3764\n3765\n3766\n3767\n3768\n3769\n3770\n3771\n3772\n3773\n3774\n3775\n3776\n3777\n3778\n3779\n3780\n3781\n3782\n3783\n3784\n3785\n3786\n3787\n3788\n3789\n3790\n3791\n3792\n3793\n3794\n3795\n3796\n3797\n3798\n3799\n3800\n3801\n3802\n3803\n3804\n3805\n3806\n3807\n3808\n3809\n3810\n3811\n3812\n3813\n3814\n3815\n3816\n3817\n3818\n3819\n3820\n3821\n3822\n3823\n3824\n3825\n3826\n3827\n3828\n3829\n3830\n3831\n3832\n3833\n3834\n3835\n3836\n3837\n3838\n3839\n3840\n3841\n3842\n3843\n3844\n3845\n3846\n3847\n3848\n3849\n3850\n3851\n3852\n3853\n3854\n3855\n3856\n3857\n3858\n3859\n3860\n3861\n3862\n3863\n3864\n3865\n3866\n3867\n3868\n3869\n3870\n3871\n3872\n3873\n3874\n3875\n3876\n3877\n3878\n3879\n3880\n3881\n3882\n3883\n3884\n3885\n3886\n3887\n3888\n3889\n3890\n3891\n3892\n3893\n3894\n3895\n3896\n3897\n3898\n3899\n3900\n3901\n3902\n3903\n3904\n3905\n3906\n3907\n3908\n3909\n3910\n3911\n3912\n3913\n3914\n3915\n3916\n3917\n3918\n3919\n3920\n3921\n3922\n3923\n3924\n3925\n3926\n3927\n3928\n3929\n3930\n3931\n3932\n3933\n3934\n3935\n3936\n3937\n3938\n3939\n3940\n3941\n3942\n3943\n3944\n3945\n3946\n3947\n3948\n3949\n3950\n3951\n3952\n3953\n3954\n3955\n3956\n3957\n3958\n3959\n3960\n3961\n3962\n3963\n3964\n3965\n3966\n3967\n3968\n3969\n3970\n3971\n3972\n3973\n3974\n3975\n3976\n3977\n3978\n3979\n3980\n3981\n3982\n3983\n3984\n3985\n3986\n3987\n3988\n3989\n3990\n3991\n3992\n3993\n3994\n3995\n3996\n3997\n3998\n3999\n4000\n4001\n4002\n4003\n4004\n4005\n4006\n4007\n4008\n4009\n4010\n4011\n4012\n4013\n4014\n4015\n4016\n4017\n4018\n4019\n4020\n4021\n4022\n4023\n4024\n4025\n4026\n4027\n4028\n4029\n4030\n4031\n4032\n4033\n4034\n4035\n4036\n4037\n4038\n4039\n4040\n4041\n4042\n4043\n4044\n4045\n4046\n4047\n4048\n4049\n4050\n4051\n4052\n4053\n4054\n4055\n4056\n4057\n4058\n4059\n4060\n4061\n4062\n4063\n4064\n4065\n4066\n4067\n4068\n4069\n4070\n4071\n4072\n4073\n4074\n4075\n4076\n4077\n4078\n4079\n4080\n4081\n4082\n4083\n4084\n4085\n4086\n4087\n4088\n4089\n4090\n4091\n4092\n4093\n4094\n4095\n4096\n4097\n4098\n4099\n4100\n4101\n4102\n4103\n4104\n4105\n4106\n4107\n4108\n4109\n4110\n4111\n4112\n4113\n4114\n4115\n4116\n4117\n4118\n4119\n4120\n4121\n4122\n4123\n4124\n4125\n4126\n4127\n4128\n4129\n4130\n4131\n4132\n4133\n4134\n4135\n4136\n4137\n4138\n4139\n4140\n4141\n4142\n4143\n4144\n4145\n4146\n4147\n4148\n4149\n4150\n4151\n4152\n4153\n4154\n4155\n4156\n4157\n4158\n4159\n4160\n4161\n4162\n4163\n4164\n4165\n4166\n4167\n4168\n4169\n4170\n4171\n4172\n4173\n4174\n4175\n4176\n4177\n4178\n4179\n4180\n4181\n4182\n4183\n4184\n4185\n4186\n4187\n4188\n4189\n4190\n4191\n4192\n4193\n4194\n4195\n4196\n4197\n4198\n4199\n4200\n4201\n4202\n4203\n4204\n4205\n4206\n4207\n4208\n4209\n4210\n4211\n4212\n4213\n4214\n4215\n4216\n4217\n4218\n4219\n4220\n4221\n4222\n4223\n4224\n4225\n4226\n4227\n4228\n4229\n4230\n4231\n4232\n4233\n4234\n4235\n4236\n4237\n4238\n4239\n4240\n4241\n4242\n4243\n4244\n4245\n4246\n4247\n4248\n4249\n4250\n4251\n4252\n4253\n4254\n4255\n4256\n4257\n4258\n4259\n4260\n4261\n4262\n4263\n4264\n4265\n4266\n4267\n4268\n4269\n4270\n4271\n4272\n4273\n4274\n4275\n4276\n4277\n4278\n4279\n4280\n4281\n4282\n4283\n4284\n4285\n4286\n4287\n4288\n4289\n4290\n4291\n4292\n4293\n4294\n4295\n4296\n4297\n4298\n4299\n4300\n4301\n4302\n4303\n4304\n4305\n4306\n4307\n4308\n4309\n4310\n4311\n4312\n4313\n4314\n4315\n4316\n4317\n4318\n4319\n4320\n4321\n4322\n4323\n4324\n4325\n4326\n4327\n4328\n4329\n4330\n4331\n4332\n4333\n4334\n4335\n4336\n4337\n4338\n4339\n4340\n4341\n4342\n4343\n4344\n4345\n4346\n4347\n4348\n4349\n4350\n4351\n4352\n4353\n4354\n4355\n4356\n4357\n4358\n4359\n4360\n4361\n4362\n4363\n4364\n4365\n4366\n4367\n4368\n4369\n4370\n4371\n4372\n4373\n4374\n4375\n4376\n4377\n4378\n4379\n4380\n4381\n4382\n4383\n4384\n4385\n4386\n4387\n4388\n4389\n4390\n4391\n4392\n4393\n4394\n4395\n4396\n4397\n4398\n4399\n4400\n4401\n4402\n4403\n4404\n4405\n4406\n4407\n4408\n4409\n4410\n4411\n4412\n4413\n4414\n4415\n4416\n4417\n4418\n4419\n4420\n4421\n4422\n4423\n4424\n4425\n4426\n4427\n4428\n4429\n4430\n4431\n4432\n4433\n4434\n4435\n4436\n4437\n4438\n4439\n4440\n4441\n4442\n4443\n4444\n4445\n4446\n4447\n4448\n4449\n4450\n4451\n4452\n4453\n4454\n4455\n4456\n4457\n4458\n4459\n4460\n4461\n4462\n4463\n4464\n4465\n4466\n4467\n4468\n4469\n4470\n4471\n4472\n4473\n4474\n4475\n4476\n4477\n4478\n4479\n4480\n4481\n4482\n4483\n4484\n4485\n4486\n4487\n4488\n4489\n4490\n4491\n4492\n4493\n4494\n4495\n4496\n4497\n4498\n4499\n4500\n4501\n4502\n4503\n4504\n4505\n4506\n4507\n4508\n4509\n4510\n4511\n4512\n4513\n4514\n4515\n4516\n4517\n4518\n4519\n4520\n4521\n4522\n4523\n4524\n4525\n4526\n4527\n4528\n4529\n4530\n4531\n4532\n4533\n4534\n4535\n4536\n4537\n4538\n4539\n4540\n4541\n4542\n4543\n4544\n4545\n4546\n4547\n4548\n4549\n4550\n4551\n4552\n4553\n4554\n4555\n4556\n4557\n4558\n4559\n4560\n4561\n4562\n4563\n4564\n4565\n4566\n4567\n4568\n4569\n4570\n4571\n4572\n4573\n4574\n4575\n4576\n4577\n4578\n4579\n4580\n4581\n4582\n4583\n4584\n4585\n4586\n4587\n4588\n4589\n4590\n4591\n4592\n4593\n4594\n4595\n4596\n4597\n4598\n4599\n4600\n4601\n4602\n4603\n4604\n4605\n4606\n4607\n4608\n4609\n4610\n4611\n4612\n4613\n4614\n4615\n4616\n4617\n4618\n4619\n4620\n4621\n4622\n4623\n4624\n4625\n4626\n4627\n4628\n4629\n4630\n4631\n4632\n4633\n4634\n4635\n4636\n4637\n4638\n4639\n4640\n4641\n4642\n4643\n4644\n4645\n4646\n4647\n4648\n4649\n4650\n4651\n4652\n4653\n4654\n4655\n4656\n4657\n4658\n4659\n4660\n4661\n4662\n4663\n4664\n4665\n4666\n4667\n4668\n4669\n4670\n4671\n4672\n4673\n4674\n4675\n4676\n4677\n4678\n4679\n4680\n4681\n4682\n4683\n4684\n4685\n4686\n4687\n4688\n4689\n4690\n4691\n4692\n4693\n4694\n4695\n4696\n4697\n4698\n4699\n4700\n4701\n4702\n4703\n4704\n4705\n4706\n4707\n4708\n4709\n4710\n4711\n4712\n4713\n4714\n4715\n4716\n4717\n4718\n4719\n4720\n4721\n4722\n4723\n4724\n4725\n4726\n4727\n4728\n4729\n4730\n4731\n4732\n4733\n4734\n4735\n4736\n4737\n4738\n4739\n4740\n4741\n4742\n4743\n4744\n4745\n4746\n4747\n4748\n4749\n4750\n4751\n4752\n4753\n4754\n4755\n4756\n4757\n4758\n4759\n4760\n4761\n4762\n4763\n4764\n4765\n4766\n4767\n4768\n4769\n4770\n4771\n4772\n4773\n4774\n4775\n4776\n4777\n4778\n4779\n4780\n4781\n4782\n4783\n4784\n4785\n4786\n4787\n4788\n4789\n4790\n4791\n4792\n4793\n4794\n4795\n4796\n4797\n4798\n4799\n4800\n4801\n4802\n4803\n4804\n4805\n4806\n4807\n4808\n4809\n4810\n4811\n4812\n4813\n4814\n4815\n4816\n4817\n4818\n4819\n4820\n4821\n4822\n4823\n4824\n4825\n4826\n4827\n4828\n4829\n4830\n4831\n4832\n4833\n4834\n4835\n4836\n4837\n4838\n4839\n4840\n4841\n4842\n4843\n4844\n4845\n4846\n4847\n4848\n4849\n4850\n4851\n4852\n4853\n4854\n4855\n4856\n4857\n4858\n4859\n4860\n4861\n4862\n4863\n4864\n4865\n4866\n4867\n4868\n4869\n4870\n4871\n4872\n4873\n4874\n4875\n4876\n4877\n4878\n4879\n4880\n4881\n4882\n4883\n4884\n4885\n4886\n4887\n4888\n4889\n4890\n4891\n4892\n4893\n4894\n4895\n4896\n4897\n4898\n4899\n4900\n4901\n4902\n4903\n4904\n4905\n4906\n4907\n4908\n4909\n4910\n4911\n4912\n4913\n4914\n4915\n4916\n4917\n4918\n4919\n4920\n4921\n4922\n4923\n4924\n4925\n4926\n4927\n4928\n4929\n4930\n4931\n4932\n4933\n4934\n4935\n4936\n4937\n4938\n4939\n4940\n4941\n4942\n4943\n4944\n4945\n4946\n4947\n4948\n4949\n4950\n4951\n4952\n4953\n4954\n4955\n4956\n4957\n4958\n4959\n4960\n4961\n4962\n4963\n4964\n4965\n4966\n4967\n4968\n4969\n4970\n4971\n4972\n4973\n4974\n4975\n4976\n4977\n4978\n4979\n4980\n4981\n4982\n4983\n4984\n4985\n4986\n4987\n4988\n4989\n4990\n4991\n4992\n4993\n4994\n4995\n4996\n4997\n4998\n4999\n5000\n5001\n5002\n5003\n5004\n5005\n5006\n5007\n5008\n5009\n5010\n5011\n5012\n5013\n5014\n5015\n5016\n5017\n5018\n5019\n5020\n5021\n5022\n5023\n5024\n5025\n5026\n5027\n5028\n5029\n5030\n5031\n5032\n5033\n5034\n5035\n5036\n5037\n5038\n5039\n5040\n5041\n5042\n5043\n5044\n5045\n5046\n5047\n5048\n5049\n5050\n5051\n5052\n5053\n5054\n5055\n5056\n5057\n5058\n5059\n5060\n5061\n5062\n5063\n5064\n5065\n5066\n5067\n5068\n5069\n5070\n5071\n5072\n5073\n5074\n5075\n5076\n5077\n5078\n5079\n5080\n5081\n5082\n5083\n5084\n5085\n5086\n5087\n5088\n5089\n5090\n5091\n5092\n5093\n5094\n5095\n5096\n5097\n5098\n5099\n5100\n5101\n5102\n5103\n5104\n5105\n5106\n5107\n5108\n5109\n5110\n5111\n5112\n5113\n5114\n5115\n5116\n5117\n5118\n5119\n5120\n5121\n5122\n5123\n5124\n5125\n5126\n5127\n5128\n5129\n5130\n5131\n5132\n5133\n5134\n5135\n5136\n5137\n5138\n5139\n5140\n5141\n5142\n5143\n5144\n5145\n5146\n5147\n5148\n5149\n5150\n5151\n5152\n5153\n5154\n5155\n5156\n5157\n5158\n5159\n5160\n5161\n5162\n5163\n5164\n5165\n5166\n5167\n5168\n5169\n5170\n5171\n5172\n5173\n5174\n5175\n5176\n5177\n5178\n5179\n5180\n5181\n5182\n5183\n5184\n5185\n5186\n5187\n5188\n5189\n5190\n5191\n5192\n5193\n5194\n5195\n5196\n5197\n5198\n5199\n5200\n5201\n5202\n5203\n5204\n5205\n5206\n5207\n5208\n5209\n5210\n5211\n5212\n5213\n5214\n5215\n5216\n5217\n5218\n5219\n5220\n5221\n5222\n5223\n5224\n5225\n5226\n5227\n5228\n5229\n5230\n5231\n5232\n5233\n5234\n5235\n5236\n5237\n5238\n5239\n5240\n5241\n5242\n5243\n5244\n5245\n5246\n5247\n5248\n5249\n5250\n5251\n5252\n5253\n5254\n5255\n5256\n5257\n5258\n5259\n5260\n5261\n5262\n5263\n5264\n5265\n5266\n5267\n5268\n5269\n5270\n5271\n5272\n5273\n5274\n5275\n5276\n5277\n5278\n5279\n5280\n5281\n5282\n5283\n5284\n5285\n5286\n5287\n5288\n5289\n5290\n5291\n5292\n5293\n5294\n5295\n5296\n5297\n5298\n5299\n5300\n5301\n5302\n5303\n5304\n5305\n5306\n5307\n5308\n5309\n5310\n5311\n5312\n5313\n5314\n5315\n5316\n5317\n5318\n5319\n5320\n5321\n5322\n5323\n5324\n5325\n5326\n5327\n5328\n5329\n5330\n5331\n5332\n5333\n5334\n5335\n5336\n5337\n5338\n5339\n5340\n5341\n5342\n5343\n5344\n5345\n5346\n5347\n5348\n5349\n5350\n5351\n5352\n5353\n5354\n5355\n5356\n5357\n5358\n5359\n5360\n5361\n5362\n5363\n5364\n5365\n5366\n5367\n5368\n5369\n5370\n5371\n5372\n5373\n5374\n5375\n5376\n5377\n5378\n5379\n5380\n5381\n5382\n5383\n5384\n5385\n5386\n5387\n5388\n5389\n5390\n5391\n5392\n5393\n5394\n5395\n5396\n5397\n5398\n5399\n5400\n5401\n5402\n5403\n5404\n5405\n5406\n5407\n5408\n5409\n5410\n5411\n5412\n5413\n5414\n5415\n5416\n5417\n5418\n5419\n5420\n5421\n5422\n5423\n5424\n5425\n5426\n5427\n5428\n5429\n5430\n5431\n5432\n5433\n5434\n5435\n5436\n5437\n5438\n5439\n5440\n5441\n5442\n5443\n5444\n5445\n5446\n5447\n5448\n5449\n5450\n5451\n5452\n5453\n5454\n5455\n5456\n5457\n5458\n5459\n5460\n5461\n5462\n5463\n5464\n5465\n5466\n5467\n5468\n5469\n5470\n5471\n5472\n5473\n5474\n5475\n5476\n5477\n5478\n5479\n5480\n5481\n5482\n5483\n5484\n5485\n5486\n5487\n5488\n5489\n5490\n5491\n5492\n5493\n5494\n5495\n5496\n5497\n5498\n5499\n5500\n5501\n5502\n5503\n5504\n5505\n5506\n5507\n5508\n5509\n5510\n5511\n5512\n5513\n5514\n5515\n5516\n5517\n5518\n5519\n5520\n5521\n5522\n5523\n5524\n5525\n5526\n5527\n5528\n5529\n5530\n5531\n5532\n5533\n5534\n5535\n5536\n5537\n5538\n5539\n5540\n5541\n5542\n5543\n5544\n5545\n5546\n5547\n5548\n5549\n5550\n5551\n5552\n5553\n5554\n5555\n5556\n5557\n5558\n5559\n5560\n5561\n5562\n5563\n5564\n5565\n5566\n5567\n5568\n5569\n5570\n5571\n5572\n5573\n5574\n5575\n5576\n5577\n5578\n5579\n5580\n5581\n5582\n5583\n5584\n5585\n5586\n5587\n5588\n5589\n5590\n5591\n5592\n5593\n5594\n5595\n5596\n5597\n5598\n5599\n5600\n5601\n5602\n5603\n5604\n5605\n5606\n5607\n5608\n5609\n5610\n5611\n5612\n5613\n5614\n5615\n5616\n5617\n5618\n5619\n5620\n5621\n5622\n5623\n5624\n5625\n5626\n5627\n5628\n5629\n5630\n5631\n5632\n5633\n5634\n5635\n5636\n5637\n5638\n5639\n5640\n5641\n5642\n5643\n5644\n5645\n5646\n5647\n5648\n5649\n5650\n5651\n5652\n5653\n5654\n5655\n5656\n5657\n5658\n5659\n5660\n5661\n5662\n5663\n5664\n5665\n5666\n5667\n5668\n5669\n5670\n5671\n5672\n5673\n5674\n5675\n5676\n5677\n5678\n5679\n5680\n5681\n5682\n5683\n5684\n5685\n5686\n5687\n5688\n5689\n5690\n5691\n5692\n5693\n5694\n5695\n5696\n5697\n5698\n5699\n5700\n5701\n5702\n5703\n5704\n5705\n5706\n5707\n5708\n5709\n5710\n5711\n5712\n5713\n5714\n5715\n5716\n5717\n5718\n5719\n5720\n5721\n5722\n5723\n5724\n5725\n5726\n5727\n5728\n5729\n5730\n5731\n5732\n5733\n5734\n5735\n5736\n5737\n5738\n5739\n5740\n5741\n5742\n5743\n5744\n5745\n5746\n5747\n5748\n5749\n5750\n5751\n5752\n5753\n5754\n5755\n5756\n5757\n5758\n5759\n5760\n5761\n5762\n5763\n5764\n5765\n5766\n5767\n5768\n5769\n5770\n5771\n5772\n5773\n5774\n5775\n5776\n5777\n5778\n5779\n5780\n5781\n5782\n5783\n5784\n5785\n5786\n5787\n5788\n5789\n5790\n5791\n5792\n5793\n5794\n5795\n5796\n5797\n5798\n5799\n5800\n5801\n5802\n5803\n5804\n5805\n5806\n5807\n5808\n5809\n5810\n5811\n5812\n5813\n5814\n5815\n5816\n5817\n5818\n5819\n5820\n5821\n5822\n5823\n5824\n5825\n5826\n5827\n5828\n5829\n5830\n5831\n5832\n5833\n5834\n5835\n5836\n5837\n5838\n5839\n5840\n5841\n5842\n5843\n5844\n5845\n5846\n5847\n5848\n5849\n5850\n5851\n5852\n5853\n5854\n5855\n5856\n5857\n5858\n5859\n5860\n5861\n5862\n5863\n5864\n5865\n5866\n5867\n5868\n5869\n5870\n5871\n5872\n5873\n5874\n5875\n5876\n5877\n5878\n5879\n5880\n5881\n5882\n5883\n5884\n5885\n5886\n5887\n5888\n5889\n5890\n5891\n5892\n5893\n5894\n5895\n5896\n5897\n5898\n5899\n5900\n5901\n5902\n5903\n5904\n5905\n5906\n5907\n5908\n5909\n5910\n5911\n5912\n5913\n5914\n5915\n5916\n5917\n5918\n5919\n5920\n5921\n5922\n5923\n5924\n5925\n5926\n5927\n5928\n5929\n5930\n5931\n5932\n5933\n5934\n5935\n5936\n5937\n5938\n5939\n5940\n5941\n5942\n5943\n5944\n5945\n5946\n5947\n5948\n5949\n5950\n5951\n5952\n5953\n5954\n5955\n5956\n5957\n5958\n5959\n5960\n5961\n5962\n5963\n5964\n5965\n5966\n5967\n5968\n5969\n5970\n5971\n5972\n5973\n5974\n5975\n5976\n5977\n5978\n5979\n5980\n5981\n5982\n5983\n5984\n5985\n5986\n5987\n5988\n5989\n5990\n5991\n5992\n5993\n5994\n5995\n5996\n5997\n5998\n5999\n6000\n6001\n6002\n6003\n6004\n6005\n6006\n6007\n6008\n6009\n6010\n6011\n6012\n6013\n6014\n6015\n6016\n6017\n6018\n6019\n6020\n6021\n6022\n6023\n6024\n6025\n6026\n6027\n6028\n6029\n6030\n6031\n6032\n6033\n6034\n6035\n6036\n6037\n6038\n6039\n6040\n6041\n6042\n6043\n6044\n6045\n6046\n6047\n6048\n6049\n6050\n6051\n6052\n6053\n6054\n6055\n6056\n6057\n6058\n6059\n6060\n6061\n6062\n6063\n6064\n6065\n6066\n6067\n6068\n6069\n6070\n6071\n6072\n6073\n6074\n6075\n6076\n6077\n6078\n6079\n6080\n6081\n6082\n6083\n6084\n6085\n6086\n6087\n6088\n6089\n6090\n6091\n6092\n6093\n6094\n6095\n6096\n6097\n6098\n6099\n6100\n6101\n6102\n6103\n6104\n6105\n6106\n6107\n6108\n6109\n6110\n6111\n6112\n6113\n6114\n6115\n6116\n6117\n6118\n6119\n6120\n6121\n6122\n6123\n6124\n6125\n6126\n6127\n6128\n6129\n6130\n6131\n6132\n6133\n6134\n6135\n6136\n6137\n6138\n6139\n6140\n6141\n6142\n6143\n6144\n6145\n6146\n6147\n6148\n6149\n6150\n6151\n6152\n6153\n6154\n6155\n6156\n6157\n6158\n6159\n6160\n6161\n6162\n6163\n6164\n6165\n6166\n6167\n6168\n6169\n6170\n6171\n6172\n6173\n6174\n6175\n6176\n6177\n6178\n6179\n6180\n6181\n6182\n6183\n6184\n6185\n6186\n6187\n6188\n6189\n6190\n6191\n6192\n6193\n6194\n6195\n6196\n6197\n6198\n6199\n6200\n6201\n6202\n6203\n6204\n6205\n6206\n6207\n6208\n6209\n6210\n6211\n6212\n6213\n6214\n6215\n6216\n6217\n6218\n6219\n6220\n6221\n6222\n6223\n6224\n6225\n6226\n6227\n6228\n6229\n6230\n6231\n6232\n6233\n6234\n6235\n6236\n6237\n6238\n6239\n6240\n6241\n6242\n6243\n6244\n6245\n6246\n6247\n6248\n6249\n6250\n6251\n6252\n6253\n6254\n6255\n6256\n6257\n6258\n6259\n6260\n6261\n6262\n6263\n6264\n6265\n6266\n6267\n6268\n6269\n6270\n6271\n6272\n6273\n6274\n6275\n6276\n6277\n6278\n6279\n6280\n6281\n6282\n6283\n6284\n6285\n6286\n6287\n6288\n6289\n6290\n6291\n6292\n6293\n6294\n6295\n6296\n6297\n6298\n6299\n6300\n6301\n6302\n6303\n6304\n6305\n6306\n6307\n6308\n6309\n6310\n6311\n6312\n6313\n6314\n6315\n6316\n6317\n6318\n6319\n6320\n6321\n6322\n6323\n6324\n6325\n6326\n6327\n6328\n6329\n6330\n6331\n6332\n6333\n6334\n6335\n6336\n6337\n6338\n6339\n6340\n6341\n6342\n6343\n6344\n6345\n6346\n6347\n6348\n6349\n6350\n6351\n6352\n6353\n6354\n6355\n6356\n6357\n6358\n6359\n6360\n6361\n6362\n6363\n6364\n6365\n6366\n6367\n6368\n6369\n6370\n6371\n6372\n6373\n6374\n6375\n6376\n6377\n6378\n6379\n6380\n6381\n6382\n6383\n6384\n6385\n6386\n6387\n6388\n6389\n6390\n6391\n6392\n6393\n6394\n6395\n6396\n6397\n6398\n6399\n6400\n6401\n6402\n6403\n6404\n6405\n6406\n6407\n6408\n6409\n6410\n6411\n6412\n6413\n6414\n6415\n6416\n6417\n6418\n6419\n6420\n6421\n6422\n6423\n6424\n6425\n6426\n6427\n6428\n6429\n6430\n6431\n6432\n6433\n6434\n6435\n6436\n6437\n6438\n6439\n6440\n6441\n6442\n6443\n6444\n6445\n6446\n6447\n6448\n6449\n6450\n6451\n6452\n6453\n6454\n6455\n6456\n6457\n6458\n6459\n6460\n6461\n6462\n6463\n6464\n6465\n6466\n6467\n6468\n6469\n6470\n6471\n6472\n6473\n6474\n6475\n6476\n6477\n6478\n6479\n6480\n6481\n6482\n6483\n6484\n6485\n6486\n6487\n6488\n6489\n6490\n6491\n6492\n6493\n6494\n6495\n6496\n6497\n6498\n6499\n6500\n6501\n6502\n6503\n6504\n6505\n6506\n6507\n6508\n6509\n6510\n6511\n6512\n6513\n6514\n6515\n6516\n6517\n6518\n6519\n6520\n6521\n6522\n6523\n6524\n6525\n6526\n6527\n6528\n6529\n6530\n6531\n6532\n6533\n6534\n6535\n6536\n6537\n6538\n6539\n6540\n6541\n6542\n6543\n6544\n6545\n6546\n6547\n6548\n6549\n6550\n6551\n6552\n6553\n6554\n6555\n6556\n6557\n6558\n6559\n6560\n6561\n6562\n6563\n6564\n6565\n6566\n6567\n6568\n6569\n6570\n6571\n6572\n6573\n6574\n6575\n6576\n6577\n6578\n6579\n6580\n6581\n6582\n6583\n6584\n6585\n6586\n6587\n6588\n6589\n6590\n6591\n6592\n6593\n6594\n6595\n6596\n6597\n6598\n6599\n6600\n6601\n6602\n6603\n6604\n6605\n6606\n6607\n6608\n6609\n6610\n6611\n6612\n6613\n6614\n6615\n6616\n6617\n6618\n6619\n6620\n6621\n6622\n6623\n6624\n6625\n6626\n6627\n6628\n6629\n6630\n6631\n6632\n6633\n6634\n6635\n6636\n6637\n6638\n6639\n6640\n6641\n6642\n6643\n6644\n6645\n6646\n6647\n6648\n6649\n6650\n6651\n6652\n6653\n6654\n6655\n6656\n6657\n6658\n6659\n6660\n6661\n6662\n6663\n6664\n6665\n6666\n6667\n6668\n6669\n6670\n6671\n6672\n6673\n6674\n6675\n6676\n6677\n6678\n6679\n6680\n6681\n6682\n6683\n6684\n6685\n6686\n6687\n6688\n6689\n6690\n6691\n6692\n6693\n6694\n6695\n6696\n6697\n6698\n6699\n6700\n6701\n6702\n6703\n6704\n6705\n6706\n6707\n6708\n6709\n6710\n6711\n6712\n6713\n6714\n6715\n6716\n6717\n6718\n6719\n6720\n6721\n6722\n6723\n6724\n6725\n6726\n6727\n6728\n6729\n6730\n6731\n6732\n6733\n6734\n6735\n6736\n6737\n6738\n6739\n6740\n6741\n6742\n6743\n6744\n6745\n6746\n6747\n6748\n6749\n6750\n6751\n6752\n6753\n6754\n6755\n6756\n6757\n6758\n6759\n6760\n6761\n6762\n6763\n6764\n6765\n6766\n6767\n6768\n6769\n6770\n6771\n6772\n6773\n6774\n6775\n6776\n6777\n6778\n6779\n6780\n6781\n6782\n6783\n6784\n6785\n6786\n6787\n6788\n6789\n6790\n6791\n6792\n6793\n6794\n6795\n6796\n6797\n6798\n6799\n6800\n6801\n6802\n6803\n6804\n6805\n6806\n6807\n6808\n6809\n6810\n6811\n6812\n6813\n6814\n6815\n6816\n6817\n6818\n6819\n6820\n6821\n6822\n6823\n6824\n6825\n6826\n6827\n6828\n6829\n6830\n6831\n6832\n6833\n6834\n6835\n6836\n6837\n6838\n6839\n6840\n6841\n6842\n6843\n6844\n6845\n6846\n6847\n6848\n6849\n6850\n6851\n6852\n6853\n6854\n6855\n6856\n6857\n6858\n6859\n6860\n6861\n6862\n6863\n6864\n6865\n6866\n6867\n6868\n6869\n6870\n6871\n6872\n6873\n6874\n6875\n6876\n6877\n6878\n6879\n6880\n6881\n6882\n6883\n6884\n6885\n6886\n6887\n6888\n6889\n6890\n6891\n6892\n6893\n6894\n6895\n6896\n6897\n6898\n6899\n6900\n6901\n6902\n6903\n6904\n6905\n6906\n6907\n6908\n6909\n6910\n6911\n6912\n6913\n6914\n6915\n6916\n6917\n6918\n6919\n6920\n6921\n6922\n6923\n6924\n6925\n6926\n6927\n6928\n6929\n6930\n6931\n6932\n6933\n6934\n6935\n6936\n6937\n6938\n6939\n6940\n6941\n6942\n6943\n6944\n6945\n6946\n6947\n6948\n6949\n6950\n6951\n6952\n6953\n6954\n6955\n6956\n6957\n6958\n6959\n6960\n6961\n6962\n6963\n6964\n6965\n6966\n6967\n6968\n6969\n6970\n6971\n6972\n6973\n6974\n6975\n6976\n6977\n6978\n6979\n6980\n6981\n6982\n6983\n6984\n6985\n6986\n6987\n6988\n6989\n6990\n6991\n6992\n6993\n6994\n6995\n6996\n6997\n6998\n6999\n7000\n7001\n7002\n7003\n7004\n7005\n7006\n7007\n7008\n7009\n7010\n7011\n7012\n7013\n7014\n7015\n7016\n7017\n7018\n7019\n7020\n7021\n7022\n7023\n7024\n7025\n7026\n7027\n7028\n7029\n7030\n7031\n7032\n7033\n7034\n7035\n7036\n7037\n7038\n7039\n7040\n7041\n7042\n7043\n7044\n7045\n7046\n7047\n7048\n7049\n7050\n7051\n7052\n7053\n7054\n7055\n7056\n7057\n7058\n7059\n7060\n7061\n7062\n7063\n7064\n7065\n7066\n7067\n7068\n7069\n7070\n7071\n7072\n7073\n7074\n7075\n7076\n7077\n7078\n7079\n7080\n7081\n7082\n7083\n7084\n7085\n7086\n7087\n7088\n7089\n7090\n7091\n7092\n7093\n7094\n7095\n7096\n7097\n7098\n7099\n7100\n7101\n7102\n7103\n7104\n7105\n7106\n7107\n7108\n7109\n7110\n7111\n7112\n7113\n7114\n7115\n7116\n7117\n7118\n7119\n7120\n7121\n7122\n7123\n7124\n7125\n7126\n7127\n7128\n7129\n7130\n7131\n7132\n7133\n7134\n7135\n7136\n7137\n7138\n7139\n7140\n7141\n7142\n7143\n7144\n7145\n7146\n7147\n7148\n7149\n7150\n7151\n7152\n7153\n7154\n7155\n7156\n7157\n7158\n7159\n7160\n7161\n7162\n7163\n7164\n7165\n7166\n7167\n7168\n7169\n7170\n7171\n7172\n7173\n7174\n7175\n7176\n7177\n7178\n7179\n7180\n7181\n7182\n7183\n7184\n7185\n7186\n7187\n7188\n7189\n7190\n7191\n7192\n7193\n7194\n7195\n7196\n7197\n7198\n7199\n7200\n7201\n7202\n7203\n7204\n7205\n7206\n7207\n7208\n7209\n7210\n7211\n7212\n7213\n7214\n7215\n7216\n7217\n7218\n7219\n7220\n7221\n7222\n7223\n7224\n7225\n7226\n7227\n7228\n7229\n7230\n7231\n7232\n7233\n7234\n7235\n7236\n7237\n7238\n7239\n7240\n7241\n7242\n7243\n7244\n7245\n7246\n7247\n7248\n7249\n7250\n7251\n7252\n7253\n7254\n7255\n7256\n7257\n7258\n7259\n7260\n7261\n7262\n7263\n7264\n7265\n7266\n7267\n7268\n7269\n7270\n7271\n7272\n7273\n7274\n7275\n7276\n7277\n7278\n7279\n7280\n7281\n7282\n7283\n7284\n7285\n7286\n7287\n7288\n7289\n7290\n7291\n7292\n7293\n7294\n7295\n7296\n7297\n7298\n7299\n7300\n7301\n7302\n7303\n7304\n7305\n7306\n7307\n7308\n7309\n7310\n7311\n7312\n7313\n7314\n7315\n7316\n7317\n7318\n7319\n7320\n7321\n7322\n7323\n7324\n7325\n7326\n7327\n7328\n7329\n7330\n7331\n7332\n7333\n7334\n7335\n7336\n7337\n7338\n7339\n7340\n7341\n7342\n7343\n7344\n7345\n7346\n7347\n7348\n7349\n7350\n7351\n7352\n7353\n7354\n7355\n7356\n7357\n7358\n7359\n7360\n7361\n7362\n7363\n7364\n7365\n7366\n7367\n7368\n7369\n7370\n7371\n7372\n7373\n7374\n7375\n7376\n7377\n7378\n7379\n7380\n7381\n7382\n7383\n7384\n7385\n7386\n7387\n7388\n7389\n7390\n7391\n7392\n7393\n7394\n7395\n7396\n7397\n7398\n7399\n7400\n7401\n7402\n7403\n7404\n7405\n7406\n7407\n7408\n7409\n7410\n7411\n7412\n7413\n7414\n7415\n7416\n7417\n7418\n7419\n7420\n7421\n7422\n7423\n7424\n7425\n7426\n7427\n7428\n7429\n7430\n7431\n7432\n7433\n7434\n7435\n7436\n7437\n7438\n7439\n7440\n7441\n7442\n7443\n7444\n7445\n7446\n7447\n7448\n7449\n7450\n7451\n7452\n7453\n7454\n7455\n7456\n7457\n7458\n7459\n7460\n7461\n7462\n7463\n7464\n7465\n7466\n7467\n7468\n7469\n7470\n7471\n7472\n7473\n7474\n7475\n7476\n7477\n7478\n7479\n7480\n7481\n7482\n7483\n7484\n7485\n7486\n7487\n7488\n7489\n7490\n7491\n7492\n7493\n7494\n7495\n7496\n7497\n7498\n7499\n7500\n7501\n7502\n7503\n7504\n7505\n7506\n7507\n7508\n7509\n7510\n7511\n7512\n7513\n7514\n7515\n7516\n7517\n7518\n7519\n7520\n7521\n7522\n7523\n7524\n7525\n7526\n7527\n7528\n7529\n7530\n7531\n7532\n7533\n7534\n7535\n7536\n7537\n7538\n7539\n7540\n7541\n7542\n7543\n7544\n7545\n7546\n7547\n7548\n7549\n7550\n7551\n7552\n7553\n7554\n7555\n7556\n7557\n7558\n7559\n7560\n7561\n7562\n7563\n7564\n7565\n7566\n7567\n7568\n7569\n7570\n7571\n7572\n7573\n7574\n7575\n7576\n7577\n7578\n7579\n7580\n7581\n7582\n7583\n7584\n7585\n7586\n7587\n7588\n7589\n7590\n7591\n7592\n7593\n7594\n7595\n7596\n7597\n7598\n7599\n7600\n7601\n7602\n7603\n7604\n7605\n7606\n7607\n7608\n7609\n7610\n7611\n7612\n7613\n7614\n7615\n7616\n7617\n7618\n7619\n7620\n7621\n7622\n7623\n7624\n7625\n7626\n7627\n7628\n7629\n7630\n7631\n7632\n7633\n7634\n7635\n7636\n7637\n7638\n7639\n7640\n7641\n7642\n7643\n7644\n7645\n7646\n7647\n7648\n7649\n7650\n7651\n7652\n7653\n7654\n7655\n7656\n7657\n7658\n7659\n7660\n7661\n7662\n7663\n7664\n7665\n7666\n7667\n7668\n7669\n7670\n7671\n7672\n7673\n7674\n7675\n7676\n7677\n7678\n7679\n7680\n7681\n7682\n7683\n7684\n7685\n7686\n7687\n7688\n7689\n7690\n7691\n7692\n7693\n7694\n7695\n7696\n7697\n7698\n7699\n7700\n7701\n7702\n7703\n7704\n7705\n7706\n7707\n7708\n7709\n7710\n7711\n7712\n7713\n7714\n7715\n7716\n7717\n7718\n7719\n7720\n7721\n7722\n7723\n7724\n7725\n7726\n7727\n7728\n7729\n7730\n7731\n7732\n7733\n7734\n7735\n7736\n7737\n7738\n7739\n7740\n7741\n7742\n7743\n7744\n7745\n7746\n7747\n7748\n7749\n7750\n7751\n7752\n7753\n7754\n7755\n7756\n7757\n7758\n7759\n7760\n7761\n7762\n7763\n7764\n7765\n7766\n7767\n7768\n7769\n7770\n7771\n7772\n7773\n7774\n7775\n7776\n7777\n7778\n7779\n7780\n7781\n7782\n7783\n7784\n7785\n7786\n7787\n7788\n7789\n7790\n7791\n7792\n7793\n7794\n7795\n7796\n7797\n7798\n7799\n7800\n7801\n7802\n7803\n7804\n7805\n7806\n7807\n7808\n7809\n7810\n7811\n7812\n7813\n7814\n7815\n7816\n7817\n7818\n7819\n7820\n7821\n7822\n7823\n7824\n7825\n7826\n7827\n7828\n7829\n7830\n7831\n7832\n7833\n7834\n7835\n7836\n7837\n7838\n7839\n7840\n7841\n7842\n7843\n7844\n7845\n7846\n7847\n7848\n7849\n7850\n7851\n7852\n7853\n7854\n7855\n7856\n7857\n7858\n7859\n7860\n7861\n7862\n7863\n7864\n7865\n7866\n7867\n7868\n7869\n7870\n7871\n7872\n7873\n7874\n7875\n7876\n7877\n7878\n7879\n7880\n7881\n7882\n7883\n7884\n7885\n7886\n7887\n7888\n7889\n7890\n7891\n7892\n7893\n7894\n7895\n7896\n7897\n7898\n7899\n7900\n7901\n7902\n7903\n7904\n7905\n7906\n7907\n7908\n7909\n7910\n7911\n7912\n7913\n7914\n7915\n7916\n7917\n7918\n7919\n7920\n7921\n7922\n7923\n7924\n7925\n7926\n7927\n7928\n7929\n7930\n7931\n7932\n7933\n7934\n7935\n7936\n7937\n7938\n7939\n7940\n7941\n7942\n7943\n7944\n7945\n7946\n7947\n7948\n7949\n7950\n7951\n7952\n7953\n7954\n7955\n7956\n7957\n7958\n7959\n7960\n7961\n7962\n7963\n7964\n7965\n7966\n7967\n7968\n7969\n7970\n7971\n7972\n7973\n7974\n7975\n7976\n7977\n7978\n7979\n7980\n7981\n7982\n7983\n7984\n7985\n7986\n7987\n7988\n7989\n7990\n7991\n7992\n7993\n7994\n7995\n7996\n7997\n7998\n7999\n8000\n8001\n8002\n8003\n8004\n8005\n8006\n8007\n8008\n8009\n8010\n8011\n8012\n8013\n8014\n8015\n8016\n8017\n8018\n8019\n8020\n8021\n8022\n8023\n8024\n8025\n8026\n8027\n8028\n8029\n8030\n8031\n8032\n8033\n8034\n8035\n8036\n8037\n8038\n8039\n8040\n8041\n8042\n8043\n8044\n8045\n8046\n8047\n8048\n8049\n8050\n8051\n8052\n8053\n8054\n8055\n8056\n8057\n8058\n8059\n8060\n8061\n8062\n8063\n8064\n8065\n8066\n8067\n8068\n8069\n8070\n8071\n8072\n8073\n8074\n8075\n8076\n8077\n8078\n8079\n8080\n8081\n8082\n8083\n8084\n8085\n8086\n8087\n8088\n8089\n8090\n8091\n8092\n8093\n8094\n8095\n8096\n8097\n8098\n8099\n8100\n8101\n8102\n8103\n8104\n8105\n8106\n8107\n8108\n8109\n8110\n8111\n8112\n8113\n8114\n8115\n8116\n8117\n8118\n8119\n8120\n8121\n8122\n8123\n8124\n8125\n8126\n8127\n8128\n8129\n8130\n8131\n8132\n8133\n8134\n8135\n8136\n8137\n8138\n8139\n8140\n8141\n8142\n8143\n8144\n8145\n8146\n8147\n8148\n8149\n8150\n8151\n8152\n8153\n8154\n8155\n8156\n8157\n8158\n8159\n8160\n8161\n8162\n8163\n8164\n8165\n8166\n8167\n8168\n8169\n8170\n8171\n8172\n8173\n8174\n8175\n8176\n8177\n8178\n8179\n8180\n8181\n8182\n8183\n8184\n8185\n8186\n8187\n8188\n8189\n8190\n8191\n8192\n8193\n8194\n8195\n8196\n8197\n8198\n8199\n8200\n8201\n8202\n8203\n8204\n8205\n8206\n8207\n8208\n8209\n8210\n8211\n8212\n8213\n8214\n8215\n8216\n8217\n8218\n8219\n8220\n8221\n8222\n8223\n8224\n8225\n8226\n8227\n8228\n8229\n8230\n8231\n8232\n8233\n8234\n8235\n8236\n8237\n8238\n8239\n8240\n8241\n8242\n8243\n8244\n8245\n8246\n8247\n8248\n8249\n8250\n8251\n8252\n8253\n8254\n8255\n8256\n8257\n8258\n8259\n8260\n8261\n8262\n8263\n8264\n8265\n8266\n8267\n8268\n8269\n8270\n8271\n8272\n8273\n8274\n8275\n8276\n8277\n8278\n8279\n8280\n8281\n8282\n8283\n8284\n8285\n8286\n8287\n8288\n8289\n8290\n8291\n8292\n8293\n8294\n8295\n8296\n8297\n8298\n8299\n8300\n8301\n8302\n8303\n8304\n8305\n8306\n8307\n8308\n8309\n8310\n8311\n8312\n8313\n8314\n8315\n8316\n8317\n8318\n8319\n8320\n8321\n8322\n8323\n8324\n8325\n8326\n8327\n8328\n8329\n8330\n8331\n8332\n8333\n8334\n8335\n8336\n8337\n8338\n8339\n8340\n8341\n8342\n8343\n8344\n8345\n8346\n8347\n8348\n8349\n8350\n8351\n8352\n8353\n8354\n8355\n8356\n8357\n8358\n8359\n8360\n8361\n8362\n8363\n8364\n8365\n8366\n8367\n8368\n8369\n8370\n8371\n8372\n8373\n8374\n8375\n8376\n8377\n8378\n8379\n8380\n8381\n8382\n8383\n8384\n8385\n8386\n8387\n8388\n8389\n8390\n8391\n8392\n8393\n8394\n8395\n8396\n8397\n8398\n8399\n8400\n8401\n8402\n8403\n8404\n8405\n8406\n8407\n8408\n8409\n8410\n8411\n8412\n8413\n8414\n8415\n8416\n8417\n8418\n8419\n8420\n8421\n8422\n8423\n8424\n8425\n8426\n8427\n8428\n8429\n8430\n8431\n8432\n8433\n8434\n8435\n8436\n8437\n8438\n8439\n8440\n8441\n8442\n8443\n8444\n8445\n8446\n8447\n8448\n8449\n8450\n8451\n8452\n8453\n8454\n8455\n8456\n8457\n8458\n8459\n8460\n8461\n8462\n8463\n8464\n8465\n8466\n8467\n8468\n8469\n8470\n8471\n8472\n8473\n8474\n8475\n8476\n8477\n8478\n8479\n8480\n8481\n8482\n8483\n8484\n8485\n8486\n8487\n8488\n8489\n8490\n8491\n8492\n8493\n8494\n8495\n8496\n8497\n8498\n8499\n8500\n8501\n8502\n8503\n8504\n8505\n8506\n8507\n8508\n8509\n8510\n8511\n8512\n8513\n8514\n8515\n8516\n8517\n8518\n8519\n8520\n8521\n8522\n8523\n8524\n8525\n8526\n8527\n8528\n8529\n8530\n8531\n8532\n8533\n8534\n8535\n8536\n8537\n8538\n8539\n8540\n8541\n8542\n8543\n8544\n8545\n8546\n8547\n8548\n8549\n8550\n8551\n8552\n8553\n8554\n8555\n8556\n8557\n8558\n8559\n8560\n8561\n8562\n8563\n8564\n8565\n8566\n8567\n8568\n8569\n8570\n8571\n8572\n8573\n8574\n8575\n8576\n8577\n8578\n8579\n8580\n8581\n8582\n8583\n8584\n8585\n8586\n8587\n8588\n8589\n8590\n8591\n8592\n8593\n8594\n8595\n8596\n8597\n8598\n8599\n8600\n8601\n8602\n8603\n8604\n8605\n8606\n8607\n8608\n8609\n8610\n8611\n8612\n8613\n8614\n8615\n8616\n8617\n8618\n8619\n8620\n8621\n8622\n8623\n8624\n8625\n8626\n8627\n8628\n8629\n8630\n8631\n8632\n8633\n8634\n8635\n8636\n8637\n8638\n8639\n8640\n8641\n8642\n8643\n8644\n8645\n8646\n8647\n8648\n8649\n8650\n8651\n8652\n8653\n8654\n8655\n8656\n8657\n8658\n8659\n8660\n8661\n8662\n8663\n8664\n8665\n8666\n8667\n8668\n8669\n8670\n8671\n8672\n8673\n8674\n8675\n8676\n8677\n8678\n8679\n8680\n8681\n8682\n8683\n8684\n8685\n8686\n8687\n8688\n8689\n8690\n8691\n8692\n8693\n8694\n8695\n8696\n8697\n8698\n8699\n8700\n8701\n8702\n8703\n8704\n8705\n8706\n8707\n8708\n8709\n8710\n8711\n8712\n8713\n8714\n8715\n8716\n8717\n8718\n8719\n8720\n8721\n8722\n8723\n8724\n8725\n8726\n8727\n8728\n8729\n8730\n8731\n8732\n8733\n8734\n8735\n8736\n8737\n8738\n8739\n8740\n8741\n8742\n8743\n8744\n8745\n8746\n8747\n8748\n8749\n8750\n8751\n8752\n8753\n8754\n8755\n8756\n8757\n8758\n8759\n8760\n8761\n8762\n8763\n8764\n8765\n8766\n8767\n8768\n8769\n8770\n8771\n8772\n8773\n8774\n8775\n8776\n8777\n8778\n8779\n8780\n8781\n8782\n8783\n8784\n8785\n8786\n8787\n8788\n8789\n8790\n8791\n8792\n8793\n8794\n8795\n8796\n8797\n8798\n8799\n8800\n8801\n8802\n8803\n8804\n8805\n8806\n8807\n8808\n8809\n8810\n8811\n8812\n8813\n8814\n8815\n8816\n8817\n8818\n8819\n8820\n8821\n8822\n8823\n8824\n8825\n8826\n8827\n8828\n8829\n8830\n8831\n8832\n8833\n8834\n8835\n8836\n8837\n8838\n8839\n8840\n8841\n8842\n8843\n8844\n8845\n8846\n8847\n8848\n8849\n8850\n8851\n8852\n8853\n8854\n8855\n8856\n8857\n8858\n8859\n8860\n8861\n8862\n8863\n8864\n8865\n8866\n8867\n8868\n8869\n8870\n8871\n8872\n8873\n8874\n8875\n8876\n8877\n8878\n8879\n8880\n8881\n8882\n8883\n8884\n8885\n8886\n8887\n8888\n8889\n8890\n8891\n8892\n8893\n8894\n8895\n8896\n8897\n8898\n8899\n8900\n8901\n8902\n8903\n8904\n8905\n8906\n8907\n8908\n8909\n8910\n8911\n8912\n8913\n8914\n8915\n8916\n8917\n8918\n8919\n8920\n8921\n8922\n8923\n8924\n8925\n8926\n8927\n8928\n8929\n8930\n8931\n8932\n8933\n8934\n8935\n8936\n8937\n8938\n8939\n8940\n8941\n8942\n8943\n8944\n8945\n8946\n8947\n8948\n8949\n8950\n8951\n8952\n8953\n8954\n8955\n8956\n8957\n8958\n8959\n8960\n8961\n8962\n8963\n8964\n8965\n8966\n8967\n8968\n8969\n8970\n8971\n8972\n8973\n8974\n8975\n8976\n8977\n8978\n8979\n8980\n8981\n8982\n8983\n8984\n8985\n8986\n8987\n8988\n8989\n8990\n8991\n8992\n8993\n8994\n8995\n8996\n8997\n8998\n8999\n9000\n9001\n9002\n9003\n9004\n9005\n9006\n9007\n9008\n9009\n9010\n9011\n9012\n9013\n9014\n9015\n9016\n9017\n9018\n9019\n9020\n9021\n9022\n9023\n9024\n9025\n9026\n9027\n9028\n9029\n9030\n9031\n9032\n9033\n9034\n9035\n9036\n9037\n9038\n9039\n9040\n9041\n9042\n9043\n9044\n9045\n9046\n9047\n9048\n9049\n9050\n9051\n9052\n9053\n9054\n9055\n9056\n9057\n9058\n9059\n9060\n9061\n9062\n9063\n9064\n9065\n9066\n9067\n9068\n9069\n9070\n9071\n9072\n9073\n9074\n9075\n9076\n9077\n9078\n9079\n9080\n9081\n9082\n9083\n9084\n9085\n9086\n9087\n9088\n9089\n9090\n9091\n9092\n9093\n9094\n9095\n9096\n9097\n9098\n9099\n9100\n9101\n9102\n9103\n9104\n9105\n9106\n9107\n9108\n9109\n9110\n9111\n9112\n9113\n9114\n9115\n9116\n9117\n9118\n9119\n9120\n9121\n9122\n9123\n9124\n9125\n9126\n9127\n9128\n9129\n9130\n9131\n9132\n9133\n9134\n9135\n9136\n9137\n9138\n9139\n9140\n9141\n9142\n9143\n9144\n9145\n9146\n9147\n9148\n9149\n9150\n9151\n9152\n9153\n9154\n9155\n9156\n9157\n9158\n9159\n9160\n9161\n9162\n9163\n9164\n9165\n9166\n9167\n9168\n9169\n9170\n9171\n9172\n9173\n9174\n9175\n9176\n9177\n9178\n9179\n9180\n9181\n9182\n9183\n9184\n9185\n9186\n9187\n9188\n9189\n9190\n9191\n9192\n9193\n9194\n9195\n9196\n9197\n9198\n9199\n9200\n9201\n9202\n9203\n9204\n9205\n9206\n9207\n9208\n9209\n9210\n9211\n9212\n9213\n9214\n9215\n9216\n9217\n9218\n9219\n9220\n9221\n9222\n9223\n9224\n9225\n9226\n9227\n9228\n9229\n9230\n9231\n9232\n9233\n9234\n9235\n9236\n9237\n9238\n9239\n9240\n9241\n9242\n9243\n9244\n9245\n9246\n9247\n9248\n9249\n9250\n9251\n9252\n9253\n9254\n9255\n9256\n9257\n9258\n9259\n9260\n9261\n9262\n9263\n9264\n9265\n9266\n9267\n9268\n9269\n9270\n9271\n9272\n9273\n9274\n9275\n9276\n9277\n9278\n9279\n9280\n9281\n9282\n9283\n9284\n9285\n9286\n9287\n9288\n9289\n9290\n9291\n9292\n9293\n9294\n9295\n9296\n9297\n9298\n9299\n9300\n9301\n9302\n9303\n9304\n9305\n9306\n9307\n9308\n9309\n9310\n9311\n9312\n9313\n9314\n9315\n9316\n9317\n9318\n9319\n9320\n9321\n9322\n9323\n9324\n9325\n9326\n9327\n9328\n9329\n9330\n9331\n9332\n9333\n9334\n9335\n9336\n9337\n9338\n9339\n9340\n9341\n9342\n9343\n9344\n9345\n9346\n9347\n9348\n9349\n9350\n9351\n9352\n9353\n9354\n9355\n9356\n9357\n9358\n9359\n9360\n9361\n9362\n9363\n9364\n9365\n9366\n9367\n9368\n9369\n9370\n9371\n9372\n9373\n9374\n9375\n9376\n9377\n9378\n9379\n9380\n9381\n9382\n9383\n9384\n9385\n9386\n9387\n9388\n9389\n9390\n9391\n9392\n9393\n9394\n9395\n9396\n9397\n9398\n9399\n9400\n9401\n9402\n9403\n9404\n9405\n9406\n9407\n9408\n9409\n9410\n9411\n9412\n9413\n9414\n9415\n9416\n9417\n9418\n9419\n9420\n9421\n9422\n9423\n9424\n9425\n9426\n9427\n9428\n9429\n9430\n9431\n9432\n9433\n9434\n9435\n9436\n9437\n9438\n9439\n9440\n9441\n9442\n9443\n9444\n9445\n9446\n9447\n9448\n9449\n9450\n9451\n9452\n9453\n9454\n9455\n9456\n9457\n9458\n9459\n9460\n9461\n9462\n9463\n9464\n9465\n9466\n9467\n9468\n9469\n9470\n9471\n9472\n9473\n9474\n9475\n9476\n9477\n9478\n9479\n9480\n9481\n9482\n9483\n9484\n9485\n9486\n9487\n9488\n9489\n9490\n9491\n9492\n9493\n9494\n9495\n9496\n9497\n9498\n9499\n9500\n9501\n9502\n9503\n9504\n9505\n9506\n9507\n9508\n9509\n9510\n9511\n9512\n9513\n9514\n9515\n9516\n9517\n9518\n9519\n9520\n9521\n9522\n9523\n9524\n9525\n9526\n9527\n9528\n9529\n9530\n9531\n9532\n9533\n9534\n9535\n9536\n9537\n9538\n9539\n9540\n9541\n9542\n9543\n9544\n9545\n9546\n9547\n9548\n9549\n9550\n9551\n9552\n9553\n9554\n9555\n9556\n9557\n9558\n9559\n9560\n9561\n9562\n9563\n9564\n9565\n9566\n9567\n9568\n9569\n9570\n9571\n9572\n9573\n9574\n9575\n9576\n9577\n9578\n9579\n9580\n9581\n9582\n9583\n9584\n9585\n9586\n9587\n9588\n9589\n9590\n9591\n9592\n9593\n9594\n9595\n9596\n9597\n9598\n9599\n9600\n9601\n9602\n9603\n9604\n9605\n9606\n9607\n9608\n9609\n9610\n9611\n9612\n9613\n9614\n9615\n9616\n9617\n9618\n9619\n9620\n9621\n9622\n9623\n9624\n9625\n9626\n9627\n9628\n9629\n9630\n9631\n9632\n9633\n9634\n9635\n9636\n9637\n9638\n9639\n9640\n9641\n9642\n9643\n9644\n9645\n9646\n9647\n9648\n9649\n9650\n9651\n9652\n9653\n9654\n9655\n9656\n9657\n9658\n9659\n9660\n9661\n9662\n9663\n9664\n9665\n9666\n9667\n9668\n9669\n9670\n9671\n9672\n9673\n9674\n9675\n9676\n9677\n9678\n9679\n9680\n9681\n9682\n9683\n9684\n9685\n9686\n9687\n9688\n9689\n9690\n9691\n9692\n9693\n9694\n9695\n9696\n9697\n9698\n9699\n9700\n9701\n9702\n9703\n9704\n9705\n9706\n9707\n9708\n9709\n9710\n9711\n9712\n9713\n9714\n9715\n9716\n9717\n9718\n9719\n9720\n9721\n9722\n9723\n9724\n9725\n9726\n9727\n9728\n9729\n9730\n9731\n9732\n9733\n9734\n9735\n9736\n9737\n9738\n9739\n9740\n9741\n9742\n9743\n9744\n9745\n9746\n9747\n9748\n9749\n9750\n9751\n9752\n9753\n9754\n9755\n9756\n9757\n9758\n9759\n9760\n9761\n9762\n9763\n9764\n9765\n9766\n9767\n9768\n9769\n9770\n9771\n9772\n9773\n9774\n9775\n9776\n9777\n9778\n9779\n9780\n9781\n9782\n9783\n9784\n9785\n9786\n9787\n9788\n9789\n9790\n9791\n9792\n9793\n9794\n9795\n9796\n9797\n9798\n9799\n9800\n9801\n9802\n9803\n9804\n9805\n9806\n9807\n9808\n9809\n9810\n9811\n9812\n9813\n9814\n9815\n9816\n9817\n9818\n9819\n9820\n9821\n9822\n9823\n9824\n9825\n9826\n9827\n9828\n9829\n9830\n9831\n9832\n9833\n9834\n9835\n9836\n9837\n9838\n9839\n9840\n9841\n9842\n9843\n9844\n9845\n9846\n9847\n9848\n9849\n9850\n9851\n9852\n9853\n9854\n9855\n9856\n9857\n9858\n9859\n9860\n9861\n9862\n9863\n9864\n9865\n9866\n9867\n9868\n9869\n9870\n9871\n9872\n9873\n9874\n9875\n9876\n9877\n9878\n9879\n9880\n9881\n9882\n9883\n9884\n9885\n9886\n9887\n9888\n9889\n9890\n9891\n9892\n9893\n9894\n9895\n9896\n9897\n9898\n9899\n9900\n9901\n9902\n9903\n9904\n9905\n9906\n9907\n9908\n9909\n9910\n9911\n9912\n9913\n9914\n9915\n9916\n9917\n9918\n9919\n9920\n9921\n9922\n9923\n9924\n9925\n9926\n9927\n9928\n9929\n9930\n9931\n9932\n9933\n9934\n9935\n9936\n9937\n9938\n9939\n9940\n9941\n9942\n9943\n9944\n9945\n9946\n9947\n9948\n9949\n9950\n9951\n9952\n9953\n9954\n9955\n9956\n9957\n9958\n9959\n9960\n9961\n9962\n9963\n9964\n9965\n9966\n9967\n9968\n9969\n9970\n9971\n9972\n9973\n9974\n9975\n9976\n9977\n9978\n9979\n9980\n9981\n9982\n9983\n9984\n9985\n9986\n9987\n9988\n9989\n9990\n9991\n9992\n9993\n9994\n9995\n9996\n9997\n9998\n9999\n10000\n10001\n10002\n10003\n10004\n10005\n10006\n10007\n10008\n10009\n10010\n10011\n10012\n10013\n10014\n10015\n10016\n10017\n10018\n10019\n10020\n10021\n10022\n10023\n10024\n10025\n10026\n10027\n10028\n10029\n10030\n10031\n10032\n10033\n10034\n10035\n10036\n10037\n10038\n10039\n10040\n10041\n10042\n10043\n10044\n10045\n10046\n10047\n10048\n10049\n10050\n10051\n10052\n10053\n10054\n10055\n10056\n10057\n10058\n10059\n10060\n10061\n10062\n10063\n10064\n10065\n10066\n10067\n10068\n10069\n10070\n10071\n10072\n10073\n10074\n10075\n10076\n10077\n10078\n10079\n10080\n10081\n10082\n10083\n10084\n10085\n10086\n10087\n10088\n10089\n10090\n10091\n10092\n10093\n10094\n10095\n10096\n10097\n10098\n10099\n10100\n10101\n10102\n10103\n10104\n10105\n10106\n10107\n10108\n10109\n10110\n10111\n10112\n10113\n10114\n10115\n10116\n10117\n10118\n10119\n10120\n10121\n10122\n10123\n10124\n10125\n10126\n10127\n10128\n10129\n10130\n10131\n10132\n10133\n10134\n10135\n10136\n10137\n10138\n10139\n10140\n10141\n10142\n10143\n10144\n10145\n10146\n10147\n10148\n10149\n10150\n10151\n10152\n10153\n10154\n10155\n10156\n10157\n10158\n10159\n10160\n10161\n10162\n10163\n10164\n10165\n10166\n10167\n10168\n10169\n10170\n10171\n10172\n10173\n10174\n10175\n10176\n10177\n10178\n10179\n10180\n10181\n10182\n10183\n10184\n10185\n10186\n10187\n10188\n10189\n10190\n10191\n10192\n10193\n10194\n10195\n10196\n10197\n10198\n10199\n10200\n10201\n10202\n10203\n10204\n10205\n10206\n10207\n10208\n10209\n10210\n10211\n10212\n10213\n10214\n10215\n10216\n10217\n10218\n10219\n10220\n10221\n10222\n10223\n10224\n10225\n10226\n10227\n10228\n10229\n10230\n10231\n10232\n10233\n10234\n10235\n10236\n10237\n10238\n10239\n10240\n10241\n10242\n10243\n10244\n10245\n10246\n10247\n10248\n10249\n10250\n10251\n10252\n10253\n10254\n10255\n10256\n10257\n10258\n10259\n10260\n10261\n10262\n10263\n10264\n10265\n10266\n10267\n10268\n10269\n10270\n10271\n10272\n10273\n10274\n10275\n10276\n10277\n10278\n10279\n10280\n10281\n10282\n10283\n10284\n10285\n10286\n10287\n10288\n10289\n10290\n10291\n10292\n10293\n10294\n10295\n10296\n10297\n10298\n10299\n10300\n10301\n10302\n10303\n10304\n10305\n10306\n10307\n10308\n10309\n10310\n10311\n10312\n10313\n10314\n10315\n10316\n10317\n10318\n10319\n10320\n10321\n10322\n10323\n10324\n10325\n10326\n10327\n10328\n10329\n10330\n10331\n10332\n10333\n10334\n10335\n10336\n10337\n10338\n10339\n10340\n10341\n10342\n10343\n10344\n10345\n10346\n10347\n10348\n10349\n10350\n10351\n10352\n10353\n10354\n10355\n10356\n10357\n10358\n10359\n10360\n10361\n10362\n10363\n10364\n10365\n10366\n10367\n10368\n10369\n10370\n10371\n10372\n10373\n10374\n10375\n10376\n10377\n10378\n10379\n10380\n10381\n10382\n10383\n10384\n10385\n10386\n10387\n10388\n10389\n10390\n10391\n10392\n10393\n10394\n10395\n10396\n10397\n10398\n10399\n10400\n10401\n10402\n10403\n10404\n10405\n10406\n10407\n10408\n10409\n10410\n10411\n10412\n10413\n10414\n10415\n10416\n10417\n10418\n10419\n10420\n10421\n10422\n10423\n10424\n10425\n10426\n10427\n10428\n10429\n10430\n10431\n10432\n10433\n10434\n10435\n10436\n10437\n10438\n10439\n10440\n10441\n10442\n10443\n10444\n10445\n10446\n10447\n10448\n10449\n10450\n10451\n10452\n10453\n10454\n10455\n10456\n10457\n10458\n10459\n10460\n10461\n10462\n10463\n10464\n10465\n10466\n10467\n10468\n10469\n10470\n10471\n10472\n10473\n10474\n10475\n10476\n10477\n10478\n10479\n10480\n10481\n10482\n10483\n10484\n10485\n10486\n10487\n10488\n10489\n10490\n10491\n10492\n10493\n10494\n10495\n10496\n10497\n10498\n10499\n10500\n10501\n10502\n10503\n10504\n10505\n10506\n10507\n10508\n10509\n10510\n10511\n10512\n10513\n10514\n10515\n10516\n10517\n10518\n10519\n10520\n10521\n10522\n10523\n10524\n10525\n10526\n10527\n10528\n10529\n10530\n10531\n10532\n10533\n10534\n10535\n10536\n10537\n10538\n10539\n10540\n10541\n10542\n10543\n10544\n10545\n10546\n10547\n10548\n10549\n10550\n10551\n10552\n10553\n10554\n10555\n10556\n10557\n10558\n10559\n10560\n10561\n10562\n10563\n10564\n10565\n10566\n10567\n10568\n10569\n10570\n10571\n10572\n10573\n10574\n10575\n10576\n10577\n10578\n10579\n10580\n10581\n10582\n10583\n10584\n10585\n10586\n10587\n10588\n10589\n10590\n10591\n10592\n10593\n10594\n10595\n10596\n10597\n10598\n10599\n10600\n10601\n10602\n10603\n10604\n10605\n10606\n10607\n10608\n10609\n10610\n10611\n10612\n10613\n10614\n10615\n10616\n10617\n10618\n10619\n10620\n10621\n10622\n10623\n10624\n10625\n10626\n10627\n10628\n10629\n10630\n10631\n10632\n10633\n10634\n10635\n10636\n10637\n10638\n10639\n10640\n10641\n10642\n10643\n10644\n10645\n10646\n10647\n10648\n10649\n10650\n10651\n10652\n10653\n10654\n10655\n10656\n10657\n10658\n10659\n10660\n10661\n10662\n10663\n10664\n10665\n10666\n10667\n10668\n10669\n10670\n10671\n10672\n10673\n10674\n10675\n10676\n10677\n10678\n10679\n10680\n10681\n10682\n10683\n10684\n10685\n10686\n10687\n10688\n10689\n10690\n10691\n10692\n10693\n10694\n10695\n10696\n10697\n10698\n10699\n10700\n10701\n10702\n10703\n10704\n10705\n10706\n10707\n10708\n10709\n10710\n10711\n10712\n10713\n10714\n10715\n10716\n10717\n10718\n10719\n10720\n10721\n10722\n10723\n10724\n10725\n10726\n10727\n10728\n10729\n10730\n10731\n10732\n10733\n10734\n10735\n10736\n10737\n10738\n10739\n10740\n10741\n10742\n10743\n10744\n10745\n10746\n10747\n10748\n10749\n10750\n10751\n10752\n10753\n10754\n10755\n10756\n10757\n10758\n10759\n10760\n10761\n10762\n10763\n10764\n10765\n10766\n10767\n10768\n10769\n10770\n10771\n10772\n10773\n10774\n10775\n10776\n10777\n10778\n10779\n10780\n10781\n10782\n10783\n10784\n10785\n10786\n10787\n10788\n10789\n10790\n10791\n10792\n10793\n10794\n10795\n10796\n10797\n10798\n10799\n10800\n10801\n10802\n10803\n10804\n10805\n10806\n10807\n10808\n10809\n10810\n10811\n10812\n10813\n10814\n10815\n10816\n10817\n10818\n10819\n10820\n10821\n10822\n10823\n10824\n10825\n10826\n10827\n10828\n10829\n10830\n10831\n10832\n10833\n10834\n10835\n10836\n10837\n10838\n10839\n10840\n10841\n10842\n10843\n10844\n10845\n10846\n10847\n10848\n10849\n10850\n10851\n10852\n10853\n10854\n10855\n10856\n10857\n10858\n10859\n10860\n10861\n10862\n10863\n10864\n10865\n10866\n10867\n10868\n10869\n10870\n10871\n10872\n10873\n10874\n10875\n10876\n10877\n10878\n10879\n10880\n10881\n10882\n10883\n10884\n10885\n10886\n10887\n10888\n10889\n10890\n10891\n10892\n10893\n10894\n10895\n10896\n10897\n10898\n10899\n10900\n10901\n10902\n10903\n10904\n10905\n10906\n10907\n10908\n10909\n10910\n10911\n10912\n10913\n10914\n10915\n10916\n10917\n10918\n10919\n10920\n10921\n10922\n10923\n10924\n10925\n10926\n10927\n10928\n10929\n10930\n10931\n10932\n10933\n10934\n10935\n10936\n10937\n10938\n10939\n10940\n10941\n10942\n10943\n10944\n10945\n10946\n10947\n10948\n10949\n10950\n10951\n10952\n10953\n10954\n10955\n10956\n10957\n10958\n10959\n10960\n10961\n10962\n10963\n10964\n10965\n10966\n10967\n10968\n10969\n10970\n10971\n10972\n10973\n10974\n10975\n10976\n10977\n10978\n10979\n10980\n10981\n10982\n10983\n10984\n10985\n10986\n10987\n10988\n10989\n10990\n10991\n10992\n10993\n10994\n10995\n10996\n10997\n10998\n10999\n11000\n11001\n11002\n11003\n11004\n11005\n11006\n11007\n11008\n11009\n11010\n11011\n11012\n11013\n11014\n11015\n11016\n11017\n11018\n11019\n11020\n11021\n11022\n11023\n11024\n11025\n11026\n11027\n11028\n11029\n11030\n11031\n11032\n11033\n11034\n11035\n11036\n11037\n11038\n11039\n11040\n11041\n11042\n11043\n11044\n11045\n11046\n11047\n11048\n11049\n11050\n11051\n11052\n11053\n11054\n11055\n11056\n11057\n11058\n11059\n11060\n11061\n11062\n11063\n11064\n11065\n11066\n11067\n11068\n11069\n11070\n11071\n11072\n11073\n11074\n11075\n11076\n11077\n11078\n11079\n11080\n11081\n11082\n11083\n11084\n11085\n11086\n11087\n11088\n11089\n11090\n11091\n11092\n11093\n11094\n11095\n11096\n11097\n11098\n11099\n11100\n11101\n11102\n11103\n11104\n11105\n11106\n11107\n11108\n11109\n11110\n11111\n11112\n11113\n11114\n11115\n11116\n11117\n11118\n11119\n11120\n11121\n11122\n11123\n11124\n11125\n11126\n11127\n11128\n11129\n11130\n11131\n11132\n11133\n11134\n11135\n11136\n11137\n11138\n11139\n11140\n11141\n11142\n11143\n11144\n11145\n11146\n11147\n11148\n11149\n11150\n11151\n11152\n11153\n11154\n11155\n11156\n11157\n11158\n11159\n11160\n11161\n11162\n11163\n11164\n11165\n11166\n11167\n11168\n11169\n11170\n11171\n11172\n11173\n11174\n11175\n11176\n11177\n11178\n11179\n11180\n11181\n11182\n11183\n11184\n11185\n11186\n11187\n11188\n11189\n11190\n11191\n11192\n11193\n11194\n11195\n11196\n11197\n11198\n11199\n11200\n11201\n11202\n11203\n11204\n11205\n11206\n11207\n11208\n11209\n11210\n11211\n11212\n11213\n11214\n11215\n11216\n11217\n11218\n11219\n11220\n11221\n11222\n11223\n11224\n11225\n11226\n11227\n11228\n11229\n11230\n11231\n11232\n11233\n11234\n11235\n11236\n11237\n11238\n11239\n11240\n11241\n11242\n11243\n11244\n11245\n11246\n11247\n11248\n11249\n11250\n11251\n11252\n11253\n11254\n11255\n11256\n11257\n11258\n11259\n11260\n11261\n11262\n11263\n11264\n11265\n11266\n11267\n11268\n11269\n11270\n11271\n11272\n11273\n11274\n11275\n11276\n11277\n11278\n11279\n11280\n11281\n11282\n11283\n11284\n11285\n11286\n11287\n11288\n11289\n11290\n11291\n11292\n11293\n11294\n11295\n11296\n11297\n11298\n11299\n11300\n11301\n11302\n11303\n11304\n11305\n11306\n11307\n11308\n11309\n11310\n11311\n11312\n11313\n11314\n11315\n11316\n11317\n11318\n11319\n11320\n11321\n11322\n11323\n11324\n11325\n11326\n11327\n11328\n11329\n11330\n11331\n11332\n11333\n11334\n11335\n11336\n11337\n11338\n11339\n11340\n11341\n11342\n11343\n11344\n11345\n11346\n11347\n11348\n11349\n11350\n11351\n11352\n11353\n11354\n11355\n11356\n11357\n11358\n11359\n11360\n11361\n11362\n11363\n11364\n11365\n11366\n11367\n11368\n11369\n11370\n11371\n11372\n11373\n11374\n11375\n11376\n11377\n11378\n11379\n11380\n11381\n11382\n11383\n11384\n11385\n11386\n11387\n11388\n11389\n11390\n11391\n11392\n11393\n11394\n11395\n11396\n11397\n11398\n11399\n11400\n11401\n11402\n11403\n11404\n11405\n11406\n11407\n11408\n11409\n11410\n11411\n11412\n11413\n11414\n11415\n11416\n11417\n11418\n11419\n11420\n11421\n11422\n11423\n11424\n11425\n11426\n11427\n11428\n11429\n11430\n11431\n11432\n11433\n11434\n11435\n11436\n11437\n11438\n11439\n11440\n11441\n11442\n11443\n11444\n11445\n11446\n11447\n11448\n11449\n11450\n11451\n11452\n11453\n11454\n11455\n11456\n11457\n11458\n11459\n11460\n11461\n11462\n11463\n11464\n11465\n11466\n11467\n11468\n11469\n11470\n11471\n11472\n11473\n11474\n11475\n11476\n11477\n11478\n11479\n11480\n11481\n11482\n11483\n11484\n11485\n11486\n11487\n11488\n11489\n11490\n11491\n11492\n11493\n11494\n11495\n11496\n11497\n11498\n11499\n11500\n11501\n11502\n11503\n11504\n11505\n11506\n11507\n11508\n11509\n11510\n11511\n11512\n11513\n11514\n11515\n11516\n11517\n11518\n11519\n11520\n11521\n11522\n11523\n11524\n11525\n11526\n11527\n11528\n11529\n11530\n11531\n11532\n11533\n11534\n11535\n11536\n11537\n11538\n11539\n11540\n11541\n11542\n11543\n11544\n11545\n11546\n11547\n11548\n11549\n11550\n11551\n11552\n11553\n11554\n11555\n11556\n11557\n11558\n11559\n11560\n11561\n11562\n11563\n11564\n11565\n11566\n11567\n11568\n11569\n11570\n11571\n11572\n11573\n11574\n11575\n11576\n11577\n11578\n11579\n11580\n11581\n11582\n11583\n11584\n11585\n11586\n11587\n11588\n11589\n11590\n11591\n11592\n11593\n11594\n11595\n11596\n11597\n11598\n11599\n11600\n11601\n11602\n11603\n11604\n11605\n11606\n11607\n11608\n11609\n11610\n11611\n11612\n11613\n11614\n11615\n11616\n11617\n11618\n11619\n11620\n11621\n11622\n11623\n11624\n11625\n11626\n11627\n11628\n11629\n11630\n11631\n11632\n11633\n11634\n11635\n11636\n11637\n11638\n11639\n11640\n11641\n11642\n11643\n11644\n11645\n11646\n11647\n11648\n11649\n11650\n11651\n11652\n11653\n11654\n11655\n11656\n11657\n11658\n11659\n11660\n11661\n11662\n11663\n11664\n11665\n11666\n11667\n11668\n11669\n11670\n11671\n11672\n11673\n11674\n11675\n11676\n11677\n11678\n11679\n11680\n11681\n11682\n11683\n11684\n11685\n11686\n11687\n11688\n11689\n11690\n11691\n11692\n11693\n11694\n11695\n11696\n11697\n11698\n11699\n11700\n11701\n11702\n11703\n11704\n11705\n11706\n11707\n11708\n11709\n11710\n11711\n11712\n11713\n11714\n11715\n11716\n11717\n11718\n11719\n11720\n11721\n11722\n11723\n11724\n11725\n11726\n11727\n11728\n11729\n11730\n11731\n11732\n11733\n11734\n11735\n11736\n11737\n11738\n11739\n11740\n11741\n11742\n11743\n11744\n11745\n11746\n11747\n11748\n11749\n11750\n11751\n11752\n11753\n11754\n11755\n11756\n11757\n11758\n11759\n11760\n11761\n11762\n11763\n11764\n11765\n11766\n11767\n11768\n11769\n11770\n11771\n11772\n11773\n11774\n11775\n11776\n11777\n11778\n11779\n11780\n11781\n11782\n11783\n11784\n11785\n11786\n11787\n11788\n11789\n11790\n11791\n11792\n11793\n11794\n11795\n11796\n11797\n11798\n11799\n11800\n11801\n11802\n11803\n11804\n11805\n11806\n11807\n11808\n11809\n11810\n11811\n11812\n11813\n11814\n11815\n11816\n11817\n11818\n11819\n11820\n11821\n11822\n11823\n11824\n11825\n11826\n11827\n11828\n11829\n11830\n11831\n11832\n11833\n11834\n11835\n11836\n11837\n11838\n11839\n11840\n11841\n11842\n11843\n11844\n11845\n11846\n11847\n11848\n11849\n11850\n11851\n11852\n11853\n11854\n11855\n11856\n11857\n11858\n11859\n11860\n11861\n11862\n11863\n11864\n11865\n11866\n11867\n11868\n11869\n11870\n11871\n11872\n11873\n11874\n11875\n11876\n11877\n11878\n11879\n11880\n11881\n11882\n11883\n11884\n11885\n11886\n11887\n11888\n11889\n11890\n11891\n11892\n11893\n11894\n11895\n11896\n11897\n11898\n11899\n11900\n11901\n11902\n11903\n11904\n11905\n11906\n11907\n11908\n11909\n11910\n11911\n11912\n11913\n11914\n11915\n11916\n11917\n11918\n11919\n11920\n11921\n11922\n11923\n11924\n11925\n11926\n11927\n11928\n11929\n11930\n11931\n11932\n11933\n11934\n11935\n11936\n11937\n11938\n11939\n11940\n11941\n11942\n11943\n11944\n11945\n11946\n11947\n11948\n11949\n11950\n11951\n11952\n11953\n11954\n11955\n11956\n11957\n11958\n11959\n11960\n11961\n11962\n11963\n11964\n11965\n11966\n11967\n11968\n11969\n11970\n11971\n11972\n11973\n11974\n11975\n11976\n11977\n11978\n11979\n11980\n11981\n11982\n11983\n11984\n11985\n11986\n11987\n11988\n11989\n11990\n11991\n11992\n11993\n11994\n11995\n11996\n11997\n11998\n11999\n12000\n12001\n12002\n12003\n12004\n12005\n12006\n12007\n12008\n12009\n12010\n12011\n12012\n12013\n12014\n12015\n12016\n12017\n12018\n12019\n12020\n12021\n12022\n12023\n12024\n12025\n12026\n12027\n12028\n12029\n12030\n12031\n12032\n12033\n12034\n12035\n12036\n12037\n12038\n12039\n12040\n12041\n12042\n12043\n12044\n12045\n12046\n12047\n12048\n12049\n12050\n12051\n12052\n12053\n12054\n12055\n12056\n12057\n12058\n12059\n12060\n12061\n12062\n12063\n12064\n12065\n12066\n12067\n12068\n12069\n12070\n12071\n12072\n12073\n12074\n12075\n12076\n12077\n12078\n12079\n12080\n12081\n12082\n12083\n12084\n12085\n12086\n12087\n12088\n12089\n12090\n12091\n12092\n12093\n12094\n12095\n12096\n12097\n12098\n12099\n12100\n12101\n12102\n12103\n12104\n12105\n12106\n12107\n12108\n12109\n12110\n12111\n12112\n12113\n12114\n12115\n12116\n12117\n12118\n12119\n12120\n12121\n12122\n12123\n12124\n12125\n12126\n12127\n12128\n12129\n12130\n12131\n12132\n12133\n12134\n12135\n12136\n12137\n12138\n12139\n12140\n12141\n12142\n12143\n12144\n12145\n12146\n12147\n12148\n12149\n12150\n12151\n12152\n12153\n12154\n12155\n12156\n12157\n12158\n12159\n12160\n12161\n12162\n12163\n12164\n12165\n12166\n12167\n12168\n12169\n12170\n12171\n12172\n12173\n12174\n12175\n12176\n12177\n12178\n12179\n12180\n12181\n12182\n12183\n12184\n12185\n12186\n12187\n12188\n12189\n12190\n12191\n12192\n12193\n12194\n12195\n12196\n12197\n12198\n12199\n12200\n12201\n12202\n12203\n12204\n12205\n12206\n12207\n12208\n12209\n12210\n12211\n12212\n12213\n12214\n12215\n12216\n12217\n12218\n12219\n12220\n12221\n12222\n12223\n12224\n12225\n12226\n12227\n12228\n12229\n12230\n12231\n12232\n12233\n12234\n12235\n12236\n12237\n12238\n12239\n12240\n12241\n12242\n12243\n12244\n12245\n12246\n12247\n12248\n12249\n12250\n12251\n12252\n12253\n12254\n12255\n12256\n12257\n12258\n12259\n12260\n12261\n12262\n12263\n12264\n12265\n12266\n12267\n12268\n12269\n12270\n12271\n12272\n12273\n12274\n12275\n12276\n12277\n12278\n12279\n12280\n12281\n12282\n12283\n12284\n12285\n12286\n12287\n12288\n12289\n12290\n12291\n12292\n12293\n12294\n12295\n12296\n12297\n12298\n12299\n12300\n12301\n12302\n12303\n12304\n12305\n12306\n12307\n12308\n12309\n12310\n12311\n12312\n12313\n12314\n12315\n12316\n12317\n12318\n12319\n12320\n12321\n12322\n12323\n12324\n12325\n12326\n12327\n12328\n12329\n12330\n12331\n12332\n12333\n12334\n12335\n12336\n12337\n12338\n12339\n12340\n12341\n12342\n12343\n12344\n12345\n12346\n12347\n12348\n12349\n12350\n12351\n12352\n12353\n12354\n12355\n12356\n12357\n12358\n12359\n12360\n12361\n12362\n12363\n12364\n12365\n12366\n12367\n12368\n12369\n12370\n12371\n12372\n12373\n12374\n12375\n12376\n12377\n12378\n12379\n12380\n12381\n12382\n12383\n12384\n12385\n12386\n12387\n12388\n12389\n12390\n12391\n12392\n12393\n12394\n12395\n12396\n12397\n12398\n12399\n12400\n12401\n12402\n12403\n12404\n12405\n12406\n12407\n12408\n12409\n12410\n12411\n12412\n12413\n12414\n12415\n12416\n12417\n12418\n12419\n12420\n12421\n12422\n12423\n12424\n12425\n12426\n12427\n12428\n12429\n12430\n12431\n12432\n12433\n12434\n12435\n12436\n12437\n12438\n12439\n12440\n12441\n12442\n12443\n12444\n12445\n12446\n12447\n12448\n12449\n12450\n12451\n12452\n12453\n12454\n12455\n12456\n12457\n12458\n12459\n12460\n12461\n12462\n12463\n12464\n12465\n12466\n12467\n12468\n12469\n12470\n12471\n12472\n12473\n12474\n12475\n12476\n12477\n12478\n12479\n12480\n12481\n12482\n12483\n12484\n12485\n12486\n12487\n12488\n12489\n12490\n12491\n12492\n12493\n12494\n12495\n12496\n12497\n12498\n12499\n12500\n12501\n12502\n12503\n12504\n12505\n12506\n12507\n12508\n12509\n12510\n12511\n12512\n12513\n12514\n12515\n12516\n12517\n12518\n12519\n12520\n12521\n12522\n12523\n12524\n12525\n12526\n12527\n12528\n12529\n12530\n12531\n12532\n12533\n12534\n12535\n12536\n12537\n12538\n12539\n12540\n12541\n12542\n12543\n12544\n12545\n12546\n12547\n12548\n12549\n12550\n12551\n12552\n12553\n12554\n12555\n12556\n12557\n12558\n12559\n12560\n12561\n12562\n12563\n12564\n12565\n12566\n12567\n12568\n12569\n12570\n12571\n12572\n12573\n12574\n12575\n12576\n12577\n12578\n12579\n12580\n12581\n12582\n12583\n12584\n12585\n12586\n12587\n12588\n12589\n12590\n12591\n12592\n12593\n12594\n12595\n12596\n12597\n12598\n12599\n12600\n12601\n12602\n12603\n12604\n12605\n12606\n12607\n12608\n12609\n12610\n12611\n12612\n12613\n12614\n12615\n12616\n12617\n12618\n12619\n12620\n12621\n12622\n12623\n12624\n12625\n12626\n12627\n12628\n12629\n12630\n12631\n12632\n12633\n12634\n12635\n12636\n12637\n12638\n12639\n12640\n12641\n12642\n12643\n12644\n12645\n12646\n12647\n12648\n12649\n12650\n12651\n12652\n12653\n12654\n12655\n12656\n12657\n12658\n12659\n12660\n12661\n12662\n12663\n12664\n12665\n12666\n12667\n12668\n12669\n12670\n12671\n12672\n12673\n12674\n12675\n12676\n12677\n12678\n12679\n12680\n12681\n12682\n12683\n12684\n12685\n12686\n12687\n12688\n12689\n12690\n12691\n12692\n12693\n12694\n12695\n12696\n12697\n12698\n12699\n12700\n12701\n12702\n12703\n12704\n12705\n12706\n12707\n12708\n12709\n12710\n12711\n12712\n12713\n12714\n12715\n12716\n12717\n12718\n12719\n12720\n12721\n12722\n12723\n12724\n12725\n12726\n12727\n12728\n12729\n12730\n12731\n12732\n12733\n12734\n12735\n12736\n12737\n12738\n12739\n12740\n12741\n12742\n12743\n12744\n12745\n12746\n12747\n12748\n12749\n12750\n12751\n12752\n12753\n12754\n12755\n12756\n12757\n12758\n12759\n12760\n12761\n12762\n12763\n12764\n12765\n12766\n12767\n12768\n12769\n12770\n12771\n12772\n12773\n12774\n12775\n12776\n12777\n12778\n12779\n12780\n12781\n12782\n12783\n12784\n12785\n12786\n12787\n12788\n12789\n12790\n12791\n12792\n12793\n12794\n12795\n12796\n12797\n12798\n12799\n12800\n12801\n12802\n12803\n12804\n12805\n12806\n12807\n12808\n12809\n12810\n12811\n12812\n12813\n12814\n12815\n12816\n12817\n12818\n12819\n12820\n12821\n12822\n12823\n12824\n12825\n12826\n12827\n12828\n12829\n12830\n12831\n12832\n12833\n12834\n12835\n12836\n12837\n12838\n12839\n12840\n12841\n12842\n12843\n12844\n12845\n12846\n12847\n12848\n12849\n12850\n12851\n12852\n12853\n12854\n12855\n12856\n12857\n12858\n12859\n12860\n12861\n12862\n12863\n12864\n12865\n12866\n12867\n12868\n12869\n12870\n12871\n12872\n12873\n12874\n12875\n12876\n12877\n12878\n12879\n12880\n12881\n12882\n12883\n12884\n12885\n12886\n12887\n12888\n12889\n12890\n12891\n12892\n12893\n12894\n12895\n12896\n12897\n12898\n12899\n12900\n12901\n12902\n12903\n12904\n12905\n12906\n12907\n12908\n12909\n12910\n12911\n12912\n12913\n12914\n12915\n12916\n12917\n12918\n12919\n12920\n12921\n12922\n12923\n12924\n12925\n12926\n12927\n12928\n12929\n12930\n12931\n12932\n12933\n12934\n12935\n12936\n12937\n12938\n12939\n12940\n12941\n12942\n12943\n12944\n12945\n12946\n12947\n12948\n12949\n12950\n12951\n12952\n12953\n12954\n12955\n12956\n12957\n12958\n12959\n12960\n12961\n12962\n12963\n12964\n12965\n12966\n12967\n12968\n12969\n12970\n12971\n12972\n12973\n12974\n12975\n12976\n12977\n12978\n12979\n12980\n12981\n12982\n12983\n12984\n12985\n12986\n12987\n12988\n12989\n12990\n12991\n12992\n12993\n12994\n12995\n12996\n12997\n12998\n12999\n13000\n13001\n13002\n13003\n13004\n13005\n13006\n13007\n13008\n13009\n13010\n13011\n13012\n13013\n13014\n13015\n13016\n13017\n13018\n13019\n13020\n13021\n13022\n13023\n13024\n13025\n13026\n13027\n13028\n13029\n13030\n13031\n13032\n13033\n13034\n13035\n13036\n13037\n13038\n13039\n13040\n13041\n13042\n13043\n13044\n13045\n13046\n13047\n13048\n13049\n13050\n13051\n13052\n13053\n13054\n13055\n13056\n13057\n13058\n13059\n13060\n13061\n13062\n13063\n13064\n13065\n13066\n13067\n13068\n13069\n13070\n13071\n13072\n13073\n13074\n13075\n13076\n13077\n13078\n13079\n13080\n13081\n13082\n13083\n13084\n13085\n13086\n13087\n13088\n13089\n13090\n13091\n13092\n13093\n13094\n13095\n13096\n13097\n13098\n13099\n13100\n13101\n13102\n13103\n13104\n13105\n13106\n13107\n13108\n13109\n13110\n13111\n13112\n13113\n13114\n13115\n13116\n13117\n13118\n13119\n13120\n13121\n13122\n13123\n13124\n13125\n13126\n13127\n13128\n13129\n13130\n13131\n13132\n13133\n13134\n13135\n13136\n13137\n13138\n13139\n13140\n13141\n13142\n13143\n13144\n13145\n13146\n13147\n13148\n13149\n13150\n13151\n13152\n13153\n13154\n13155\n13156\n13157\n13158\n13159\n13160\n13161\n13162\n13163\n13164\n13165\n13166\n13167\n13168\n13169\n13170\n13171\n13172\n13173\n13174\n13175\n13176\n13177\n13178\n13179\n13180\n13181\n13182\n13183\n13184\n13185\n13186\n13187\n13188\n13189\n13190\n13191\n13192\n13193\n13194\n13195\n13196\n13197\n13198\n13199\n13200\n13201\n13202\n13203\n13204\n13205\n13206\n13207\n13208\n13209\n13210\n13211\n13212\n13213\n13214\n13215\n13216\n13217\n13218\n13219\n13220\n13221\n13222\n13223\n13224\n13225\n13226\n13227\n13228\n13229\n13230\n13231\n13232\n13233\n13234\n13235\n13236\n13237\n13238\n13239\n13240\n13241\n13242\n13243\n13244\n13245\n13246\n13247\n13248\n13249\n13250\n13251\n13252\n13253\n13254\n13255\n13256\n13257\n13258\n13259\n13260\n13261\n13262\n13263\n13264\n13265\n13266\n13267\n13268\n13269\n13270\n13271\n13272\n13273\n13274\n13275\n13276\n13277\n13278\n13279\n13280\n13281\n13282\n13283\n13284\n13285\n13286\n13287\n13288\n13289\n13290\n13291\n13292\n13293\n13294\n13295\n13296\n13297\n13298\n13299\n13300\n13301\n13302\n13303\n13304\n13305\n13306\n13307\n13308\n13309\n13310\n13311\n13312\n13313\n13314\n13315\n13316\n13317\n13318\n13319\n13320\n13321\n13322\n13323\n13324\n13325\n13326\n13327\n13328\n13329\n13330\n13331\n13332\n13333\n13334\n13335\n13336\n13337\n13338\n13339\n13340\n13341\n13342\n13343\n13344\n13345\n13346\n13347\n13348\n13349\n13350\n13351\n13352\n13353\n13354\n13355\n13356\n13357\n13358\n13359\n13360\n13361\n13362\n13363\n13364\n13365\n13366\n13367\n13368\n13369\n13370\n13371\n13372\n13373\n13374\n13375\n13376\n13377\n13378\n13379\n13380\n13381\n13382\n13383\n13384\n13385\n13386\n13387\n13388\n13389\n13390\n13391\n13392\n13393\n13394\n13395\n13396\n13397\n13398\n13399\n13400\n13401\n13402\n13403\n13404\n13405\n13406\n13407\n13408\n13409\n13410\n13411\n13412\n13413\n13414\n13415\n13416\n13417\n13418\n13419\n13420\n13421\n13422\n13423\n13424\n13425\n13426\n13427\n13428\n13429\n13430\n13431\n13432\n13433\n13434\n13435\n13436\n13437\n13438\n13439\n13440\n13441\n13442\n13443\n13444\n13445\n13446\n13447\n13448\n13449\n13450\n13451\n13452\n13453\n13454\n13455\n13456\n13457\n13458\n13459\n13460\n13461\n13462\n13463\n13464\n13465\n13466\n13467\n13468\n13469\n13470\n13471\n13472\n13473\n13474\n13475\n13476\n13477\n13478\n13479\n13480\n13481\n13482\n13483\n13484\n13485\n13486\n13487\n13488\n13489\n13490\n13491\n13492\n13493\n13494\n13495\n13496\n13497\n13498\n13499\n13500\n13501\n13502\n13503\n13504\n13505\n13506\n13507\n13508\n13509\n13510\n13511\n13512\n13513\n13514\n13515\n13516\n13517\n13518\n13519\n13520\n13521\n13522\n13523\n13524\n13525\n13526\n13527\n13528\n13529\n13530\n13531\n13532\n13533\n13534\n13535\n13536\n13537\n13538\n13539\n13540\n13541\n13542\n13543\n13544\n13545\n13546\n13547\n13548\n13549\n13550\n13551\n13552\n13553\n13554\n13555\n13556\n13557\n13558\n13559\n13560\n13561\n13562\n13563\n13564\n13565\n13566\n13567\n13568\n13569\n13570\n13571\n13572\n13573\n13574\n13575\n13576\n13577\n13578\n13579\n13580\n13581\n13582\n13583\n13584\n13585\n13586\n13587\n13588\n13589\n13590\n13591\n13592\n13593\n13594\n13595\n13596\n13597\n13598\n13599\n13600\n13601\n13602\n13603\n13604\n13605\n13606\n13607\n13608\n13609\n13610\n13611\n13612\n13613\n13614\n13615\n13616\n13617\n13618\n13619\n13620\n13621\n13622\n13623\n13624\n13625\n13626\n13627\n13628\n13629\n13630\n13631\n13632\n13633\n13634\n13635\n13636\n13637\n13638\n13639\n13640\n13641\n13642\n13643\n13644\n13645\n13646\n13647\n13648\n13649\n13650\n13651\n13652\n13653\n13654\n13655\n13656\n13657\n13658\n13659\n13660\n13661\n13662\n13663\n13664\n13665\n13666\n13667\n13668\n13669\n13670\n13671\n13672\n13673\n13674\n13675\n13676\n13677\n13678\n13679\n13680\n13681\n13682\n13683\n13684\n13685\n13686\n13687\n13688\n13689\n13690\n13691\n13692\n13693\n13694\n13695\n13696\n13697\n13698\n13699\n13700\n13701\n13702\n13703\n13704\n13705\n13706\n13707\n13708\n13709\n13710\n13711\n13712\n13713\n13714\n13715\n13716\n13717\n13718\n13719\n13720\n13721\n13722\n13723\n13724\n13725\n13726\n13727\n13728\n13729\n13730\n13731\n13732\n13733\n13734\n13735\n13736\n13737\n13738\n13739\n13740\n13741\n13742\n13743\n13744\n13745\n13746\n13747\n13748\n13749\n13750\n13751\n13752\n13753\n13754\n13755\n13756\n13757\n13758\n13759\n13760\n13761\n13762\n13763\n13764\n13765\n13766\n13767\n13768\n13769\n13770\n13771\n13772\n13773\n13774\n13775\n13776\n13777\n13778\n13779\n13780\n13781\n13782\n13783\n13784\n13785\n13786\n13787\n13788\n13789\n13790\n13791\n13792\n13793\n13794\n13795\n13796\n13797\n13798\n13799\n13800\n13801\n13802\n13803\n13804\n13805\n13806\n13807\n13808\n13809\n13810\n13811\n13812\n13813\n13814\n13815\n13816\n13817\n13818\n13819\n13820\n13821\n13822\n13823\n13824\n13825\n13826\n13827\n13828\n13829\n13830\n13831\n13832\n13833\n13834\n13835\n13836\n13837\n13838\n13839\n13840\n13841\n13842\n13843\n13844\n13845\n13846\n13847\n13848\n13849\n13850\n13851\n13852\n13853\n13854\n13855\n13856\n13857\n13858\n13859\n13860\n13861\n13862\n13863\n13864\n13865\n13866\n13867\n13868\n13869\n13870\n13871\n13872\n13873\n13874\n13875\n13876\n13877\n13878\n13879\n13880\n13881\n13882\n13883\n13884\n13885\n13886\n13887\n13888\n13889\n13890\n13891\n13892\n13893\n13894\n13895\n13896\n13897\n13898\n13899\n13900\n13901\n13902\n13903\n13904\n13905\n13906\n13907\n13908\n13909\n13910\n13911\n13912\n13913\n13914\n13915\n13916\n13917\n13918\n13919\n13920\n13921\n13922\n13923\n13924\n13925\n13926\n13927\n13928\n13929\n13930\n13931\n13932\n13933\n13934\n13935\n13936\n13937\n13938\n13939\n13940\n13941\n13942\n13943\n13944\n13945\n13946\n13947\n13948\n13949\n13950\n13951\n13952\n13953\n13954\n13955\n13956\n13957\n13958\n13959\n13960\n13961\n13962\n13963\n13964\n13965\n13966\n13967\n13968\n13969\n13970\n13971\n13972\n13973\n13974\n13975\n13976\n13977\n13978\n13979\n13980\n13981\n13982\n13983\n13984\n13985\n13986\n13987\n13988\n13989\n13990\n13991\n13992\n13993\n13994\n13995\n13996\n13997\n13998\n13999\n14000\n14001\n14002\n14003\n14004\n14005\n14006\n14007\n14008\n14009\n14010\n14011\n14012\n14013\n14014\n14015\n14016\n14017\n14018\n14019\n14020\n14021\n14022\n14023\n14024\n14025\n14026\n14027\n14028\n14029\n14030\n14031\n14032\n14033\n14034\n14035\n14036\n14037\n14038\n14039\n14040\n14041\n14042\n14043\n14044\n14045\n14046\n14047\n14048\n14049\n14050\n14051\n14052\n14053\n14054\n14055\n14056\n14057\n14058\n14059\n14060\n14061\n14062\n14063\n14064\n14065\n14066\n14067\n14068\n14069\n14070\n14071\n14072\n14073\n14074\n14075\n14076\n14077\n14078\n14079\n14080\n14081\n14082\n14083\n14084\n14085\n14086\n14087\n14088\n14089\n14090\n14091\n14092\n14093\n14094\n14095\n14096\n14097\n14098\n14099\n14100\n14101\n14102\n14103\n14104\n14105\n14106\n14107\n14108\n14109\n14110\n14111\n14112\n14113\n14114\n14115\n14116\n14117\n14118\n14119\n14120\n14121\n14122\n14123\n14124\n14125\n14126\n14127\n14128\n14129\n14130\n14131\n14132\n14133\n14134\n14135\n14136\n14137\n14138\n14139\n14140\n14141\n14142\n14143\n14144\n14145\n14146\n14147\n14148\n14149\n14150\n14151\n14152\n14153\n14154\n14155\n14156\n14157\n14158\n14159\n14160\n14161\n14162\n14163\n14164\n14165\n14166\n14167\n14168\n14169\n14170\n14171\n14172\n14173\n14174\n14175\n14176\n14177\n14178\n14179\n14180\n14181\n14182\n14183\n14184\n14185\n14186\n14187\n14188\n14189\n14190\n14191\n14192\n14193\n14194\n14195\n14196\n14197\n14198\n14199\n14200\n14201\n14202\n14203\n14204\n14205\n14206\n14207\n14208\n14209\n14210\n14211\n14212\n14213\n14214\n14215\n14216\n14217\n14218\n14219\n14220\n14221\n14222\n14223\n14224\n14225\n14226\n14227\n14228\n14229\n14230\n14231\n14232\n14233\n14234\n14235\n14236\n14237\n14238\n14239\n14240\n14241\n14242\n14243\n14244\n14245\n14246\n14247\n14248\n14249\n14250\n14251\n14252\n14253\n14254\n14255\n14256\n14257\n14258\n14259\n14260\n14261\n14262\n14263\n14264\n14265\n14266\n14267\n14268\n14269\n14270\n14271\n14272\n14273\n14274\n14275\n14276\n14277\n14278\n14279\n14280\n14281\n14282\n14283\n14284\n14285\n14286\n14287\n14288\n14289\n14290\n14291\n14292\n14293\n14294\n14295\n14296\n14297\n14298\n14299\n14300\n14301\n14302\n14303\n14304\n14305\n14306\n14307\n14308\n14309\n14310\n14311\n14312\n14313\n14314\n14315\n14316\n14317\n14318\n14319\n14320\n14321\n14322\n14323\n14324\n14325\n14326\n14327\n14328\n14329\n14330\n14331\n14332\n14333\n14334\n14335\n14336\n14337\n14338\n14339\n14340\n14341\n14342\n14343\n14344\n14345\n14346\n14347\n14348\n14349\n14350\n14351\n14352\n14353\n14354\n14355\n14356\n14357\n14358\n14359\n14360\n14361\n14362\n14363\n14364\n14365\n14366\n14367\n14368\n14369\n14370\n14371\n14372\n14373\n14374\n14375\n14376\n14377\n14378\n14379\n14380\n14381\n14382\n14383\n14384\n14385\n14386\n14387\n14388\n14389\n14390\n14391\n14392\n14393\n14394\n14395\n14396\n14397\n14398\n14399\n14400\n14401\n14402\n14403\n14404\n14405\n14406\n14407\n14408\n14409\n14410\n14411\n14412\n14413\n14414\n14415\n14416\n14417\n14418\n14419\n14420\n14421\n14422\n14423\n14424\n14425\n14426\n14427\n14428\n14429\n14430\n14431\n14432\n14433\n14434\n14435\n14436\n14437\n14438\n14439\n14440\n14441\n14442\n14443\n14444\n14445\n14446\n14447\n14448\n14449\n14450\n14451\n14452\n14453\n14454\n14455\n14456\n14457\n14458\n14459\n14460\n14461\n14462\n14463\n14464\n14465\n14466\n14467\n14468\n14469\n14470\n14471\n14472\n14473\n14474\n14475\n14476\n14477\n14478\n14479\n14480\n14481\n14482\n14483\n14484\n14485\n14486\n14487\n14488\n14489\n14490\n14491\n14492\n14493\n14494\n14495\n14496\n14497\n14498\n14499\n14500\n14501\n14502\n14503\n14504\n14505\n14506\n14507\n14508\n14509\n14510\n14511\n14512\n14513\n14514\n14515\n14516\n14517\n14518\n14519\n14520\n14521\n14522\n14523\n14524\n14525\n14526\n14527\n14528\n14529\n14530\n14531\n14532\n14533\n14534\n14535\n14536\n14537\n14538\n14539\n14540\n14541\n14542\n14543\n14544\n14545\n14546\n14547\n14548\n14549\n14550\n14551\n14552\n14553\n14554\n14555\n14556\n14557\n14558\n14559\n14560\n14561\n14562\n14563\n14564\n14565\n14566\n14567\n14568\n14569\n14570\n14571\n14572\n14573\n14574\n14575\n14576\n14577\n14578\n14579\n14580\n14581\n14582\n14583\n14584\n14585\n14586\n14587\n14588\n14589\n14590\n14591\n14592\n14593\n14594\n14595\n14596\n14597\n14598\n14599\n14600\n14601\n14602\n14603\n14604\n14605\n14606\n14607\n14608\n14609\n14610\n14611\n14612\n14613\n14614\n14615\n14616\n14617\n14618\n14619\n14620\n14621\n14622\n14623\n14624\n14625\n14626\n14627\n14628\n14629\n14630\n14631\n14632\n14633\n14634\n14635\n14636\n14637\n14638\n14639\n14640\n14641\n14642\n14643\n14644\n14645\n14646\n14647\n14648\n14649\n14650\n14651\n14652\n14653\n14654\n14655\n14656\n14657\n14658\n14659\n14660\n14661\n14662\n14663\n14664\n14665\n14666\n14667\n14668\n14669\n14670\n14671\n14672\n14673\n14674\n14675\n14676\n14677\n14678\n14679\n14680\n14681\n14682\n14683\n14684\n14685\n14686\n14687\n14688\n14689\n14690\n14691\n14692\n14693\n14694\n14695\n14696\n14697\n14698\n14699\n14700\n14701\n14702\n14703\n14704\n14705\n14706\n14707\n14708\n14709\n14710\n14711\n14712\n14713\n14714\n14715\n14716\n14717\n14718\n14719\n14720\n14721\n14722\n14723\n14724\n14725\n14726\n14727\n14728\n14729\n14730\n14731\n14732\n14733\n14734\n14735\n14736\n14737\n14738\n14739\n14740\n14741\n14742\n14743\n14744\n14745\n14746\n14747\n14748\n14749\n14750\n14751\n14752\n14753\n14754\n14755\n14756\n14757\n14758\n14759\n14760\n14761\n14762\n14763\n14764\n14765\n14766\n14767\n14768\n14769\n14770\n14771\n14772\n14773\n14774\n14775\n14776\n14777\n14778\n14779\n14780\n14781\n14782\n14783\n14784\n14785\n14786\n14787\n14788\n14789\n14790\n14791\n14792\n14793\n14794\n14795\n14796\n14797\n14798\n14799\n14800\n14801\n14802\n14803\n14804\n14805\n14806\n14807\n14808\n14809\n14810\n14811\n14812\n14813\n14814\n14815\n14816\n14817\n14818\n14819\n14820\n14821\n14822\n14823\n14824\n14825\n14826\n14827\n14828\n14829\n14830\n14831\n14832\n14833\n14834\n14835\n14836\n14837\n14838\n14839\n14840\n14841\n14842\n14843\n14844\n14845\n14846\n14847\n14848\n14849\n14850\n14851\n14852\n14853\n14854\n14855\n14856\n14857\n14858\n14859\n14860\n14861\n14862\n14863\n14864\n14865\n14866\n14867\n14868\n14869\n14870\n14871\n14872\n14873\n14874\n14875\n14876\n14877\n14878\n14879\n14880\n14881\n14882\n14883\n14884\n14885\n14886\n14887\n14888\n14889\n14890\n14891\n14892\n14893\n14894\n14895\n14896\n14897\n14898\n14899\n14900\n14901\n14902\n14903\n14904\n14905\n14906\n14907\n14908\n14909\n14910\n14911\n14912\n14913\n14914\n14915\n14916\n14917\n14918\n14919\n14920\n14921\n14922\n14923\n14924\n14925\n14926\n14927\n14928\n14929\n14930\n14931\n14932\n14933\n14934\n14935\n14936\n14937\n14938\n14939\n14940\n14941\n14942\n14943\n14944\n14945\n14946\n14947\n14948\n14949\n14950\n14951\n14952\n14953\n14954\n14955\n14956\n14957\n14958\n14959\n14960\n14961\n14962\n14963\n14964\n14965\n14966\n14967\n14968\n14969\n14970\n14971\n14972\n14973\n14974\n14975\n14976\n14977\n14978\n14979\n14980\n14981\n14982\n14983\n14984\n14985\n14986\n14987\n14988\n14989\n14990\n14991\n14992\n14993\n14994\n14995\n14996\n14997\n14998\n14999\n15000\n15001\n15002\n15003\n15004\n15005\n15006\n15007\n15008\n15009\n15010\n15011\n15012\n15013\n15014\n15015\n15016\n15017\n15018\n15019\n15020\n15021\n15022\n15023\n15024\n15025\n15026\n15027\n15028\n15029\n15030\n15031\n15032\n15033\n15034\n15035\n15036\n15037\n15038\n15039\n15040\n15041\n15042\n15043\n15044\n15045\n15046\n15047\n15048\n15049\n15050\n15051\n15052\n15053\n15054\n15055\n15056\n15057\n15058\n15059\n15060\n15061\n15062\n15063\n15064\n15065\n15066\n15067\n15068\n15069\n15070\n15071\n15072\n15073\n15074\n15075\n15076\n15077\n15078\n15079\n15080\n15081\n15082\n15083\n15084\n15085\n15086\n15087\n15088\n15089\n15090\n15091\n15092\n15093\n15094\n15095\n15096\n15097\n15098\n15099\n15100\n15101\n15102\n15103\n15104\n15105\n15106\n15107\n15108\n15109\n15110\n15111\n15112\n15113\n15114\n15115\n15116\n15117\n15118\n15119\n15120\n15121\n15122\n15123\n15124\n15125\n15126\n15127\n15128\n15129\n15130\n15131\n15132\n15133\n15134\n15135\n15136\n15137\n15138\n15139\n15140\n15141\n15142\n15143\n15144\n15145\n15146\n15147\n15148\n15149\n15150\n15151\n15152\n15153\n15154\n15155\n15156\n15157\n15158\n15159\n15160\n15161\n15162\n15163\n15164\n15165\n15166\n15167\n15168\n15169\n15170\n15171\n15172\n15173\n15174\n15175\n15176\n15177\n15178\n15179\n15180\n15181\n15182\n15183\n15184\n15185\n15186\n15187\n15188\n15189\n15190\n15191\n15192\n15193\n15194\n15195\n15196\n15197\n15198\n15199\n15200\n15201\n15202\n15203\n15204\n15205\n15206\n15207\n15208\n15209\n15210\n15211\n15212\n15213\n15214\n15215\n15216\n15217\n15218\n15219\n15220\n15221\n15222\n15223\n15224\n15225\n15226\n15227\n15228\n15229\n15230\n15231\n15232\n15233\n15234\n15235\n15236\n15237\n15238\n15239\n15240\n15241\n15242\n15243\n15244\n15245\n15246\n15247\n15248\n15249\n15250\n15251\n15252\n15253\n15254\n15255\n15256\n15257\n15258\n15259\n15260\n15261\n15262\n15263\n15264\n15265\n15266\n15267\n15268\n15269\n15270\n15271\n15272\n15273\n15274\n15275\n15276\n15277\n15278\n15279\n15280\n15281\n15282\n15283\n15284\n15285\n15286\n15287\n15288\n15289\n15290\n15291\n15292\n15293\n15294\n15295\n15296\n15297\n15298\n15299\n15300\n15301\n15302\n15303\n15304\n15305\n15306\n15307\n15308\n15309\n15310\n15311\n15312\n15313\n15314\n15315\n15316\n15317\n15318\n15319\n15320\n15321\n15322\n15323\n15324\n15325\n15326\n15327\n15328\n15329\n15330\n15331\n15332\n15333\n15334\n15335\n15336\n15337\n15338\n15339\n15340\n15341\n15342\n15343\n15344\n15345\n15346\n15347\n15348\n15349\n15350\n15351\n15352\n15353\n15354\n15355\n15356\n15357\n15358\n15359\n15360\n15361\n15362\n15363\n15364\n15365\n15366\n15367\n15368\n15369\n15370\n15371\n15372\n15373\n15374\n15375\n15376\n15377\n15378\n15379\n15380\n15381\n15382\n15383\n15384\n15385\n15386\n15387\n15388\n15389\n15390\n15391\n15392\n15393\n15394\n15395\n15396\n15397\n15398\n15399\n15400\n15401\n15402\n15403\n15404\n15405\n15406\n15407\n15408\n15409\n15410\n15411\n15412\n15413\n15414\n15415\n15416\n15417\n15418\n15419\n15420\n15421\n15422\n15423\n15424\n15425\n15426\n15427\n15428\n15429\n15430\n15431\n15432\n15433\n15434\n15435\n15436\n15437\n15438\n15439\n15440\n15441\n15442\n15443\n15444\n15445\n15446\n15447\n15448\n15449\n15450\n15451\n15452\n15453\n15454\n15455\n15456\n15457\n15458\n15459\n15460\n15461\n15462\n15463\n15464\n15465\n15466\n15467\n15468\n15469\n15470\n15471\n15472\n15473\n15474\n15475\n15476\n15477\n15478\n15479\n15480\n15481\n15482\n15483\n15484\n15485\n15486\n15487\n15488\n15489\n15490\n15491\n15492\n15493\n15494\n15495\n15496\n15497\n15498\n15499\n15500\n15501\n15502\n15503\n15504\n15505\n15506\n15507\n15508\n15509\n15510\n15511\n15512\n15513\n15514\n15515\n15516\n15517\n15518\n15519\n15520\n15521\n15522\n15523\n15524\n15525\n15526\n15527\n15528\n15529\n15530\n15531\n15532\n15533\n15534\n15535\n15536\n15537\n15538\n15539\n15540\n15541\n15542\n15543\n15544\n15545\n15546\n15547\n15548\n15549\n15550\n15551\n15552\n15553\n15554\n15555\n15556\n15557\n15558\n15559\n15560\n15561\n15562\n15563\n15564\n15565\n15566\n15567\n15568\n15569\n15570\n15571\n15572\n15573\n15574\n15575\n15576\n15577\n15578\n15579\n15580\n15581\n15582\n15583\n15584\n15585\n15586\n15587\n15588\n15589\n15590\n15591\n15592\n15593\n15594\n15595\n15596\n15597\n15598\n15599\n15600\n15601\n15602\n15603\n15604\n15605\n15606\n15607\n15608\n15609\n15610\n15611\n15612\n15613\n15614\n15615\n15616\n15617\n15618\n15619\n15620\n15621\n15622\n15623\n15624\n15625\n15626\n15627\n15628\n15629\n15630\n15631\n15632\n15633\n15634\n15635\n15636\n15637\n15638\n15639\n15640\n15641\n15642\n15643\n15644\n15645\n15646\n15647\n15648\n15649\n15650\n15651\n15652\n15653\n15654\n15655\n15656\n15657\n15658\n15659\n15660\n15661\n15662\n15663\n15664\n15665\n15666\n15667\n15668\n15669\n15670\n15671\n15672\n15673\n15674\n15675\n15676\n15677\n15678\n15679\n15680\n15681\n15682\n15683\n15684\n15685\n15686\n15687\n15688\n15689\n15690\n15691\n15692\n15693\n15694\n15695\n15696\n15697\n15698\n15699\n15700\n15701\n15702\n15703\n15704\n15705\n15706\n15707\n15708\n15709\n15710\n15711\n15712\n15713\n15714\n15715\n15716\n15717\n15718\n15719\n15720\n15721\n15722\n15723\n15724\n15725\n15726\n15727\n15728\n15729\n15730\n15731\n15732\n15733\n15734\n15735\n15736\n15737\n15738\n15739\n15740\n15741\n15742\n15743\n15744\n15745\n15746\n15747\n15748\n15749\n15750\n15751\n15752\n15753\n15754\n15755\n15756\n15757\n15758\n15759\n15760\n15761\n15762\n15763\n15764\n15765\n15766\n15767\n15768\n15769\n15770\n15771\n15772\n15773\n15774\n15775\n15776\n15777\n15778\n15779\n15780\n15781\n15782\n15783\n15784\n15785\n15786\n15787\n15788\n15789\n15790\n15791\n15792\n15793\n15794\n15795\n15796\n15797\n15798\n15799\n15800\n15801\n15802\n15803\n15804\n15805\n15806\n15807\n15808\n15809\n15810\n15811\n15812\n15813\n15814\n15815\n15816\n15817\n15818\n15819\n15820\n15821\n15822\n15823\n15824\n15825\n15826\n15827\n15828\n15829\n15830\n15831\n15832\n15833\n15834\n15835\n15836\n15837\n15838\n15839\n15840\n15841\n15842\n15843\n15844\n15845\n15846\n15847\n15848\n15849\n15850\n15851\n15852\n15853\n15854\n15855\n15856\n15857\n15858\n15859\n15860\n15861\n15862\n15863\n15864\n15865\n15866\n15867\n15868\n15869\n15870\n15871\n15872\n15873\n15874\n15875\n15876\n15877\n15878\n15879\n15880\n15881\n15882\n15883\n15884\n15885\n15886\n15887\n15888\n15889\n15890\n15891\n15892\n15893\n15894\n15895\n15896\n15897\n15898\n15899\n15900\n15901\n15902\n15903\n15904\n15905\n15906\n15907\n15908\n15909\n15910\n15911\n15912\n15913\n15914\n15915\n15916\n15917\n15918\n15919\n15920\n15921\n15922\n15923\n15924\n15925\n15926\n15927\n15928\n15929\n15930\n15931\n15932\n15933\n15934\n15935\n15936\n15937\n15938\n15939\n15940\n15941\n15942\n15943\n15944\n15945\n15946\n15947\n15948\n15949\n15950\n15951\n15952\n15953\n15954\n15955\n15956\n15957\n15958\n15959\n15960\n15961\n15962\n15963\n15964\n15965\n15966\n15967\n15968\n15969\n15970\n15971\n15972\n15973\n15974\n15975\n15976\n15977\n15978\n15979\n15980\n15981\n15982\n15983\n15984\n15985\n15986\n15987\n15988\n15989\n15990\n15991\n15992\n15993\n15994\n15995\n15996\n15997\n15998\n15999\n16000\n16001\n16002\n16003\n16004\n16005\n16006\n16007\n16008\n16009\n16010\n16011\n16012\n16013\n16014\n16015\n16016\n16017\n16018\n16019\n16020\n16021\n16022\n16023\n16024\n16025\n16026\n16027\n16028\n16029\n16030\n16031\n16032\n16033\n16034\n16035\n16036\n16037\n16038\n16039\n16040\n16041\n16042\n16043\n16044\n16045\n16046\n16047\n16048\n16049\n16050\n16051\n16052\n16053\n16054\n16055\n16056\n16057\n16058\n16059\n16060\n16061\n16062\n16063\n16064\n16065\n16066\n16067\n16068\n16069\n16070\n16071\n16072\n16073\n16074\n16075\n16076\n16077\n16078\n16079\n16080\n16081\n16082\n16083\n16084\n16085\n16086\n16087\n16088\n16089\n16090\n16091\n16092\n16093\n16094\n16095\n16096\n16097\n16098\n16099\n16100\n16101\n16102\n16103\n16104\n16105\n16106\n16107\n16108\n16109\n16110\n16111\n16112\n16113\n16114\n16115\n16116\n16117\n16118\n16119\n16120\n16121\n16122\n16123\n16124\n16125\n16126\n16127\n16128\n16129\n16130\n16131\n16132\n16133\n16134\n16135\n16136\n16137\n16138\n16139\n16140\n16141\n16142\n16143\n16144\n16145\n16146\n16147\n16148\n16149\n16150\n16151\n16152\n16153\n16154\n16155\n16156\n16157\n16158\n16159\n16160\n16161\n16162\n16163\n16164\n16165\n16166\n16167\n16168\n16169\n16170\n16171\n16172\n16173\n16174\n16175\n16176\n16177\n16178\n16179\n16180\n16181\n16182\n16183\n16184\n16185\n16186\n16187\n16188\n16189\n16190\n16191\n16192\n16193\n16194\n16195\n16196\n16197\n16198\n16199\n16200\n16201\n16202\n16203\n16204\n16205\n16206\n16207\n16208\n16209\n16210\n16211\n16212\n16213\n16214\n16215\n16216\n16217\n16218\n16219\n16220\n16221\n16222\n16223\n16224\n16225\n16226\n16227\n16228\n16229\n16230\n16231\n16232\n16233\n16234\n16235\n16236\n16237\n16238\n16239\n16240\n16241\n16242\n16243\n16244\n16245\n16246\n16247\n16248\n16249\n16250\n16251\n16252\n16253\n16254\n16255\n16256\n16257\n16258\n16259\n16260\n16261\n16262\n16263\n16264\n16265\n16266\n16267\n16268\n16269\n16270\n16271\n16272\n16273\n16274\n16275\n16276\n16277\n16278\n16279\n16280\n16281\n16282\n16283\n16284\n16285\n16286\n16287\n16288\n16289\n16290\n16291\n16292\n16293\n16294\n16295\n16296\n16297\n16298\n16299\n16300\n16301\n16302\n16303\n16304\n16305\n16306\n16307\n16308\n16309\n16310\n16311\n16312\n16313\n16314\n16315\n16316\n16317\n16318\n16319\n16320\n16321\n16322\n16323\n16324\n16325\n16326\n16327\n16328\n16329\n16330\n16331\n16332\n16333\n16334\n16335\n16336\n16337\n16338\n16339\n16340\n16341\n16342\n16343\n16344\n16345\n16346\n16347\n16348\n16349\n16350\n16351\n16352\n16353\n16354\n16355\n16356\n16357\n16358\n16359\n16360\n16361\n16362\n16363\n16364\n16365\n16366\n16367\n16368\n16369\n16370\n16371\n16372\n16373\n16374\n16375\n16376\n16377\n16378\n16379\n16380\n16381\n16382\n16383\n16384\n16385\n16386\n16387\n16388\n16389\n16390\n16391\n16392\n16393\n16394\n16395\n16396\n16397\n16398\n16399\n16400\n16401\n16402\n16403\n16404\n16405\n16406\n16407\n16408\n16409\n16410\n16411\n16412\n16413\n16414\n16415\n16416\n16417\n16418\n16419\n16420\n16421\n16422\n16423\n16424\n16425\n16426\n16427\n16428\n16429\n16430\n16431\n16432\n16433\n16434\n16435\n16436\n16437\n16438\n16439\n16440\n16441\n16442\n16443\n16444\n16445\n16446\n16447\n16448\n16449\n16450\n16451\n16452\n16453\n16454\n16455\n16456\n16457\n16458\n16459\n16460\n16461\n16462\n16463\n16464\n16465\n16466\n16467\n16468\n16469\n16470\n16471\n16472\n16473\n16474\n16475\n16476\n16477\n16478\n16479\n16480\n16481\n16482\n16483\n16484\n16485\n16486\n16487\n16488\n16489\n16490\n16491\n16492\n16493\n16494\n16495\n16496\n16497\n16498\n16499\n16500\n16501\n16502\n16503\n16504\n16505\n16506\n16507\n16508\n16509\n16510\n16511\n16512\n16513\n16514\n16515\n16516\n16517\n16518\n16519\n16520\n16521\n16522\n16523\n16524\n16525\n16526\n16527\n16528\n16529\n16530\n16531\n16532\n16533\n16534\n16535\n16536\n16537\n16538\n16539\n16540\n16541\n16542\n16543\n16544\n16545\n16546\n16547\n16548\n16549\n16550\n16551\n16552\n16553\n16554\n16555\n16556\n16557\n16558\n16559\n16560\n16561\n16562\n16563\n16564\n16565\n16566\n16567\n16568\n16569\n16570\n16571\n16572\n16573\n16574\n16575\n16576\n16577\n16578\n16579\n16580\n16581\n16582\n16583\n16584\n16585\n16586\n16587\n16588\n16589\n16590\n16591\n16592\n16593\n16594\n16595\n16596\n16597\n16598\n16599\n16600\n16601\n16602\n16603\n16604\n16605\n16606\n16607\n16608\n16609\n16610\n16611\n16612\n16613\n16614\n16615\n16616\n16617\n16618\n16619\n16620\n16621\n16622\n16623\n16624\n16625\n16626\n16627\n16628\n16629\n16630\n16631\n16632\n16633\n16634\n16635\n16636\n16637\n16638\n16639\n16640\n16641\n16642\n16643\n16644\n16645\n16646\n16647\n16648\n16649\n16650\n16651\n16652\n16653\n16654\n16655\n16656\n16657\n16658\n16659\n16660\n16661\n16662\n16663\n16664\n16665\n16666\n16667\n16668\n16669\n16670\n16671\n16672\n16673\n16674\n16675\n16676\n16677\n16678\n16679\n16680\n16681\n16682\n16683\n16684\n16685\n16686\n16687\n16688\n16689\n16690\n16691\n16692\n16693\n16694\n16695\n16696\n16697\n16698\n16699\n16700\n16701\n16702\n16703\n16704\n16705\n16706\n16707\n16708\n16709\n16710\n16711\n16712\n16713\n16714\n16715\n16716\n16717\n16718\n16719\n16720\n16721\n16722\n16723\n16724\n16725\n16726\n16727\n16728\n16729\n16730\n16731\n16732\n16733\n16734\n16735\n16736\n16737\n16738\n16739\n16740\n16741\n16742\n16743\n16744\n16745\n16746\n16747\n16748\n16749\n16750\n16751\n16752\n16753\n16754\n16755\n16756\n16757\n16758\n16759\n16760\n16761\n16762\n16763\n16764\n16765\n16766\n16767\n16768\n16769\n16770\n16771\n16772\n16773\n16774\n16775\n16776\n16777\n16778\n16779\n16780\n16781\n16782\n16783\n16784\n16785\n16786\n16787\n16788\n16789\n16790\n16791\n16792\n16793\n16794\n16795\n16796\n16797\n16798\n16799\n16800\n16801\n16802\n16803\n16804\n16805\n16806\n16807\n16808\n16809\n16810\n16811\n16812\n16813\n16814\n16815\n16816\n16817\n16818\n16819\n16820\n16821\n16822\n16823\n16824\n16825\n16826\n16827\n16828\n16829\n16830\n16831\n16832\n16833\n16834\n16835\n16836\n16837\n16838\n16839\n16840\n16841\n16842\n16843\n16844\n16845\n16846\n16847\n16848\n16849\n16850\n16851\n16852\n16853\n16854\n16855\n16856\n16857\n16858\n16859\n16860\n16861\n16862\n16863\n16864\n16865\n16866\n16867\n16868\n16869\n16870\n16871\n16872\n16873\n16874\n16875\n16876\n16877\n16878\n16879\n16880\n16881\n16882\n16883\n16884\n16885\n16886\n16887\n16888\n16889\n16890\n16891\n16892\n16893\n16894\n16895\n16896\n16897\n16898\n16899\n16900\n16901\n16902\n16903\n16904\n16905\n16906\n16907\n16908\n16909\n16910\n16911\n16912\n16913\n16914\n16915\n16916\n16917\n16918\n16919\n16920\n16921\n16922\n16923\n16924\n16925\n16926\n16927\n16928\n16929\n16930\n16931\n16932\n16933\n16934\n16935\n16936\n16937\n16938\n16939\n16940\n16941\n16942\n16943\n16944\n16945\n16946\n16947\n16948\n16949\n16950\n16951\n16952\n16953\n16954\n16955\n16956\n16957\n16958\n16959\n16960\n16961\n16962\n16963\n16964\n16965\n16966\n16967\n16968\n16969\n16970\n16971\n16972\n16973\n16974\n16975\n16976\n16977\n16978\n16979\n16980\n16981\n16982\n16983\n16984\n16985\n16986\n16987\n16988\n16989\n16990\n16991\n16992\n16993\n16994\n16995\n16996\n16997\n16998\n16999\n17000\n17001\n17002\n17003\n17004\n17005\n17006\n17007\n17008\n17009\n17010\n17011\n17012\n17013\n17014\n17015\n17016\n17017\n17018\n17019\n17020\n17021\n17022\n17023\n17024\n17025\n17026\n17027\n17028\n17029\n17030\n17031\n17032\n17033\n17034\n17035\n17036\n17037\n17038\n17039\n17040\n17041\n17042\n17043\n17044\n17045\n17046\n17047\n17048\n17049\n17050\n17051\n17052\n17053\n17054\n17055\n17056\n17057\n17058\n17059\n17060\n17061\n17062\n17063\n17064\n17065\n17066\n17067\n17068\n17069\n17070\n17071\n17072\n17073\n17074\n17075\n17076\n17077\n17078\n17079\n17080\n17081\n17082\n17083\n17084\n17085\n17086\n17087\n17088\n17089\n17090\n17091\n17092\n17093\n17094\n17095\n17096\n17097\n17098\n17099\n17100\n17101\n17102\n17103\n17104\n17105\n17106\n17107\n17108\n17109\n17110\n17111\n17112\n17113\n17114\n17115\n17116\n17117\n17118\n17119\n17120\n17121\n17122\n17123\n17124\n17125\n17126\n17127\n17128\n17129\n17130\n17131\n17132\n17133\n17134\n17135\n17136\n17137\n17138\n17139\n17140\n17141\n17142\n17143\n17144\n17145\n17146\n17147\n17148\n17149\n17150\n17151\n17152\n17153\n17154\n17155\n17156\n17157\n17158\n17159\n17160\n17161\n17162\n17163\n17164\n17165\n17166\n17167\n17168\n17169\n17170\n17171\n17172\n17173\n17174\n17175\n17176\n17177\n17178\n17179\n17180\n17181\n17182\n17183\n17184\n17185\n17186\n17187\n17188\n17189\n17190\n17191\n17192\n17193\n17194\n17195\n17196\n17197\n17198\n17199\n17200\n17201\n17202\n17203\n17204\n17205\n17206\n17207\n17208\n17209\n17210\n17211\n17212\n17213\n17214\n17215\n17216\n17217\n17218\n17219\n17220\n17221\n17222\n17223\n17224\n17225\n17226\n17227\n17228\n17229\n17230\n17231\n17232\n17233\n17234\n17235\n17236\n17237\n17238\n17239\n17240\n17241\n17242\n17243\n17244\n17245\n17246\n17247\n17248\n17249\n17250\n17251\n17252\n17253\n17254\n17255\n17256\n17257\n17258\n17259\n17260\n17261\n17262\n17263\n17264\n17265\n17266\n17267\n17268\n17269\n17270\n17271\n17272\n17273\n17274\n17275\n17276\n17277\n17278\n17279\n17280\n17281\n17282\n17283\n17284\n17285\n17286\n17287\n17288\n17289\n17290\n17291\n17292\n17293\n17294\n17295\n17296\n17297\n17298\n17299\n17300\n17301\n17302\n17303\n17304\n17305\n17306\n17307\n17308\n17309\n17310\n17311\n17312\n17313\n17314\n17315\n17316\n17317\n17318\n17319\n17320\n17321\n17322\n17323\n17324\n17325\n17326\n17327\n17328\n17329\n17330\n17331\n17332\n17333\n17334\n17335\n17336\n17337\n17338\n17339\n17340\n17341\n17342\n17343\n17344\n17345\n17346\n17347\n17348\n17349\n17350\n17351\n17352\n17353\n17354\n17355\n17356\n17357\n17358\n17359\n17360\n17361\n17362\n17363\n17364\n17365\n17366\n17367\n17368\n17369\n17370\n17371\n17372\n17373\n17374\n17375\n17376\n17377\n17378\n17379\n17380\n17381\n17382\n17383\n17384\n17385\n17386\n17387\n17388\n17389\n17390\n17391\n17392\n17393\n17394\n17395\n17396\n17397\n17398\n17399\n17400\n17401\n17402\n17403\n17404\n17405\n17406\n17407\n17408\n17409\n17410\n17411\n17412\n17413\n17414\n17415\n17416\n17417\n17418\n17419\n17420\n17421\n17422\n17423\n17424\n17425\n17426\n17427\n17428\n17429\n17430\n17431\n17432\n17433\n17434\n17435\n17436\n17437\n17438\n17439\n17440\n17441\n17442\n17443\n17444\n17445\n17446\n17447\n17448\n17449\n17450\n17451\n17452\n17453\n17454\n17455\n17456\n17457\n17458\n17459\n17460\n17461\n17462\n17463\n17464\n17465\n17466\n17467\n17468\n17469\n17470\n17471\n17472\n17473\n17474\n17475\n17476\n17477\n17478\n17479\n17480\n17481\n17482\n17483\n17484\n17485\n17486\n17487\n17488\n17489\n17490\n17491\n17492\n17493\n17494\n17495\n17496\n17497\n17498\n17499\n17500\n17501\n17502\n17503\n17504\n17505\n17506\n17507\n17508\n17509\n17510\n17511\n17512\n17513\n17514\n17515\n17516\n17517\n17518\n17519\n17520\n17521\n17522\n17523\n17524\n17525\n17526\n17527\n17528\n17529\n17530\n17531\n17532\n17533\n17534\n17535\n17536\n17537\n17538\n17539\n17540\n17541\n17542\n17543\n17544\n17545\n17546\n17547\n17548\n17549\n17550\n17551\n17552\n17553\n17554\n17555\n17556\n17557\n17558\n17559\n17560\n17561\n17562\n17563\n17564\n17565\n17566\n17567\n17568\n17569\n17570\n17571\n17572\n17573\n17574\n17575\n17576\n17577\n17578\n17579\n17580\n17581\n17582\n17583\n17584\n17585\n17586\n17587\n17588\n17589\n17590\n17591\n17592\n17593\n17594\n17595\n17596\n17597\n17598\n17599\n17600\n17601\n17602\n17603\n17604\n17605\n17606\n17607\n17608\n17609\n17610\n17611\n17612\n17613\n17614\n17615\n17616\n17617\n17618\n17619\n17620\n17621\n17622\n17623\n17624\n17625\n17626\n17627\n17628\n17629\n17630\n17631\n17632\n17633\n17634\n17635\n17636\n17637\n17638\n17639\n17640\n17641\n17642\n17643\n17644\n17645\n17646\n17647\n17648\n17649\n17650\n17651\n17652\n17653\n17654\n17655\n17656\n17657\n17658\n17659\n17660\n17661\n17662\n17663\n17664\n17665\n17666\n17667\n17668\n17669\n17670\n17671\n17672\n17673\n17674\n17675\n17676\n17677\n17678\n17679\n17680\n17681\n17682\n17683\n17684\n17685\n17686\n17687\n17688\n17689\n17690\n17691\n17692\n17693\n17694\n17695\n17696\n17697\n17698\n17699\n17700\n17701\n17702\n17703\n17704\n17705\n17706\n17707\n17708\n17709\n17710\n17711\n17712\n17713\n17714\n17715\n17716\n17717\n17718\n17719\n17720\n17721\n17722\n17723\n17724\n17725\n17726\n17727\n17728\n17729\n17730\n17731\n17732\n17733\n17734\n17735\n17736\n17737\n17738\n17739\n17740\n17741\n17742\n17743\n17744\n17745\n17746\n17747\n17748\n17749\n17750\n17751\n17752\n17753\n17754\n17755\n17756\n17757\n17758\n17759\n17760\n17761\n17762\n17763\n17764\n17765\n17766\n17767\n17768\n17769\n17770\n17771\n17772\n17773\n17774\n17775\n17776\n17777\n17778\n17779\n17780\n17781\n17782\n17783\n17784\n17785\n17786\n17787\n17788\n17789\n17790\n17791\n17792\n17793\n17794\n17795\n17796\n17797\n17798\n17799\n17800\n17801\n17802\n17803\n17804\n17805\n17806\n17807\n17808\n17809\n17810\n17811\n17812\n17813\n17814\n17815\n17816\n17817\n17818\n17819\n17820\n17821\n17822\n17823\n17824\n17825\n17826\n17827\n17828\n17829\n17830\n17831\n17832\n17833\n17834\n17835\n17836\n17837\n17838\n17839\n17840\n17841\n17842\n17843\n17844\n17845\n17846\n17847\n17848\n17849\n17850\n17851\n17852\n17853\n17854\n17855\n17856\n17857\n17858\n17859\n17860\n17861\n17862\n17863\n17864\n17865\n17866\n17867\n17868\n17869\n17870\n17871\n17872\n17873\n17874\n17875\n17876\n17877\n17878\n17879\n17880\n17881\n17882\n17883\n17884\n17885\n17886\n17887\n17888\n17889\n17890\n17891\n17892\n17893\n17894\n17895\n17896\n17897\n17898\n17899\n17900\n17901\n17902\n17903\n17904\n17905\n17906\n17907\n17908\n17909\n17910\n17911\n17912\n17913\n17914\n17915\n17916\n17917\n17918\n17919\n17920\n17921\n17922\n17923\n17924\n17925\n17926\n17927\n17928\n17929\n17930\n17931\n17932\n17933\n17934\n17935\n17936\n17937\n17938\n17939\n17940\n17941\n17942\n17943\n17944\n17945\n17946\n17947\n17948\n17949\n17950\n17951\n17952\n17953\n17954\n17955\n17956\n17957\n17958\n17959\n17960\n17961\n17962\n17963\n17964\n17965\n17966\n17967\n17968\n17969\n17970\n17971\n17972\n17973\n17974\n17975\n17976\n17977\n17978\n17979\n17980\n17981\n17982\n17983\n17984\n17985\n17986\n17987\n17988\n17989\n17990\n17991\n17992\n17993\n17994\n17995\n17996\n17997\n17998\n17999\n18000\n18001\n18002\n18003\n18004\n18005\n18006\n18007\n18008\n18009\n18010\n18011\n18012\n18013\n18014\n18015\n18016\n18017\n18018\n18019\n18020\n18021\n18022\n18023\n18024\n18025\n18026\n18027\n18028\n18029\n18030\n18031\n18032\n18033\n18034\n18035\n18036\n18037\n18038\n18039\n18040\n18041\n18042\n18043\n18044\n18045\n18046\n18047\n18048\n18049\n18050\n18051\n18052\n18053\n18054\n18055\n18056\n18057\n18058\n18059\n18060\n18061\n18062\n18063\n18064\n18065\n18066\n18067\n18068\n18069\n18070\n18071\n18072\n18073\n18074\n18075\n18076\n18077\n18078\n18079\n18080\n18081\n18082\n18083\n18084\n18085\n18086\n18087\n18088\n18089\n18090\n18091\n18092\n18093\n18094\n18095\n18096\n18097\n18098\n18099\n18100\n18101\n18102\n18103\n18104\n18105\n18106\n18107\n18108\n18109\n18110\n18111\n18112\n18113\n18114\n18115\n18116\n18117\n18118\n18119\n18120\n18121\n18122\n18123\n18124\n18125\n18126\n18127\n18128\n18129\n18130\n18131\n18132\n18133\n18134\n18135\n18136\n18137\n18138\n18139\n18140\n18141\n18142\n18143\n18144\n18145\n18146\n18147\n18148\n18149\n18150\n18151\n18152\n18153\n18154\n18155\n18156\n18157\n18158\n18159\n18160\n18161\n18162\n18163\n18164\n18165\n18166\n18167\n18168\n18169\n18170\n18171\n18172\n18173\n18174\n18175\n18176\n18177\n18178\n18179\n18180\n18181\n18182\n18183\n18184\n18185\n18186\n18187\n18188\n18189\n18190\n18191\n18192\n18193\n18194\n18195\n18196\n18197\n18198\n18199\n18200\n18201\n18202\n18203\n18204\n18205\n18206\n18207\n18208\n18209\n18210\n18211\n18212\n18213\n18214\n18215\n18216\n18217\n18218\n18219\n18220\n18221\n18222\n18223\n18224\n18225\n18226\n18227\n18228\n18229\n18230\n18231\n18232\n18233\n18234\n18235\n18236\n18237\n18238\n18239\n18240\n18241\n18242\n18243\n18244\n18245\n18246\n18247\n18248\n18249\n18250\n18251\n18252\n18253\n18254\n18255\n18256\n18257\n18258\n18259\n18260\n18261\n18262\n18263\n18264\n18265\n18266\n18267\n18268\n18269\n18270\n18271\n18272\n18273\n18274\n18275\n18276\n18277\n18278\n18279\n18280\n18281\n18282\n18283\n18284\n18285\n18286\n18287\n18288\n18289\n18290\n18291\n18292\n18293\n18294\n18295\n18296\n18297\n18298\n18299\n18300\n18301\n18302\n18303\n18304\n18305\n18306\n18307\n18308\n18309\n18310\n18311\n18312\n18313\n18314\n18315\n18316\n18317\n18318\n18319\n18320\n18321\n18322\n18323\n18324\n18325\n18326\n18327\n18328\n18329\n18330\n18331\n18332\n18333\n18334\n18335\n18336\n18337\n18338\n18339\n18340\n18341\n18342\n18343\n18344\n18345\n18346\n18347\n18348\n18349\n18350\n18351\n18352\n18353\n18354\n18355\n18356\n18357\n18358\n18359\n18360\n18361\n18362\n18363\n18364\n18365\n18366\n18367\n18368\n18369\n18370\n18371\n18372\n18373\n18374\n18375\n18376\n18377\n18378\n18379\n18380\n18381\n18382\n18383\n18384\n18385\n18386\n18387\n18388\n18389\n18390\n18391\n18392\n18393\n18394\n18395\n18396\n18397\n18398\n18399\n18400\n18401\n18402\n18403\n18404\n18405\n18406\n18407\n18408\n18409\n18410\n18411\n18412\n18413\n18414\n18415\n18416\n18417\n18418\n18419\n18420\n18421\n18422\n18423\n18424\n18425\n18426\n18427\n18428\n18429\n18430\n18431\n18432\n18433\n18434\n18435\n18436\n18437\n18438\n18439\n18440\n18441\n18442\n18443\n18444\n18445\n18446\n18447\n18448\n18449\n18450\n18451\n18452\n18453\n18454\n18455\n18456\n18457\n18458\n18459\n18460\n18461\n18462\n18463\n18464\n18465\n18466\n18467\n18468\n18469\n18470\n18471\n18472\n18473\n18474\n18475\n18476\n18477\n18478\n18479\n18480\n18481\n18482\n18483\n18484\n18485\n18486\n18487\n18488\n18489\n18490\n18491\n18492\n18493\n18494\n18495\n18496\n18497\n18498\n18499\n18500\n18501\n18502\n18503\n18504\n18505\n18506\n18507\n18508\n18509\n18510\n18511\n18512\n18513\n18514\n18515\n18516\n18517\n18518\n18519\n18520\n18521\n18522\n18523\n18524\n18525\n18526\n18527\n18528\n18529\n18530\n18531\n18532\n18533\n18534\n18535\n18536\n18537\n18538\n18539\n18540\n18541\n18542\n18543\n18544\n18545\n18546\n18547\n18548\n18549\n18550\n18551\n18552\n18553\n18554\n18555\n18556\n18557\n18558\n18559\n18560\n18561\n18562\n18563\n18564\n18565\n18566\n18567\n18568\n18569\n18570\n18571\n18572\n18573\n18574\n18575\n18576\n18577\n18578\n18579\n18580\n18581\n18582\n18583\n18584\n18585\n18586\n18587\n18588\n18589\n18590\n18591\n18592\n18593\n18594\n18595\n18596\n18597\n18598\n18599\n18600\n18601\n18602\n18603\n18604\n18605\n18606\n18607\n18608\n18609\n18610\n18611\n18612\n18613\n18614\n18615\n18616\n18617\n18618\n18619\n18620\n18621\n18622\n18623\n18624\n18625\n18626\n18627\n18628\n18629\n18630\n18631\n18632\n18633\n18634\n18635\n18636\n18637\n18638\n18639\n18640\n18641\n18642\n18643\n18644\n18645\n18646\n18647\n18648\n18649\n18650\n18651\n18652\n18653\n18654\n18655\n18656\n18657\n18658\n18659\n18660\n18661\n18662\n18663\n18664\n18665\n18666\n18667\n18668\n18669\n18670\n18671\n18672\n18673\n18674\n18675\n18676\n18677\n18678\n18679\n18680\n18681\n18682\n18683\n18684\n18685\n18686\n18687\n18688\n18689\n18690\n18691\n18692\n18693\n18694\n18695\n18696\n18697\n18698\n18699\n18700\n18701\n18702\n18703\n18704\n18705\n18706\n18707\n18708\n18709\n18710\n18711\n18712\n18713\n18714\n18715\n18716\n18717\n18718\n18719\n18720\n18721\n18722\n18723\n18724\n18725\n18726\n18727\n18728\n18729\n18730\n18731\n18732\n18733\n18734\n18735\n18736\n18737\n18738\n18739\n18740\n18741\n18742\n18743\n18744\n18745\n18746\n18747\n18748\n18749\n18750\n18751\n18752\n18753\n18754\n18755\n18756\n18757\n18758\n18759\n18760\n18761\n18762\n18763\n18764\n18765\n18766\n18767\n18768\n18769\n18770\n18771\n18772\n18773\n18774\n18775\n18776\n18777\n18778\n18779\n18780\n18781\n18782\n18783\n18784\n18785\n18786\n18787\n18788\n18789\n18790\n18791\n18792\n18793\n18794\n18795\n18796\n18797\n18798\n18799\n18800\n18801\n18802\n18803\n18804\n18805\n18806\n18807\n18808\n18809\n18810\n18811\n18812\n18813\n18814\n18815\n18816\n18817\n18818\n18819\n18820\n18821\n18822\n18823\n18824\n18825\n18826\n18827\n18828\n18829\n18830\n18831\n18832\n18833\n18834\n18835\n18836\n18837\n18838\n18839\n18840\n18841\n18842\n18843\n18844\n18845\n18846\n18847\n18848\n18849\n18850\n18851\n18852\n18853\n18854\n18855\n18856\n18857\n18858\n18859\n18860\n18861\n18862\n18863\n18864\n18865\n18866\n18867\n18868\n18869\n18870\n18871\n18872\n18873\n18874\n18875\n18876\n18877\n18878\n18879\n18880\n18881\n18882\n18883\n18884\n18885\n18886\n18887\n18888\n18889\n18890\n18891\n18892\n18893\n18894\n18895\n18896\n18897\n18898\n18899\n18900\n18901\n18902\n18903\n18904\n18905\n18906\n18907\n18908\n18909\n18910\n18911\n18912\n18913\n18914\n18915\n18916\n18917\n18918\n18919\n18920\n18921\n18922\n18923\n18924\n18925\n18926\n18927\n18928\n18929\n18930\n18931\n18932\n18933\n18934\n18935\n18936\n18937\n18938\n18939\n18940\n18941\n18942\n18943\n18944\n18945\n18946\n18947\n18948\n18949\n18950\n18951\n18952\n18953\n18954\n18955\n18956\n18957\n18958\n18959\n18960\n18961\n18962\n18963\n18964\n18965\n18966\n18967\n18968\n18969\n18970\n18971\n18972\n18973\n18974\n18975\n18976\n18977\n18978\n18979\n18980\n18981\n18982\n18983\n18984\n18985\n18986\n18987\n18988\n18989\n18990\n18991\n18992\n18993\n18994\n18995\n18996\n18997\n18998\n18999\n19000\n19001\n19002\n19003\n19004\n19005\n19006\n19007\n19008\n19009\n19010\n19011\n19012\n19013\n19014\n19015\n19016\n19017\n19018\n19019\n19020\n19021\n19022\n19023\n19024\n19025\n19026\n19027\n19028\n19029\n19030\n19031\n19032\n19033\n19034\n19035\n19036\n19037\n19038\n19039\n19040\n19041\n19042\n19043\n19044\n19045\n19046\n19047\n19048\n19049\n19050\n19051\n19052\n19053\n19054\n19055\n19056\n19057\n19058\n19059\n19060\n19061\n19062\n19063\n19064\n19065\n19066\n19067\n19068\n19069\n19070\n19071\n19072\n19073\n19074\n19075\n19076\n19077\n19078\n19079\n19080\n19081\n19082\n19083\n19084\n19085\n19086\n19087\n19088\n19089\n19090\n19091\n19092\n19093\n19094\n19095\n19096\n19097\n19098\n19099\n19100\n19101\n19102\n19103\n19104\n19105\n19106\n19107\n19108\n19109\n19110\n19111\n19112\n19113\n19114\n19115\n19116\n19117\n19118\n19119\n19120\n19121\n19122\n19123\n19124\n19125\n19126\n19127\n19128\n19129\n19130\n19131\n19132\n19133\n19134\n19135\n19136\n19137\n19138\n19139\n19140\n19141\n19142\n19143\n19144\n19145\n19146\n19147\n19148\n19149\n19150\n19151\n19152\n19153\n19154\n19155\n19156\n19157\n19158\n19159\n19160\n19161\n19162\n19163\n19164\n19165\n19166\n19167\n19168\n19169\n19170\n19171\n19172\n19173\n19174\n19175\n19176\n19177\n19178\n19179\n19180\n19181\n19182\n19183\n19184\n19185\n19186\n19187\n19188\n19189\n19190\n19191\n19192\n19193\n19194\n19195\n19196\n19197\n19198\n19199\n19200\n19201\n19202\n19203\n19204\n19205\n19206\n19207\n19208\n19209\n19210\n19211\n19212\n19213\n19214\n19215\n19216\n19217\n19218\n19219\n19220\n19221\n19222\n19223\n19224\n19225\n19226\n19227\n19228\n19229\n19230\n19231\n19232\n19233\n19234\n19235\n19236\n19237\n19238\n19239\n19240\n19241\n19242\n19243\n19244\n19245\n19246\n19247\n19248\n19249\n19250\n19251\n19252\n19253\n19254\n19255\n19256\n19257\n19258\n19259\n19260\n19261\n19262\n19263\n19264\n19265\n19266\n19267\n19268\n19269\n19270\n19271\n19272\n19273\n19274\n19275\n19276\n19277\n19278\n19279\n19280\n19281\n19282\n19283\n19284\n19285\n19286\n19287\n19288\n19289\n19290\n19291\n19292\n19293\n19294\n19295\n19296\n19297\n19298\n19299\n19300\n19301\n19302\n19303\n19304\n19305\n19306\n19307\n19308\n19309\n19310\n19311\n19312\n19313\n19314\n19315\n19316\n19317\n19318\n19319\n19320\n19321\n19322\n19323\n19324\n19325\n19326\n19327\n19328\n19329\n19330\n19331\n19332\n19333\n19334\n19335\n19336\n19337\n19338\n19339\n19340\n19341\n19342\n19343\n19344\n19345\n19346\n19347\n19348\n19349\n19350\n19351\n19352\n19353\n19354\n19355\n19356\n19357\n19358\n19359\n19360\n19361\n19362\n19363\n19364\n19365\n19366\n19367\n19368\n19369\n19370\n19371\n19372\n19373\n19374\n19375\n19376\n19377\n19378\n19379\n19380\n19381\n19382\n19383\n19384\n19385\n19386\n19387\n19388\n19389\n19390\n19391\n19392\n19393\n19394\n19395\n19396\n19397\n19398\n19399\n19400\n19401\n19402\n19403\n19404\n19405\n19406\n19407\n19408\n19409\n19410\n19411\n19412\n19413\n19414\n19415\n19416\n19417\n19418\n19419\n19420\n19421\n19422\n19423\n19424\n19425\n19426\n19427\n19428\n19429\n19430\n19431\n19432\n19433\n19434\n19435\n19436\n19437\n19438\n19439\n19440\n19441\n19442\n19443\n19444\n19445\n19446\n19447\n19448\n19449\n19450\n19451\n19452\n19453\n19454\n19455\n19456\n19457\n19458\n19459\n19460\n19461\n19462\n19463\n19464\n19465\n19466\n19467\n19468\n19469\n19470\n19471\n19472\n19473\n19474\n19475\n19476\n19477\n19478\n19479\n19480\n19481\n19482\n19483\n19484\n19485\n19486\n19487\n19488\n19489\n19490\n19491\n19492\n19493\n19494\n19495\n19496\n19497\n19498\n19499\n19500\n19501\n19502\n19503\n19504\n19505\n19506\n19507\n19508\n19509\n19510\n19511\n19512\n19513\n19514\n19515\n19516\n19517\n19518\n19519\n19520\n19521\n19522\n19523\n19524\n19525\n19526\n19527\n19528\n19529\n19530\n19531\n19532\n19533\n19534\n19535\n19536\n19537\n19538\n19539\n19540\n19541\n19542\n19543\n19544\n19545\n19546\n19547\n19548\n19549\n19550\n19551\n19552\n19553\n19554\n19555\n19556\n19557\n19558\n19559\n19560\n19561\n19562\n19563\n19564\n19565\n19566\n19567\n19568\n19569\n19570\n19571\n19572\n19573\n19574\n19575\n19576\n19577\n19578\n19579\n19580\n19581\n19582\n19583\n19584\n19585\n19586\n19587\n19588\n19589\n19590\n19591\n19592\n19593\n19594\n19595\n19596\n19597\n19598\n19599\n19600\n19601\n19602\n19603\n19604\n19605\n19606\n19607\n19608\n19609\n19610\n19611\n19612\n19613\n19614\n19615\n19616\n19617\n19618\n19619\n19620\n19621\n19622\n19623\n19624\n19625\n19626\n19627\n19628\n19629\n19630\n19631\n19632\n19633\n19634\n19635\n19636\n19637\n19638\n19639\n19640\n19641\n19642\n19643\n19644\n19645\n19646\n19647\n19648\n19649\n19650\n19651\n19652\n19653\n19654\n19655\n19656\n19657\n19658\n19659\n19660\n19661\n19662\n19663\n19664\n19665\n19666\n19667\n19668\n19669\n19670\n19671\n19672\n19673\n19674\n19675\n19676\n19677\n19678\n19679\n19680\n19681\n19682\n19683\n19684\n19685\n19686\n19687\n19688\n19689\n19690\n19691\n19692\n19693\n19694\n19695\n19696\n19697\n19698\n19699\n19700\n19701\n19702\n19703\n19704\n19705\n19706\n19707\n19708\n19709\n19710\n19711\n19712\n19713\n19714\n19715\n19716\n19717\n19718\n19719\n19720\n19721\n19722\n19723\n19724\n19725\n19726\n19727\n19728\n19729\n19730\n19731\n19732\n19733\n19734\n19735\n19736\n19737\n19738\n19739\n19740\n19741\n19742\n19743\n19744\n19745\n19746\n19747\n19748\n19749\n19750\n19751\n19752\n19753\n19754\n19755\n19756\n19757\n19758\n19759\n19760\n19761\n19762\n19763\n19764\n19765\n19766\n19767\n19768\n19769\n19770\n19771\n19772\n19773\n19774\n19775\n19776\n19777\n19778\n19779\n19780\n19781\n19782\n19783\n19784\n19785\n19786\n19787\n19788\n19789\n19790\n19791\n19792\n19793\n19794\n19795\n19796\n19797\n19798\n19799\n19800\n19801\n19802\n19803\n19804\n19805\n19806\n19807\n19808\n19809\n19810\n19811\n19812\n19813\n19814\n19815\n19816\n19817\n19818\n19819\n19820\n19821\n19822\n19823\n19824\n19825\n19826\n19827\n19828\n19829\n19830\n19831\n19832\n19833\n19834\n19835\n19836\n19837\n19838\n19839\n19840\n19841\n19842\n19843\n19844\n19845\n19846\n19847\n19848\n19849\n19850\n19851\n19852\n19853\n19854\n19855\n19856\n19857\n19858\n19859\n19860\n19861\n19862\n19863\n19864\n19865\n19866\n19867\n19868\n19869\n19870\n19871\n19872\n19873\n19874\n19875\n19876\n19877\n19878\n19879\n19880\n19881\n19882\n19883\n19884\n19885\n19886\n19887\n19888\n19889\n19890\n19891\n19892\n19893\n19894\n19895\n19896\n19897\n19898\n19899\n19900\n19901\n19902\n19903\n19904\n19905\n19906\n19907\n19908\n19909\n19910\n19911\n19912\n19913\n19914\n19915\n19916\n19917\n19918\n19919\n19920\n19921\n19922\n19923\n19924\n19925\n19926\n19927\n19928\n19929\n19930\n19931\n19932\n19933\n19934\n19935\n19936\n19937\n19938\n19939\n19940\n19941\n19942\n19943\n19944\n19945\n19946\n19947\n19948\n19949\n19950\n19951\n19952\n19953\n19954\n19955\n19956\n19957\n19958\n19959\n19960\n19961\n19962\n19963\n19964\n19965\n19966\n19967\n19968\n19969\n19970\n19971\n19972\n19973\n19974\n19975\n19976\n19977\n19978\n19979\n19980\n19981\n19982\n19983\n19984\n19985\n19986\n19987\n19988\n19989\n19990\n19991\n19992\n19993\n19994\n19995\n19996\n19997\n19998\n19999\n20000\n20001\n20002\n20003\n20004\n20005\n20006\n20007\n20008\n20009\n20010\n20011\n20012\n20013\n20014\n20015\n20016\n20017\n20018\n20019\n20020\n20021\n20022\n20023\n20024\n20025\n20026\n20027\n20028\n20029\n20030\n20031\n20032\n20033\n20034\n20035\n20036\n20037\n20038\n20039\n20040\n20041\n20042\n20043\n20044\n20045\n20046\n20047\n20048\n20049\n20050\n20051\n20052\n20053\n20054\n20055\n20056\n20057\n20058\n20059\n20060\n20061\n20062\n20063\n20064\n20065\n20066\n20067\n20068\n20069\n20070\n20071\n20072\n20073\n20074\n20075\n20076\n20077\n20078\n20079\n20080\n20081\n20082\n20083\n20084\n20085\n20086\n20087\n20088\n20089\n20090\n20091\n20092\n20093\n20094\n20095\n20096\n20097\n20098\n20099\n20100\n20101\n20102\n20103\n20104\n20105\n20106\n20107\n20108\n20109\n20110\n20111\n20112\n20113\n20114\n20115\n20116\n20117\n20118\n20119\n20120\n20121\n20122\n20123\n20124\n20125\n20126\n20127\n20128\n20129\n20130\n20131\n20132\n20133\n20134\n20135\n20136\n20137\n20138\n20139\n20140\n20141\n20142\n20143\n20144\n20145\n20146\n20147\n20148\n20149\n20150\n20151\n20152\n20153\n20154\n20155\n20156\n20157\n20158\n20159\n20160\n20161\n20162\n20163\n20164\n20165\n20166\n20167\n20168\n20169\n20170\n20171\n20172\n20173\n20174\n20175\n20176\n20177\n20178\n20179\n20180\n20181\n20182\n20183\n20184\n20185\n20186\n20187\n20188\n20189\n20190\n20191\n20192\n20193\n20194\n20195\n20196\n20197\n20198\n20199\n20200\n20201\n20202\n20203\n20204\n20205\n20206\n20207\n20208\n20209\n20210\n20211\n20212\n20213\n20214\n20215\n20216\n20217\n20218\n20219\n20220\n20221\n20222\n20223\n20224\n20225\n20226\n20227\n20228\n20229\n20230\n20231\n20232\n20233\n20234\n20235\n20236\n20237\n20238\n20239\n20240\n20241\n20242\n20243\n20244\n20245\n20246\n20247\n20248\n20249\n20250\n20251\n20252\n20253\n20254\n20255\n20256\n20257\n20258\n20259\n20260\n20261\n20262\n20263\n20264\n20265\n20266\n20267\n20268\n20269\n20270\n20271\n20272\n20273\n20274\n20275\n20276\n20277\n20278\n20279\n20280\n20281\n20282\n20283\n20284\n20285\n20286\n20287\n20288\n20289\n20290\n20291\n20292\n20293\n20294\n20295\n20296\n20297\n20298\n20299\n20300\n20301\n20302\n20303\n20304\n20305\n20306\n20307\n20308\n20309\n20310\n20311\n20312\n20313\n20314\n20315\n20316\n20317\n20318\n20319\n20320\n20321\n20322\n20323\n20324\n20325\n20326\n20327\n20328\n20329\n20330\n20331\n20332\n20333\n20334\n20335\n20336\n20337\n20338\n20339\n20340\n20341\n20342\n20343\n20344\n20345\n20346\n20347\n20348\n20349\n20350\n20351\n20352\n20353\n20354\n20355\n20356\n20357\n20358\n20359\n20360\n20361\n20362\n20363\n20364\n20365\n20366\n20367\n20368\n20369\n20370\n20371\n20372\n20373\n20374\n20375\n20376\n20377\n20378\n20379\n20380\n20381\n20382\n20383\n20384\n20385\n20386\n20387\n20388\n20389\n20390\n20391\n20392\n20393\n20394\n20395\n20396\n20397\n20398\n20399\n20400\n20401\n20402\n20403\n20404\n20405\n20406\n20407\n20408\n20409\n20410\n20411\n20412\n20413\n20414\n20415\n20416\n20417\n20418\n20419\n20420\n20421\n20422\n20423\n20424\n20425\n20426\n20427\n20428\n20429\n20430\n20431\n20432\n20433\n20434\n20435\n20436\n20437\n20438\n20439\n20440\n20441\n20442\n20443\n20444\n20445\n20446\n20447\n20448\n20449\n20450\n20451\n20452\n20453\n20454\n20455\n20456\n20457\n20458\n20459\n20460\n20461\n20462\n20463\n20464\n20465\n20466\n20467\n20468\n20469\n20470\n20471\n20472\n20473\n20474\n20475\n20476\n20477\n20478\n20479\n20480\n20481\n20482\n20483\n20484\n20485\n20486\n20487\n20488\n20489\n20490\n20491\n20492\n20493\n20494\n20495\n20496\n20497\n20498\n20499\n20500\n20501\n20502\n20503\n20504\n20505\n20506\n20507\n20508\n20509\n20510\n20511\n20512\n20513\n20514\n20515\n20516\n20517\n20518\n20519\n20520\n20521\n20522\n20523\n20524\n20525\n20526\n20527\n20528\n20529\n20530\n20531\n20532\n20533\n20534\n20535\n20536\n20537\n20538\n20539\n20540\n20541\n20542\n20543\n20544\n20545\n20546\n20547\n20548\n20549\n20550\n20551\n20552\n20553\n20554\n20555\n20556\n20557\n20558\n20559\n20560\n20561\n20562\n20563\n20564\n20565\n20566\n20567\n20568\n20569\n20570\n20571\n20572\n20573\n20574\n20575\n20576\n20577\n20578\n20579\n20580\n20581\n20582\n20583\n20584\n20585\n20586\n20587\n20588\n20589\n20590\n20591\n20592\n20593\n20594\n20595\n20596\n20597\n20598\n20599\n20600\n20601\n20602\n20603\n20604\n20605\n20606\n20607\n20608\n20609\n20610\n20611\n20612\n20613\n20614\n20615\n20616\n20617\n20618\n20619\n20620\n20621\n20622\n20623\n20624\n20625\n20626\n20627\n20628\n20629\n20630\n20631\n20632\n20633\n20634\n20635\n20636\n20637\n20638\n20639\n20640\n20641\n20642\n20643\n20644\n20645\n20646\n20647\n20648\n20649\n20650\n20651\n20652\n20653\n20654\n20655\n20656\n20657\n20658\n20659\n20660\n20661\n20662\n20663\n20664\n20665\n20666\n20667\n20668\n20669\n20670\n20671\n20672\n20673\n20674\n20675\n20676\n20677\n20678\n20679\n20680\n20681\n20682\n20683\n20684\n20685\n20686\n20687\n20688\n20689\n20690\n20691\n20692\n20693\n20694\n20695\n20696\n20697\n20698\n20699\n20700\n20701\n20702\n20703\n20704\n20705\n20706\n20707\n20708\n20709\n20710\n20711\n20712\n20713\n20714\n20715\n20716\n20717\n20718\n20719\n20720\n20721\n20722\n20723\n20724\n20725\n20726\n20727\n20728\n20729\n20730\n20731\n20732\n20733\n20734\n20735\n20736\n20737\n20738\n20739\n20740\n20741\n20742\n20743\n20744\n20745\n20746\n20747\n20748\n20749\n20750\n20751\n20752\n20753\n20754\n20755\n20756\n20757\n20758\n20759\n20760\n20761\n20762\n20763\n20764\n20765\n20766\n20767\n20768\n20769\n20770\n20771\n20772\n20773\n20774\n20775\n20776\n20777\n20778\n20779\n20780\n20781\n20782\n20783\n20784\n20785\n20786\n20787\n20788\n20789\n20790\n20791\n20792\n20793\n20794\n20795\n20796\n20797\n20798\n20799\n20800\n20801\n20802\n20803\n20804\n20805\n20806\n20807\n20808\n20809\n20810\n20811\n20812\n20813\n20814\n20815\n20816\n20817\n20818\n20819\n20820\n20821\n20822\n20823\n20824\n20825\n20826\n20827\n20828\n20829\n20830\n20831\n20832\n20833\n20834\n20835\n20836\n20837\n20838\n20839\n20840\n20841\n20842\n20843\n20844\n20845\n20846\n20847\n20848\n20849\n20850\n20851\n20852\n20853\n20854\n20855\n20856\n20857\n20858\n20859\n20860\n20861\n20862\n20863\n20864\n20865\n20866\n20867\n20868\n20869\n20870\n20871\n20872\n20873\n20874\n20875\n20876\n20877\n20878\n20879\n20880\n20881\n20882\n20883\n20884\n20885\n20886\n20887\n20888\n20889\n20890\n20891\n20892\n20893\n20894\n20895\n20896\n20897\n20898\n20899\n20900\n20901\n20902\n20903\n20904\n20905\n20906\n20907\n20908\n20909\n20910\n20911\n20912\n20913\n20914\n20915\n20916\n20917\n20918\n20919\n20920\n20921\n20922\n20923\n20924\n20925\n20926\n20927\n20928\n20929\n20930\n20931\n20932\n20933\n20934\n20935\n20936\n20937\n20938\n20939\n20940\n20941\n20942\n20943\n20944\n20945\n20946\n20947\n20948\n20949\n20950\n20951\n20952\n20953\n20954\n20955\n20956\n20957\n20958\n20959\n20960\n20961\n20962\n20963\n20964\n20965\n20966\n20967\n20968\n20969\n20970\n20971\n20972\n20973\n20974\n20975\n20976\n20977\n20978\n20979\n20980\n20981\n20982\n20983\n20984\n20985\n20986\n20987\n20988\n20989\n20990\n20991\n20992\n20993\n20994\n20995\n20996\n20997\n20998\n20999\n21000\n21001\n21002\n21003\n21004\n21005\n21006\n21007\n21008\n21009\n21010\n21011\n21012\n21013\n21014\n21015\n21016\n21017\n21018\n21019\n21020\n21021\n21022\n21023\n21024\n21025\n21026\n21027\n21028\n21029\n21030\n21031\n21032\n21033\n21034\n21035\n21036\n21037\n21038\n21039\n21040\n21041\n21042\n21043\n21044\n21045\n21046\n21047\n21048\n21049\n21050\n21051\n21052\n21053\n21054\n21055\n21056\n21057\n21058\n21059\n21060\n21061\n21062\n21063\n21064\n21065\n21066\n21067\n21068\n21069\n21070\n21071\n21072\n21073\n21074\n21075\n21076\n21077\n21078\n21079\n21080\n21081\n21082\n21083\n21084\n21085\n21086\n21087\n21088\n21089\n21090\n21091\n21092\n21093\n21094\n21095\n21096\n21097\n21098\n21099\n21100\n21101\n21102\n21103\n21104\n21105\n21106\n21107\n21108\n21109\n21110\n21111\n21112\n21113\n21114\n21115\n21116\n21117\n21118\n21119\n21120\n21121\n21122\n21123\n21124\n21125\n21126\n21127\n21128\n21129\n21130\n21131\n21132\n21133\n21134\n21135\n21136\n21137\n21138\n21139\n21140\n21141\n21142\n21143\n21144\n21145\n21146\n21147\n21148\n21149\n21150\n21151\n21152\n21153\n21154\n21155\n21156\n21157\n21158\n21159\n21160\n21161\n21162\n21163\n21164\n21165\n21166\n21167\n21168\n21169\n21170\n21171\n21172\n21173\n21174\n21175\n21176\n21177\n21178\n21179\n21180\n21181\n21182\n21183\n21184\n21185\n21186\n21187\n21188\n21189\n21190\n21191\n21192\n21193\n21194\n21195\n21196\n21197\n21198\n21199\n21200\n21201\n21202\n21203\n21204\n21205\n21206\n21207\n21208\n21209\n21210\n21211\n21212\n21213\n21214\n21215\n21216\n21217\n21218\n21219\n21220\n21221\n21222\n21223\n21224\n21225\n21226\n21227\n21228\n21229\n21230\n21231\n21232\n21233\n21234\n21235\n21236\n21237\n21238\n21239\n21240\n21241\n21242\n21243\n21244\n21245\n21246\n21247\n21248\n21249\n21250\n21251\n21252\n21253\n21254\n21255\n21256\n21257\n21258\n21259\n21260\n21261\n21262\n21263\n21264\n21265\n21266\n21267\n21268\n21269\n21270\n21271\n21272\n21273\n21274\n21275\n21276\n21277\n21278\n21279\n21280\n21281\n21282\n21283\n21284\n21285\n21286\n21287\n21288\n21289\n21290\n21291\n21292\n21293\n21294\n21295\n21296\n21297\n21298\n21299\n21300\n21301\n21302\n21303\n21304\n21305\n21306\n21307\n21308\n21309\n21310\n21311\n21312\n21313\n21314\n21315\n21316\n21317\n21318\n21319\n21320\n21321\n21322\n21323\n21324\n21325\n21326\n21327\n21328\n21329\n21330\n21331\n21332\n21333\n21334\n21335\n21336\n21337\n21338\n21339\n21340\n21341\n21342\n21343\n21344\n21345\n21346\n21347\n21348\n21349\n21350\n21351\n21352\n21353\n21354\n21355\n21356\n21357\n21358\n21359\n21360\n21361\n21362\n21363\n21364\n21365\n21366\n21367\n21368\n21369\n21370\n21371\n21372\n21373\n21374\n21375\n21376\n21377\n21378\n21379\n21380\n21381\n21382\n21383\n21384\n21385\n21386\n21387\n21388\n21389\n21390\n21391\n21392\n21393\n21394\n21395\n21396\n21397\n21398\n21399\n21400\n21401\n21402\n21403\n21404\n21405\n21406\n21407\n21408\n21409\n21410\n21411\n21412\n21413\n21414\n21415\n21416\n21417\n21418\n21419\n21420\n21421\n21422\n21423\n21424\n21425\n21426\n21427\n21428\n21429\n21430\n21431\n21432\n21433\n21434\n21435\n21436\n21437\n21438\n21439\n21440\n21441\n21442\n21443\n21444\n21445\n21446\n21447\n21448\n21449\n21450\n21451\n21452\n21453\n21454\n21455\n21456\n21457\n21458\n21459\n21460\n21461\n21462\n21463\n21464\n21465\n21466\n21467\n21468\n21469\n21470\n21471\n21472\n21473\n21474\n21475\n21476\n21477\n21478\n21479\n21480\n21481\n21482\n21483\n21484\n21485\n21486\n21487\n21488\n21489\n21490\n21491\n21492\n21493\n21494\n21495\n21496\n21497\n21498\n21499\n21500\n21501\n21502\n21503\n21504\n21505\n21506\n21507\n21508\n21509\n21510\n21511\n21512\n21513\n21514\n21515\n21516\n21517\n21518\n21519\n21520\n21521\n21522\n21523\n21524\n21525\n21526\n21527\n21528\n21529\n21530\n21531\n21532\n21533\n21534\n21535\n21536\n21537\n21538\n21539\n21540\n21541\n21542\n21543\n21544\n21545\n21546\n21547\n21548\n21549\n21550\n21551\n21552\n21553\n21554\n21555\n21556\n21557\n21558\n21559\n21560\n21561\n21562\n21563\n21564\n21565\n21566\n21567\n21568\n21569\n21570\n21571\n21572\n21573\n21574\n21575\n21576\n21577\n21578\n21579\n21580\n21581\n21582\n21583\n21584\n21585\n21586\n21587\n21588\n21589\n21590\n21591\n21592\n21593\n21594\n21595\n21596\n21597\n21598\n21599\n21600\n21601\n21602\n21603\n21604\n21605\n21606\n21607\n21608\n21609\n21610\n21611\n21612\n21613\n21614\n21615\n21616\n21617\n21618\n21619\n21620\n21621\n21622\n21623\n21624\n21625\n21626\n21627\n21628\n21629\n21630\n21631\n21632\n21633\n21634\n21635\n21636\n21637\n21638\n21639\n21640\n21641\n21642\n21643\n21644\n21645\n21646\n21647\n21648\n21649\n21650\n21651\n21652\n21653\n21654\n21655\n21656\n21657\n21658\n21659\n21660\n21661\n21662\n21663\n21664\n21665\n21666\n21667\n21668\n21669\n21670\n21671\n21672\n21673\n21674\n21675\n21676\n21677\n21678\n21679\n21680\n21681\n21682\n21683\n21684\n21685\n21686\n21687\n21688\n21689\n21690\n21691\n21692\n21693\n21694\n21695\n21696\n21697\n21698\n21699\n21700\n21701\n21702\n21703\n21704\n21705\n21706\n21707\n21708\n21709\n21710\n21711\n21712\n21713\n21714\n21715\n21716\n21717\n21718\n21719\n21720\n21721\n21722\n21723\n21724\n21725\n21726\n21727\n21728\n21729\n21730\n21731\n21732\n21733\n21734\n21735\n21736\n21737\n21738\n21739\n21740\n21741\n21742\n21743\n21744\n21745\n21746\n21747\n21748\n21749\n21750\n21751\n21752\n21753\n21754\n21755\n21756\n21757\n21758\n21759\n21760\n21761\n21762\n21763\n21764\n21765\n21766\n21767\n21768\n21769\n21770\n21771\n21772\n21773\n21774\n21775\n21776\n21777\n21778\n21779\n21780\n21781\n21782\n21783\n21784\n21785\n21786\n21787\n21788\n21789\n21790\n21791\n21792\n21793\n21794\n21795\n21796\n21797\n21798\n21799\n21800\n21801\n21802\n21803\n21804\n21805\n21806\n21807\n21808\n21809\n21810\n21811\n21812\n21813\n21814\n21815\n21816\n21817\n21818\n21819\n21820\n21821\n21822\n21823\n21824\n21825\n21826\n21827\n21828\n21829\n21830\n21831\n21832\n21833\n21834\n21835\n21836\n21837\n21838\n21839\n21840\n21841\n21842\n21843\n21844\n21845\n21846\n21847\n21848\n21849\n21850\n21851\n21852\n21853\n21854\n21855\n21856\n21857\n21858\n21859\n21860\n21861\n21862\n21863\n21864\n21865\n21866\n21867\n21868\n21869\n21870\n21871\n21872\n21873\n21874\n21875\n21876\n21877\n21878\n21879\n21880\n21881\n21882\n21883\n21884\n21885\n21886\n21887\n21888\n21889\n21890\n21891\n21892\n21893\n21894\n21895\n21896\n21897\n21898\n21899\n21900\n21901\n21902\n21903\n21904\n21905\n21906\n21907\n21908\n21909\n21910\n21911\n21912\n21913\n21914\n21915\n21916\n21917\n21918\n21919\n21920\n21921\n21922\n21923\n21924\n21925\n21926\n21927\n21928\n21929\n21930\n21931\n21932\n21933\n21934\n21935\n21936\n21937\n21938\n21939\n21940\n21941\n21942\n21943\n21944\n21945\n21946\n21947\n21948\n21949\n21950\n21951\n21952\n21953\n21954\n21955\n21956\n21957\n21958\n21959\n21960\n21961\n21962\n21963\n21964\n21965\n21966\n21967\n21968\n21969\n21970\n21971\n21972\n21973\n21974\n21975\n21976\n21977\n21978\n21979\n21980\n21981\n21982\n21983\n21984\n21985\n21986\n21987\n21988\n21989\n21990\n21991\n21992\n21993\n21994\n21995\n21996\n21997\n21998\n21999\n22000\n22001\n22002\n22003\n22004\n22005\n22006\n22007\n22008\n22009\n22010\n22011\n22012\n22013\n22014\n22015\n22016\n22017\n22018\n22019\n22020\n22021\n22022\n22023\n22024\n22025\n22026\n22027\n22028\n22029\n22030\n22031\n22032\n22033\n22034\n22035\n22036\n22037\n22038\n22039\n22040\n22041\n22042\n22043\n22044\n22045\n22046\n22047\n22048\n22049\n22050\n22051\n22052\n22053\n22054\n22055\n22056\n22057\n22058\n22059\n22060\n22061\n22062\n22063\n22064\n22065\n22066\n22067\n22068\n22069\n22070\n22071\n22072\n22073\n22074\n22075\n22076\n22077\n22078\n22079\n22080\n22081\n22082\n22083\n22084\n22085\n22086\n22087\n22088\n22089\n22090\n22091\n22092\n22093\n22094\n22095\n22096\n22097\n22098\n22099\n22100\n22101\n22102\n22103\n22104\n22105\n22106\n22107\n22108\n22109\n22110\n22111\n22112\n22113\n22114\n22115\n22116\n22117\n22118\n22119\n22120\n22121\n22122\n22123\n22124\n22125\n22126\n22127\n22128\n22129\n22130\n22131\n22132\n22133\n22134\n22135\n22136\n22137\n22138\n22139\n22140\n22141\n22142\n22143\n22144\n22145\n22146\n22147\n22148\n22149\n22150\n22151\n22152\n22153\n22154\n22155\n22156\n22157\n22158\n22159\n22160\n22161\n22162\n22163\n22164\n22165\n22166\n22167\n22168\n22169\n22170\n22171\n22172\n22173\n22174\n22175\n22176\n22177\n22178\n22179\n22180\n22181\n22182\n22183\n22184\n22185\n22186\n22187\n22188\n22189\n22190\n22191\n22192\n22193\n22194\n22195\n22196\n22197\n22198\n22199\n22200\n22201\n22202\n22203\n22204\n22205\n22206\n22207\n22208\n22209\n22210\n22211\n22212\n22213\n22214\n22215\n22216\n22217\n22218\n22219\n22220\n22221\n22222\n22223\n22224\n22225\n22226\n22227\n22228\n22229\n22230\n22231\n22232\n22233\n22234\n22235\n22236\n22237\n22238\n22239\n22240\n22241\n22242\n22243\n22244\n22245\n22246\n22247\n22248\n22249\n22250\n22251\n22252\n22253\n22254\n22255\n22256\n22257\n22258\n22259\n22260\n22261\n22262\n22263\n22264\n22265\n22266\n22267\n22268\n22269\n22270\n22271\n22272\n22273\n22274\n22275\n22276\n22277\n22278\n22279\n22280\n22281\n22282\n22283\n22284\n22285\n22286\n22287\n22288\n22289\n22290\n22291\n22292\n22293\n22294\n22295\n22296\n22297\n22298\n22299\n22300\n22301\n22302\n22303\n22304\n22305\n22306\n22307\n22308\n22309\n22310\n22311\n22312\n22313\n22314\n22315\n22316\n22317\n22318\n22319\n22320\n22321\n22322\n22323\n22324\n22325\n22326\n22327\n22328\n22329\n22330\n22331\n22332\n22333\n22334\n22335\n22336\n22337\n22338\n22339\n22340\n22341\n22342\n22343\n22344\n22345\n22346\n22347\n22348\n22349\n22350\n22351\n22352\n22353\n22354\n22355\n22356\n22357\n22358\n22359\n22360\n22361\n22362\n22363\n22364\n22365\n22366\n22367\n22368\n22369\n22370\n22371\n22372\n22373\n22374\n22375\n22376\n22377\n22378\n22379\n22380\n22381\n22382\n22383\n22384\n22385\n22386\n22387\n22388\n22389\n22390\n22391\n22392\n22393\n22394\n22395\n22396\n22397\n22398\n22399\n22400\n22401\n22402\n22403\n22404\n22405\n22406\n22407\n22408\n22409\n22410\n22411\n22412\n22413\n22414\n22415\n22416\n22417\n22418\n22419\n22420\n22421\n22422\n22423\n22424\n22425\n22426\n22427\n22428\n22429\n22430\n22431\n22432\n22433\n22434\n22435\n22436\n22437\n22438\n22439\n22440\n22441\n22442\n22443\n22444\n22445\n22446\n22447\n22448\n22449\n22450\n22451\n22452\n22453\n22454\n22455\n22456\n22457\n22458\n22459\n22460\n22461\n22462\n22463\n22464\n22465\n22466\n22467\n22468\n22469\n22470\n22471\n22472\n22473\n22474\n22475\n22476\n22477\n22478\n22479\n22480\n22481\n22482\n22483\n22484\n22485\n22486\n22487\n22488\n22489\n22490\n22491\n22492\n22493\n22494\n22495\n22496\n22497\n22498\n22499\n22500\n22501\n22502\n22503\n22504\n22505\n22506\n22507\n22508\n22509\n22510\n22511\n22512\n22513\n22514\n22515\n22516\n22517\n22518\n22519\n22520\n22521\n22522\n22523\n22524\n22525\n22526\n22527\n22528\n22529\n22530\n22531\n22532\n22533\n22534\n22535\n22536\n22537\n22538\n22539\n22540\n22541\n22542\n22543\n22544\n22545\n22546\n22547\n22548\n22549\n22550\n22551\n22552\n22553\n22554\n22555\n22556\n22557\n22558\n22559\n22560\n22561\n22562\n22563\n22564\n22565\n22566\n22567\n22568\n22569\n22570\n22571\n22572\n22573\n22574\n22575\n22576\n22577\n22578\n22579\n22580\n22581\n22582\n22583\n22584\n22585\n22586\n22587\n22588\n22589\n22590\n22591\n22592\n22593\n22594\n22595\n22596\n22597\n22598\n22599\n22600\n22601\n22602\n22603\n22604\n22605\n22606\n22607\n22608\n22609\n22610\n22611\n22612\n22613\n22614\n22615\n22616\n22617\n22618\n22619\n22620\n22621\n22622\n22623\n22624\n22625\n22626\n22627\n22628\n22629\n22630\n22631\n22632\n22633\n22634\n22635\n22636\n22637\n22638\n22639\n22640\n22641\n22642\n22643\n22644\n22645\n22646\n22647\n22648\n22649\n22650\n22651\n22652\n22653\n22654\n22655\n22656\n22657\n22658\n22659\n22660\n22661\n22662\n22663\n22664\n22665\n22666\n22667\n22668\n22669\n22670\n22671\n22672\n22673\n22674\n22675\n22676\n22677\n22678\n22679\n22680\n22681\n22682\n22683\n22684\n22685\n22686\n22687\n22688\n22689\n22690\n22691\n22692\n22693\n22694\n22695\n22696\n22697\n22698\n22699\n22700\n22701\n22702\n22703\n22704\n22705\n22706\n22707\n22708\n22709\n22710\n22711\n22712\n22713\n22714\n22715\n22716\n22717\n22718\n22719\n22720\n22721\n22722\n22723\n22724\n22725\n22726\n22727\n22728\n22729\n22730\n22731\n22732\n22733\n22734\n22735\n22736\n22737\n22738\n22739\n22740\n22741\n22742\n22743\n22744\n22745\n22746\n22747\n22748\n22749\n22750\n22751\n22752\n22753\n22754\n22755\n22756\n22757\n22758\n22759\n22760\n22761\n22762\n22763\n22764\n22765\n22766\n22767\n22768\n22769\n22770\n22771\n22772\n22773\n22774\n22775\n22776\n22777\n22778\n22779\n22780\n22781\n22782\n22783\n22784\n22785\n22786\n22787\n22788\n22789\n22790\n22791\n22792\n22793\n22794\n22795\n22796\n22797\n22798\n22799\n22800\n22801\n22802\n22803\n22804\n22805\n22806\n22807\n22808\n22809\n22810\n22811\n22812\n22813\n22814\n22815\n22816\n22817\n22818\n22819\n22820\n22821\n22822\n22823\n22824\n22825\n22826\n22827\n22828\n22829\n22830\n22831\n22832\n22833\n22834\n22835\n22836\n22837\n22838\n22839\n22840\n22841\n22842\n22843\n22844\n22845\n22846\n22847\n22848\n22849\n22850\n22851\n22852\n22853\n22854\n22855\n22856\n22857\n22858\n22859\n22860\n22861\n22862\n22863\n22864\n22865\n22866\n22867\n22868\n22869\n22870\n22871\n22872\n22873\n22874\n22875\n22876\n22877\n22878\n22879\n22880\n22881\n22882\n22883\n22884\n22885\n22886\n22887\n22888\n22889\n22890\n22891\n22892\n22893\n22894\n22895\n22896\n22897\n22898\n22899\n22900\n22901\n22902\n22903\n22904\n22905\n22906\n22907\n22908\n22909\n22910\n22911\n22912\n22913\n22914\n22915\n22916\n22917\n22918\n22919\n22920\n22921\n22922\n22923\n22924\n22925\n22926\n22927\n22928\n22929\n22930\n22931\n22932\n22933\n22934\n22935\n22936\n22937\n22938\n22939\n22940\n22941\n22942\n22943\n22944\n22945\n22946\n22947\n22948\n22949\n22950\n22951\n22952\n22953\n22954\n22955\n22956\n22957\n22958\n22959\n22960\n22961\n22962\n22963\n22964\n22965\n22966\n22967\n22968\n22969\n22970\n22971\n22972\n22973\n22974\n22975\n22976\n22977\n22978\n22979\n22980\n22981\n22982\n22983\n22984\n22985\n22986\n22987\n22988\n22989\n22990\n22991\n22992\n22993\n22994\n22995\n22996\n22997\n22998\n22999\n23000\n23001\n23002\n23003\n23004\n23005\n23006\n23007\n23008\n23009\n23010\n23011\n23012\n23013\n23014\n23015\n23016\n23017\n23018\n23019\n23020\n23021\n23022\n23023\n23024\n23025\n23026\n23027\n23028\n23029\n23030\n23031\n23032\n23033\n23034\n23035\n23036\n23037\n23038\n23039\n23040\n23041\n23042\n23043\n23044\n23045\n23046\n23047\n23048\n23049\n23050\n23051\n23052\n23053\n23054\n23055\n23056\n23057\n23058\n23059\n23060\n23061\n23062\n23063\n23064\n23065\n23066\n23067\n23068\n23069\n23070\n23071\n23072\n23073\n23074\n23075\n23076\n23077\n23078\n23079\n23080\n23081\n23082\n23083\n23084\n23085\n23086\n23087\n23088\n23089\n23090\n23091\n23092\n23093\n23094\n23095\n23096\n23097\n23098\n23099\n23100\n23101\n23102\n23103\n23104\n23105\n23106\n23107\n23108\n23109\n23110\n23111\n23112\n23113\n23114\n23115\n23116\n23117\n23118\n23119\n23120\n23121\n23122\n23123\n23124\n23125\n23126\n23127\n23128\n23129\n23130\n23131\n23132\n23133\n23134\n23135\n23136\n23137\n23138\n23139\n23140\n23141\n23142\n23143\n23144\n23145\n23146\n23147\n23148\n23149\n23150\n23151\n23152\n23153\n23154\n23155\n23156\n23157\n23158\n23159\n23160\n23161\n23162\n23163\n23164\n23165\n23166\n23167\n23168\n23169\n23170\n23171\n23172\n23173\n23174\n23175\n23176\n23177\n23178\n23179\n23180\n23181\n23182\n23183\n23184\n23185\n23186\n23187\n23188\n23189\n23190\n23191\n23192\n23193\n23194\n23195\n23196\n23197\n23198\n23199\n23200\n23201\n23202\n23203\n23204\n23205\n23206\n23207\n23208\n23209\n23210\n23211\n23212\n23213\n23214\n23215\n23216\n23217\n23218\n23219\n23220\n23221\n23222\n23223\n23224\n23225\n23226\n23227\n23228\n23229\n23230\n23231\n23232\n23233\n23234\n23235\n23236\n23237\n23238\n23239\n23240\n23241\n23242\n23243\n23244\n23245\n23246\n23247\n23248\n23249\n23250\n23251\n23252\n23253\n23254\n23255\n23256\n23257\n23258\n23259\n23260\n23261\n23262\n23263\n23264\n23265\n23266\n23267\n23268\n23269\n23270\n23271\n23272\n23273\n23274\n23275\n23276\n23277\n23278\n23279\n23280\n23281\n23282\n23283\n23284\n23285\n23286\n23287\n23288\n23289\n23290\n23291\n23292\n23293\n23294\n23295\n23296\n23297\n23298\n23299\n23300\n23301\n23302\n23303\n23304\n23305\n23306\n23307\n23308\n23309\n23310\n23311\n23312\n23313\n23314\n23315\n23316\n23317\n23318\n23319\n23320\n23321\n23322\n23323\n23324\n23325\n23326\n23327\n23328\n23329\n23330\n23331\n23332\n23333\n23334\n23335\n23336\n23337\n23338\n23339\n23340\n23341\n23342\n23343\n23344\n23345\n23346\n23347\n23348\n23349\n23350\n23351\n23352\n23353\n23354\n23355\n23356\n23357\n23358\n23359\n23360\n23361\n23362\n23363\n23364\n23365\n23366\n23367\n23368\n23369\n23370\n23371\n23372\n23373\n23374\n23375\n23376\n23377\n23378\n23379\n23380\n23381\n23382\n23383\n23384\n23385\n23386\n23387\n23388\n23389\n23390\n23391\n23392\n23393\n23394\n23395\n23396\n23397\n23398\n23399\n23400\n23401\n23402\n23403\n23404\n23405\n23406\n23407\n23408\n23409\n23410\n23411\n23412\n23413\n23414\n23415\n23416\n23417\n23418\n23419\n23420\n23421\n23422\n23423\n23424\n23425\n23426\n23427\n23428\n23429\n23430\n23431\n23432\n23433\n23434\n23435\n23436\n23437\n23438\n23439\n23440\n23441\n23442\n23443\n23444\n23445\n23446\n23447\n23448\n23449\n23450\n23451\n23452\n23453\n23454\n23455\n23456\n23457\n23458\n23459\n23460\n23461\n23462\n23463\n23464\n23465\n23466\n23467\n23468\n23469\n23470\n23471\n23472\n23473\n23474\n23475\n23476\n23477\n23478\n23479\n23480\n23481\n23482\n23483\n23484\n23485\n23486\n23487\n23488\n23489\n23490\n23491\n23492\n23493\n23494\n23495\n23496\n23497\n23498\n23499\n23500\n23501\n23502\n23503\n23504\n23505\n23506\n23507\n23508\n23509\n23510\n23511\n23512\n23513\n23514\n23515\n23516\n23517\n23518\n23519\n23520\n23521\n23522\n23523\n23524\n23525\n23526\n23527\n23528\n23529\n23530\n23531\n23532\n23533\n23534\n23535\n23536\n23537\n23538\n23539\n23540\n23541\n23542\n23543\n23544\n23545\n23546\n23547\n23548\n23549\n23550\n23551\n23552\n23553\n23554\n23555\n23556\n23557\n23558\n23559\n23560\n23561\n23562\n23563\n23564\n23565\n23566\n23567\n23568\n23569\n23570\n23571\n23572\n23573\n23574\n23575\n23576\n23577\n23578\n23579\n23580\n23581\n23582\n23583\n23584\n23585\n23586\n23587\n23588\n23589\n23590\n23591\n23592\n23593\n23594\n23595\n23596\n23597\n23598\n23599\n23600\n23601\n23602\n23603\n23604\n23605\n23606\n23607\n23608\n23609\n23610\n23611\n23612\n23613\n23614\n23615\n23616\n23617\n23618\n23619\n23620\n23621\n23622\n23623\n23624\n23625\n23626\n23627\n23628\n23629\n23630\n23631\n23632\n23633\n23634\n23635\n23636\n23637\n23638\n23639\n23640\n23641\n23642\n23643\n23644\n23645\n23646\n23647\n23648\n23649\n23650\n23651\n23652\n23653\n23654\n23655\n23656\n23657\n23658\n23659\n23660\n23661\n23662\n23663\n23664\n23665\n23666\n23667\n23668\n23669\n23670\n23671\n23672\n23673\n23674\n23675\n23676\n23677\n23678\n23679\n23680\n23681\n23682\n23683\n23684\n23685\n23686\n23687\n23688\n23689\n23690\n23691\n23692\n23693\n23694\n23695\n23696\n23697\n23698\n23699\n23700\n23701\n23702\n23703\n23704\n23705\n23706\n23707\n23708\n23709\n23710\n23711\n23712\n23713\n23714\n23715\n23716\n23717\n23718\n23719\n23720\n23721\n23722\n23723\n23724\n23725\n23726\n23727\n23728\n23729\n23730\n23731\n23732\n23733\n23734\n23735\n23736\n23737\n23738\n23739\n23740\n23741\n23742\n23743\n23744\n23745\n23746\n23747\n23748\n23749\n23750\n23751\n23752\n23753\n23754\n23755\n23756\n23757\n23758\n23759\n23760\n23761\n23762\n23763\n23764\n23765\n23766\n23767\n23768\n23769\n23770\n23771\n23772\n23773\n23774\n23775\n23776\n23777\n23778\n23779\n23780\n23781\n23782\n23783\n23784\n23785\n23786\n23787\n23788\n23789\n23790\n23791\n23792\n23793\n23794\n23795\n23796\n23797\n23798\n23799\n23800\n23801\n23802\n23803\n23804\n23805\n23806\n23807\n23808\n23809\n23810\n23811\n23812\n23813\n23814\n23815\n23816\n23817\n23818\n23819\n23820\n23821\n23822\n23823\n23824\n23825\n23826\n23827\n23828\n23829\n23830\n23831\n23832\n23833\n23834\n23835\n23836\n23837\n23838\n23839\n23840\n23841\n23842\n23843\n23844\n23845\n23846\n23847\n23848\n23849\n23850\n23851\n23852\n23853\n23854\n23855\n23856\n23857\n23858\n23859\n23860\n23861\n23862\n23863\n23864\n23865\n23866\n23867\n23868\n23869\n23870\n23871\n23872\n23873\n23874\n23875\n23876\n23877\n23878\n23879\n23880\n23881\n23882\n23883\n23884\n23885\n23886\n23887\n23888\n23889\n23890\n23891\n23892\n23893\n23894\n23895\n23896\n23897\n23898\n23899\n23900\n23901\n23902\n23903\n23904\n23905\n23906\n23907\n23908\n23909\n23910\n23911\n23912\n23913\n23914\n23915\n23916\n23917\n23918\n23919\n23920\n23921\n23922\n23923\n23924\n23925\n23926\n23927\n23928\n23929\n23930\n23931\n23932\n23933\n23934\n23935\n23936\n23937\n23938\n23939\n23940\n23941\n23942\n23943\n23944\n23945\n23946\n23947\n23948\n23949\n23950\n23951\n23952\n23953\n23954\n23955\n23956\n23957\n23958\n23959\n23960\n23961\n23962\n23963\n23964\n23965\n23966\n23967\n23968\n23969\n23970\n23971\n23972\n23973\n23974\n23975\n23976\n23977\n23978\n23979\n23980\n23981\n23982\n23983\n23984\n23985\n23986\n23987\n23988\n23989\n23990\n23991\n23992\n23993\n23994\n23995\n23996\n23997\n23998\n23999\n24000\n24001\n24002\n24003\n24004\n24005\n24006\n24007\n24008\n24009\n24010\n24011\n24012\n24013\n24014\n24015\n24016\n24017\n24018\n24019\n24020\n24021\n24022\n24023\n24024\n24025\n24026\n24027\n24028\n24029\n24030\n24031\n24032\n24033\n24034\n24035\n24036\n24037\n24038\n24039\n24040\n24041\n24042\n24043\n24044\n24045\n24046\n24047\n24048\n24049\n24050\n24051\n24052\n24053\n24054\n24055\n24056\n24057\n24058\n24059\n24060\n24061\n24062\n24063\n24064\n24065\n24066\n24067\n24068\n24069\n24070\n24071\n24072\n24073\n24074\n24075\n24076\n24077\n24078\n24079\n24080\n24081\n24082\n24083\n24084\n24085\n24086\n24087\n24088\n24089\n24090\n24091\n24092\n24093\n24094\n24095\n24096\n24097\n24098\n24099\n24100\n24101\n24102\n24103\n24104\n24105\n24106\n24107\n24108\n24109\n24110\n24111\n24112\n24113\n24114\n24115\n24116\n24117\n24118\n24119\n24120\n24121\n24122\n24123\n24124\n24125\n24126\n24127\n24128\n24129\n24130\n24131\n24132\n24133\n24134\n24135\n24136\n24137\n24138\n24139\n24140\n24141\n24142\n24143\n24144\n24145\n24146\n24147\n24148\n24149\n24150\n24151\n24152\n24153\n24154\n24155\n24156\n24157\n24158\n24159\n24160\n24161\n24162\n24163\n24164\n24165\n24166\n24167\n24168\n24169\n24170\n24171\n24172\n24173\n24174\n24175\n24176\n24177\n24178\n24179\n24180\n24181\n24182\n24183\n24184\n24185\n24186\n24187\n24188\n24189\n24190\n24191\n24192\n24193\n24194\n24195\n24196\n24197\n24198\n24199\n24200\n24201\n24202\n24203\n24204\n24205\n24206\n24207\n24208\n24209\n24210\n24211\n24212\n24213\n24214\n24215\n24216\n24217\n24218\n24219\n24220\n24221\n24222\n24223\n24224\n24225\n24226\n24227\n24228\n24229\n24230\n24231\n24232\n24233\n24234\n24235\n24236\n24237\n24238\n24239\n24240\n24241\n24242\n24243\n24244\n24245\n24246\n24247\n24248\n24249\n24250\n24251\n24252\n24253\n24254\n24255\n24256\n24257\n24258\n24259\n24260\n24261\n24262\n24263\n24264\n24265\n24266\n24267\n24268\n24269\n24270\n24271\n24272\n24273\n24274\n24275\n24276\n24277\n24278\n24279\n24280\n24281\n24282\n24283\n24284\n24285\n24286\n24287\n24288\n24289\n24290\n24291\n24292\n24293\n24294\n24295\n24296\n24297\n24298\n24299\n24300\n24301\n24302\n24303\n24304\n24305\n24306\n24307\n24308\n24309\n24310\n24311\n24312\n24313\n24314\n24315\n24316\n24317\n24318\n24319\n24320\n24321\n24322\n24323\n24324\n24325\n24326\n24327\n24328\n24329\n24330\n24331\n24332\n24333\n24334\n24335\n24336\n24337\n24338\n24339\n24340\n24341\n24342\n24343\n24344\n24345\n24346\n24347\n24348\n24349\n24350\n24351\n24352\n24353\n24354\n24355\n24356\n24357\n24358\n24359\n24360\n24361\n24362\n24363\n24364\n24365\n24366\n24367\n24368\n24369\n24370\n24371\n24372\n24373\n24374\n24375\n24376\n24377\n24378\n24379\n24380\n24381\n24382\n24383\n24384\n24385\n24386\n24387\n24388\n24389\n24390\n24391\n24392\n24393\n24394\n24395\n24396\n24397\n24398\n24399\n24400\n24401\n24402\n24403\n24404\n24405\n24406\n24407\n24408\n24409\n24410\n24411\n24412\n24413\n24414\n24415\n24416\n24417\n24418\n24419\n24420\n24421\n24422\n24423\n24424\n24425\n24426\n24427\n24428\n24429\n24430\n24431\n24432\n24433\n24434\n24435\n24436\n24437\n24438\n24439\n24440\n24441\n24442\n24443\n24444\n24445\n24446\n24447\n24448\n24449\n24450\n24451\n24452\n24453\n24454\n24455\n24456\n24457\n24458\n24459\n24460\n24461\n24462\n24463\n24464\n24465\n24466\n24467\n24468\n24469\n24470\n24471\n24472\n24473\n24474\n24475\n24476\n24477\n24478\n24479\n24480\n24481\n24482\n24483\n24484\n24485\n24486\n24487\n24488\n24489\n24490\n24491\n24492\n24493\n24494\n24495\n24496\n24497\n24498\n24499\n24500\n24501\n24502\n24503\n24504\n24505\n24506\n24507\n24508\n24509\n24510\n24511\n24512\n24513\n24514\n24515\n24516\n24517\n24518\n24519\n24520\n24521\n24522\n24523\n24524\n24525\n24526\n24527\n24528\n24529\n24530\n24531\n24532\n24533\n24534\n24535\n24536\n24537\n24538\n24539\n24540\n24541\n24542\n24543\n24544\n24545\n24546\n24547\n24548\n24549\n24550\n24551\n24552\n24553\n24554\n24555\n24556\n24557\n24558\n24559\n24560\n24561\n24562\n24563\n24564\n24565\n24566\n24567\n24568\n24569\n24570\n24571\n24572\n24573\n24574\n24575\n24576\n24577\n24578\n24579\n24580\n24581\n24582\n24583\n24584\n24585\n24586\n24587\n24588\n24589\n24590\n24591\n24592\n24593\n24594\n24595\n24596\n24597\n24598\n24599\n24600\n24601\n24602\n24603\n24604\n24605\n24606\n24607\n24608\n24609\n24610\n24611\n24612\n24613\n24614\n24615\n24616\n24617\n24618\n24619\n24620\n24621\n24622\n24623\n24624\n24625\n24626\n24627\n24628\n24629\n24630\n24631\n24632\n24633\n24634\n24635\n24636\n24637\n24638\n24639\n24640\n24641\n24642\n24643\n24644\n24645\n24646\n24647\n24648\n24649\n24650\n24651\n24652\n24653\n24654\n24655\n24656\n24657\n24658\n24659\n24660\n24661\n24662\n24663\n24664\n24665\n24666\n24667\n24668\n24669\n24670\n24671\n24672\n24673\n24674\n24675\n24676\n24677\n24678\n24679\n24680\n24681\n24682\n24683\n24684\n24685\n24686\n24687\n24688\n24689\n24690\n24691\n24692\n24693\n24694\n24695\n24696\n24697\n24698\n24699\n24700\n24701\n24702\n24703\n24704\n24705\n24706\n24707\n24708\n24709\n24710\n24711\n24712\n24713\n24714\n24715\n24716\n24717\n24718\n24719\n24720\n24721\n24722\n24723\n24724\n24725\n24726\n24727\n24728\n24729\n24730\n24731\n24732\n24733\n24734\n24735\n24736\n24737\n24738\n24739\n24740\n24741\n24742\n24743\n24744\n24745\n24746\n24747\n24748\n24749\n24750\n24751\n24752\n24753\n24754\n24755\n24756\n24757\n24758\n24759\n24760\n24761\n24762\n24763\n24764\n24765\n24766\n24767\n24768\n24769\n24770\n24771\n24772\n24773\n24774\n24775\n24776\n24777\n24778\n24779\n24780\n24781\n24782\n24783\n24784\n24785\n24786\n24787\n24788\n24789\n24790\n24791\n24792\n24793\n24794\n24795\n24796\n24797\n24798\n24799\n24800\n24801\n24802\n24803\n24804\n24805\n24806\n24807\n24808\n24809\n24810\n24811\n24812\n24813\n24814\n24815\n24816\n24817\n24818\n24819\n24820\n24821\n24822\n24823\n24824\n24825\n24826\n24827\n24828\n24829\n24830\n24831\n24832\n24833\n24834\n24835\n24836\n24837\n24838\n24839\n24840\n24841\n24842\n24843\n24844\n24845\n24846\n24847\n24848\n24849\n24850\n24851\n24852\n24853\n24854\n24855\n24856\n24857\n24858\n24859\n24860\n24861\n24862\n24863\n24864\n24865\n24866\n24867\n24868\n24869\n24870\n24871\n24872\n24873\n24874\n24875\n24876\n24877\n24878\n24879\n24880\n24881\n24882\n24883\n24884\n24885\n24886\n24887\n24888\n24889\n24890\n24891\n24892\n24893\n24894\n24895\n24896\n24897\n24898\n24899\n24900\n24901\n24902\n24903\n24904\n24905\n24906\n24907\n24908\n24909\n24910\n24911\n24912\n24913\n24914\n24915\n24916\n24917\n24918\n24919\n24920\n24921\n24922\n24923\n24924\n24925\n24926\n24927\n24928\n24929\n24930\n24931\n24932\n24933\n24934\n24935\n24936\n24937\n24938\n24939\n24940\n24941\n24942\n24943\n24944\n24945\n24946\n24947\n24948\n24949\n24950\n24951\n24952\n24953\n24954\n24955\n24956\n24957\n24958\n24959\n24960\n24961\n24962\n24963\n24964\n24965\n24966\n24967\n24968\n24969\n24970\n24971\n24972\n24973\n24974\n24975\n24976\n24977\n24978\n24979\n24980\n24981\n24982\n24983\n24984\n24985\n24986\n24987\n24988\n24989\n24990\n24991\n24992\n24993\n24994\n24995\n24996\n24997\n24998\n24999\n25000\n25001\n25002\n25003\n25004\n25005\n25006\n25007\n25008\n25009\n25010\n25011\n25012\n25013\n25014\n25015\n25016\n25017\n25018\n25019\n25020\n25021\n25022\n25023\n25024\n25025\n25026\n25027\n25028\n25029\n25030\n25031\n25032\n25033\n25034\n25035\n25036\n25037\n25038\n25039\n25040\n25041\n25042\n25043\n25044\n25045\n25046\n25047\n25048\n25049\n25050\n25051\n25052\n25053\n25054\n25055\n25056\n25057\n25058\n25059\n25060\n25061\n25062\n25063\n25064\n25065\n25066\n25067\n25068\n25069\n25070\n25071\n25072\n25073\n25074\n25075\n25076\n25077\n25078\n25079\n25080\n25081\n25082\n25083\n25084\n25085\n25086\n25087\n25088\n25089\n25090\n25091\n25092\n25093\n25094\n25095\n25096\n25097\n25098\n25099\n25100\n25101\n25102\n25103\n25104\n25105\n25106\n25107\n25108\n25109\n25110\n25111\n25112\n25113\n25114\n25115\n25116\n25117\n25118\n25119\n25120\n25121\n25122\n25123\n25124\n25125\n25126\n25127\n25128\n25129\n25130\n25131\n25132\n25133\n25134\n25135\n25136\n25137\n25138\n25139\n25140\n25141\n25142\n25143\n25144\n25145\n25146\n25147\n25148\n25149\n25150\n25151\n25152\n25153\n25154\n25155\n25156\n25157\n25158\n25159\n25160\n25161\n25162\n25163\n25164\n25165\n25166\n25167\n25168\n25169\n25170\n25171\n25172\n25173\n25174\n25175\n25176\n25177\n25178\n25179\n25180\n25181\n25182\n25183\n25184\n25185\n25186\n25187\n25188\n25189\n25190\n25191\n25192\n25193\n25194\n25195\n25196\n25197\n25198\n25199\n25200\n25201\n25202\n25203\n25204\n25205\n25206\n25207\n25208\n25209\n25210\n25211\n25212\n25213\n25214\n25215\n25216\n25217\n25218\n25219\n25220\n25221\n25222\n25223\n25224\n25225\n25226\n25227\n25228\n25229\n25230\n25231\n25232\n25233\n25234\n25235\n25236\n25237\n25238\n25239\n25240\n25241\n25242\n25243\n25244\n25245\n25246\n25247\n25248\n25249\n25250\n25251\n25252\n25253\n25254\n25255\n25256\n25257\n25258\n25259\n25260\n25261\n25262\n25263\n25264\n25265\n25266\n25267\n25268\n25269\n25270\n25271\n25272\n25273\n25274\n25275\n25276\n25277\n25278\n25279\n25280\n25281\n25282\n25283\n25284\n25285\n25286\n25287\n25288\n25289\n25290\n25291\n25292\n25293\n25294\n25295\n25296\n25297\n25298\n25299\n25300\n25301\n25302\n25303\n25304\n25305\n25306\n25307\n25308\n25309\n25310\n25311\n25312\n25313\n25314\n25315\n25316\n25317\n25318\n25319\n25320\n25321\n25322\n25323\n25324\n25325\n25326\n25327\n25328\n25329\n25330\n25331\n25332\n25333\n25334\n25335\n25336\n25337\n25338\n25339\n25340\n25341\n25342\n25343\n25344\n25345\n25346\n25347\n25348\n25349\n25350\n25351\n25352\n25353\n25354\n25355\n25356\n25357\n25358\n25359\n25360\n25361\n25362\n25363\n25364\n25365\n25366\n25367\n25368\n25369\n25370\n25371\n25372\n25373\n25374\n25375\n25376\n25377\n25378\n25379\n25380\n25381\n25382\n25383\n25384\n25385\n25386\n25387\n25388\n25389\n25390\n25391\n25392\n25393\n25394\n25395\n25396\n25397\n25398\n25399\n25400\n25401\n25402\n25403\n25404\n25405\n25406\n25407\n25408\n25409\n25410\n25411\n25412\n25413\n25414\n25415\n25416\n25417\n25418\n25419\n25420\n25421\n25422\n25423\n25424\n25425\n25426\n25427\n25428\n25429\n25430\n25431\n25432\n25433\n25434\n25435\n25436\n25437\n25438\n25439\n25440\n25441\n25442\n25443\n25444\n25445\n25446\n25447\n25448\n25449\n25450\n25451\n25452\n25453\n25454\n25455\n25456\n25457\n25458\n25459\n25460\n25461\n25462\n25463\n25464\n25465\n25466\n25467\n25468\n25469\n25470\n25471\n25472\n25473\n25474\n25475\n25476\n25477\n25478\n25479\n25480\n25481\n25482\n25483\n25484\n25485\n25486\n25487\n25488\n25489\n25490\n25491\n25492\n25493\n25494\n25495\n25496\n25497\n25498\n25499\n25500\n25501\n25502\n25503\n25504\n25505\n25506\n25507\n25508\n25509\n25510\n25511\n25512\n25513\n25514\n25515\n25516\n25517\n25518\n25519\n25520\n25521\n25522\n25523\n25524\n25525\n25526\n25527\n25528\n25529\n25530\n25531\n25532\n25533\n25534\n25535\n25536\n25537\n25538\n25539\n25540\n25541\n25542\n25543\n25544\n25545\n25546\n25547\n25548\n25549\n25550\n25551\n25552\n25553\n25554\n25555\n25556\n25557\n25558\n25559\n25560\n25561\n25562\n25563\n25564\n25565\n25566\n25567\n25568\n25569\n25570\n25571\n25572\n25573\n25574\n25575\n25576\n25577\n25578\n25579\n25580\n25581\n25582\n25583\n25584\n25585\n25586\n25587\n25588\n25589\n25590\n25591\n25592\n25593\n25594\n25595\n25596\n25597\n25598\n25599\n25600\n25601\n25602\n25603\n25604\n25605\n25606\n25607\n25608\n25609\n25610\n25611\n25612\n25613\n25614\n25615\n25616\n25617\n25618\n25619\n25620\n25621\n25622\n25623\n25624\n25625\n25626\n25627\n25628\n25629\n25630\n25631\n25632\n25633\n25634\n25635\n25636\n25637\n25638\n25639\n25640\n25641\n25642\n25643\n25644\n25645\n25646\n25647\n25648\n25649\n25650\n25651\n25652\n25653\n25654\n25655\n25656\n25657\n25658\n25659\n25660\n25661\n25662\n25663\n25664\n25665\n25666\n25667\n25668\n25669\n25670\n25671\n25672\n25673\n25674\n25675\n25676\n25677\n25678\n25679\n25680\n25681\n25682\n25683\n25684\n25685\n25686\n25687\n25688\n25689\n25690\n25691\n25692\n25693\n25694\n25695\n25696\n25697\n25698\n25699\n25700\n25701\n25702\n25703\n25704\n25705\n25706\n25707\n25708\n25709\n25710\n25711\n25712\n25713\n25714\n25715\n25716\n25717\n25718\n25719\n25720\n25721\n25722\n25723\n25724\n25725\n25726\n25727\n25728\n25729\n25730\n25731\n25732\n25733\n25734\n25735\n25736\n25737\n25738\n25739\n25740\n25741\n25742\n25743\n25744\n25745\n25746\n25747\n25748\n25749\n25750\n25751\n25752\n25753\n25754\n25755\n25756\n25757\n25758\n25759\n25760\n25761\n25762\n25763\n25764\n25765\n25766\n25767\n25768\n25769\n25770\n25771\n25772\n25773\n25774\n25775\n25776\n25777\n25778\n25779\n25780\n25781\n25782\n25783\n25784\n25785\n25786\n25787\n25788\n25789\n25790\n25791\n25792\n25793\n25794\n25795\n25796\n25797\n25798\n25799\n25800\n25801\n25802\n25803\n25804\n25805\n25806\n25807\n25808\n25809\n25810\n25811\n25812\n25813\n25814\n25815\n25816\n25817\n25818\n25819\n25820\n25821\n25822\n25823\n25824\n25825\n25826\n25827\n25828\n25829\n25830\n25831\n25832\n25833\n25834\n25835\n25836\n25837\n25838\n25839\n25840\n25841\n25842\n25843\n25844\n25845\n25846\n25847\n25848\n25849\n25850\n25851\n25852\n25853\n25854\n25855\n25856\n25857\n25858\n25859\n25860\n25861\n25862\n25863\n25864\n25865\n25866\n25867\n25868\n25869\n25870\n25871\n25872\n25873\n25874\n25875\n25876\n25877\n25878\n25879\n25880\n25881\n25882\n25883\n25884\n25885\n25886\n25887\n25888\n25889\n25890\n25891\n25892\n25893\n25894\n25895\n25896\n25897\n25898\n25899\n25900\n25901\n25902\n25903\n25904\n25905\n25906\n25907\n25908\n25909\n25910\n25911\n25912\n25913\n25914\n25915\n25916\n25917\n25918\n25919\n25920\n25921\n25922\n25923\n25924\n25925\n25926\n25927\n25928\n25929\n25930\n25931\n25932\n25933\n25934\n25935\n25936\n25937\n25938\n25939\n25940\n25941\n25942\n25943\n25944\n25945\n25946\n25947\n25948\n25949\n25950\n25951\n25952\n25953\n25954\n25955\n25956\n25957\n25958\n25959\n25960\n25961\n25962\n25963\n25964\n25965\n25966\n25967\n25968\n25969\n25970\n25971\n25972\n25973\n25974\n25975\n25976\n25977\n25978\n25979\n25980\n25981\n25982\n25983\n25984\n25985\n25986\n25987\n25988\n25989\n25990\n25991\n25992\n25993\n25994\n25995\n25996\n25997\n25998\n25999\n26000\n26001\n26002\n26003\n26004\n26005\n26006\n26007\n26008\n26009\n26010\n26011\n26012\n26013\n26014\n26015\n26016\n26017\n26018\n26019\n26020\n26021\n26022\n26023\n26024\n26025\n26026\n26027\n26028\n26029\n26030\n26031\n26032\n26033\n26034\n26035\n26036\n26037\n26038\n26039\n26040\n26041\n26042\n26043\n26044\n26045\n26046\n26047\n26048\n26049\n26050\n26051\n26052\n26053\n26054\n26055\n26056\n26057\n26058\n26059\n26060\n26061\n26062\n26063\n26064\n26065\n26066\n26067\n26068\n26069\n26070\n26071\n26072\n26073\n26074\n26075\n26076\n26077\n26078\n26079\n26080\n26081\n26082\n26083\n26084\n26085\n26086\n26087\n26088\n26089\n26090\n26091\n26092\n26093\n26094\n26095\n26096\n26097\n26098\n26099\n26100\n26101\n26102\n26103\n26104\n26105\n26106\n26107\n26108\n26109\n26110\n26111\n26112\n26113\n26114\n26115\n26116\n26117\n26118\n26119\n26120\n26121\n26122\n26123\n26124\n26125\n26126\n26127\n26128\n26129\n26130\n26131\n26132\n26133\n26134\n26135\n26136\n26137\n26138\n26139\n26140\n26141\n26142\n26143\n26144\n26145\n26146\n26147\n26148\n26149\n26150\n26151\n26152\n26153\n26154\n26155\n26156\n26157\n26158\n26159\n26160\n26161\n26162\n26163\n26164\n26165\n26166\n26167\n26168\n26169\n26170\n26171\n26172\n26173\n26174\n26175\n26176\n26177\n26178\n26179\n26180\n26181\n26182\n26183\n26184\n26185\n26186\n26187\n26188\n26189\n26190\n26191\n26192\n26193\n26194\n26195\n26196\n26197\n26198\n26199\n26200\n26201\n26202\n26203\n26204\n26205\n26206\n26207\n26208\n26209\n26210\n26211\n26212\n26213\n26214\n26215\n26216\n26217\n26218\n26219\n26220\n26221\n26222\n26223\n26224\n26225\n26226\n26227\n26228\n26229\n26230\n26231\n26232\n26233\n26234\n26235\n26236\n26237\n26238\n26239\n26240\n26241\n26242\n26243\n26244\n26245\n26246\n26247\n26248\n26249\n26250\n26251\n26252\n26253\n26254\n26255\n26256\n26257\n26258\n26259\n26260\n26261\n26262\n26263\n26264\n26265\n26266\n26267\n26268\n26269\n26270\n26271\n26272\n26273\n26274\n26275\n26276\n26277\n26278\n26279\n26280\n26281\n26282\n26283\n26284\n26285\n26286\n26287\n26288\n26289\n26290\n26291\n26292\n26293\n26294\n26295\n26296\n26297\n26298\n26299\n26300\n26301\n26302\n26303\n26304\n26305\n26306\n26307\n26308\n26309\n26310\n26311\n26312\n26313\n26314\n26315\n26316\n26317\n26318\n26319\n26320\n26321\n26322\n26323\n26324\n26325\n26326\n26327\n26328\n26329\n26330\n26331\n26332\n26333\n26334\n26335\n26336\n26337\n26338\n26339\n26340\n26341\n26342\n26343\n26344\n26345\n26346\n26347\n26348\n26349\n26350\n26351\n26352\n26353\n26354\n26355\n26356\n26357\n26358\n26359\n26360\n26361\n26362\n26363\n26364\n26365\n26366\n26367\n26368\n26369\n26370\n26371\n26372\n26373\n26374\n26375\n26376\n26377\n26378\n26379\n26380\n26381\n26382\n26383\n26384\n26385\n26386\n26387\n26388\n26389\n26390\n26391\n26392\n26393\n26394\n26395\n26396\n26397\n26398\n26399\n26400\n26401\n26402\n26403\n26404\n26405\n26406\n26407\n26408\n26409\n26410\n26411\n26412\n26413\n26414\n26415\n26416\n26417\n26418\n26419\n26420\n26421\n26422\n26423\n26424\n26425\n26426\n26427\n26428\n26429\n26430\n26431\n26432\n26433\n26434\n26435\n26436\n26437\n26438\n26439\n26440\n26441\n26442\n26443\n26444\n26445\n26446\n26447\n26448\n26449\n26450\n26451\n26452\n26453\n26454\n26455\n26456\n26457\n26458\n26459\n26460\n26461\n26462\n26463\n26464\n26465\n26466\n26467\n26468\n26469\n26470\n26471\n26472\n26473\n26474\n26475\n26476\n26477\n26478\n26479\n26480\n26481\n26482\n26483\n26484\n26485\n26486\n26487\n26488\n26489\n26490\n26491\n26492\n26493\n26494\n26495\n26496\n26497\n26498\n26499\n26500\n26501\n26502\n26503\n26504\n26505\n26506\n26507\n26508\n26509\n26510\n26511\n26512\n26513\n26514\n26515\n26516\n26517\n26518\n26519\n26520\n26521\n26522\n26523\n26524\n26525\n26526\n26527\n26528\n26529\n26530\n26531\n26532\n26533\n26534\n26535\n26536\n26537\n26538\n26539\n26540\n26541\n26542\n26543\n26544\n26545\n26546\n26547\n26548\n26549\n26550\n26551\n26552\n26553\n26554\n26555\n26556\n26557\n26558\n26559\n26560\n26561\n26562\n26563\n26564\n26565\n26566\n26567\n26568\n26569\n26570\n26571\n26572\n26573\n26574\n26575\n26576\n26577\n26578\n26579\n26580\n26581\n26582\n26583\n26584\n26585\n26586\n26587\n26588\n26589\n26590\n26591\n26592\n26593\n26594\n26595\n26596\n26597\n26598\n26599\n26600\n26601\n26602\n26603\n26604\n26605\n26606\n26607\n26608\n26609\n26610\n26611\n26612\n26613\n26614\n26615\n26616\n26617\n26618\n26619\n26620\n26621\n26622\n26623\n26624\n26625\n26626\n26627\n26628\n26629\n26630\n26631\n26632\n26633\n26634\n26635\n26636\n26637\n26638\n26639\n26640\n26641\n26642\n26643\n26644\n26645\n26646\n26647\n26648\n26649\n26650\n26651\n26652\n26653\n26654\n26655\n26656\n26657\n26658\n26659\n26660\n26661\n26662\n26663\n26664\n26665\n26666\n26667\n26668\n26669\n26670\n26671\n26672\n26673\n26674\n26675\n26676\n26677\n26678\n26679\n26680\n26681\n26682\n26683\n26684\n26685\n26686\n26687\n26688\n26689\n26690\n26691\n26692\n26693\n26694\n26695\n26696\n26697\n26698\n26699\n26700\n26701\n26702\n26703\n26704\n26705\n26706\n26707\n26708\n26709\n26710\n26711\n26712\n26713\n26714\n26715\n26716\n26717\n26718\n26719\n26720\n26721\n26722\n26723\n26724\n26725\n26726\n26727\n26728\n26729\n26730\n26731\n26732\n26733\n26734\n26735\n26736\n26737\n26738\n26739\n26740\n26741\n26742\n26743\n26744\n26745\n26746\n26747\n26748\n26749\n26750\n26751\n26752\n26753\n26754\n26755\n26756\n26757\n26758\n26759\n26760\n26761\n26762\n26763\n26764\n26765\n26766\n26767\n26768\n26769\n26770\n26771\n26772\n26773\n26774\n26775\n26776\n26777\n26778\n26779\n26780\n26781\n26782\n26783\n26784\n26785\n26786\n26787\n26788\n26789\n26790\n26791\n26792\n26793\n26794\n26795\n26796\n26797\n26798\n26799\n26800\n26801\n26802\n26803\n26804\n26805\n26806\n26807\n26808\n26809\n26810\n26811\n26812\n26813\n26814\n26815\n26816\n26817\n26818\n26819\n26820\n26821\n26822\n26823\n26824\n26825\n26826\n26827\n26828\n26829\n26830\n26831\n26832\n26833\n26834\n26835\n26836\n26837\n26838\n26839\n26840\n26841\n26842\n26843\n26844\n26845\n26846\n26847\n26848\n26849\n26850\n26851\n26852\n26853\n26854\n26855\n26856\n26857\n26858\n26859\n26860\n26861\n26862\n26863\n26864\n26865\n26866\n26867\n26868\n26869\n26870\n26871\n26872\n26873\n26874\n26875\n26876\n26877\n26878\n26879\n26880\n26881\n26882\n26883\n26884\n26885\n26886\n26887\n26888\n26889\n26890\n26891\n26892\n26893\n26894\n26895\n26896\n26897\n26898\n26899\n26900\n26901\n26902\n26903\n26904\n26905\n26906\n26907\n26908\n26909\n26910\n26911\n26912\n26913\n26914\n26915\n26916\n26917\n26918\n26919\n26920\n26921\n26922\n26923\n26924\n26925\n26926\n26927\n26928\n26929\n26930\n26931\n26932\n26933\n26934\n26935\n26936\n26937\n26938\n26939\n26940\n26941\n26942\n26943\n26944\n26945\n26946\n26947\n26948\n26949\n26950\n26951\n26952\n26953\n26954\n26955\n26956\n26957\n26958\n26959\n26960\n26961\n26962\n26963\n26964\n26965\n26966\n26967\n26968\n26969\n26970\n26971\n26972\n26973\n26974\n26975\n26976\n26977\n26978\n26979\n26980\n26981\n26982\n26983\n26984\n26985\n26986\n26987\n26988\n26989\n26990\n26991\n26992\n26993\n26994\n26995\n26996\n26997\n26998\n26999\n27000\n27001\n27002\n27003\n27004\n27005\n27006\n27007\n27008\n27009\n27010\n27011\n27012\n27013\n27014\n27015\n27016\n27017\n27018\n27019\n27020\n27021\n27022\n27023\n27024\n27025\n27026\n27027\n27028\n27029\n27030\n27031\n27032\n27033\n27034\n27035\n27036\n27037\n27038\n27039\n27040\n27041\n27042\n27043\n27044\n27045\n27046\n27047\n27048\n27049\n27050\n27051\n27052\n27053\n27054\n27055\n27056\n27057\n27058\n27059\n27060\n27061\n27062\n27063\n27064\n27065\n27066\n27067\n27068\n27069\n27070\n27071\n27072\n27073\n27074\n27075\n27076\n27077\n27078\n27079\n27080\n27081\n27082\n27083\n27084\n27085\n27086\n27087\n27088\n27089\n27090\n27091\n27092\n27093\n27094\n27095\n27096\n27097\n27098\n27099\n27100\n27101\n27102\n27103\n27104\n27105\n27106\n27107\n27108\n27109\n27110\n27111\n27112\n27113\n27114\n27115\n27116\n27117\n27118\n27119\n27120\n27121\n27122\n27123\n27124\n27125\n27126\n27127\n27128\n27129\n27130\n27131\n27132\n27133\n27134\n27135\n27136\n27137\n27138\n27139\n27140\n27141\n27142\n27143\n27144\n27145\n27146\n27147\n27148\n27149\n27150\n27151\n27152\n27153\n27154\n27155\n27156\n27157\n27158\n27159\n27160\n27161\n27162\n27163\n27164\n27165\n27166\n27167\n27168\n27169\n27170\n27171\n27172\n27173\n27174\n27175\n27176\n27177\n27178\n27179\n27180\n27181\n27182\n27183\n27184\n27185\n27186\n27187\n27188\n27189\n27190\n27191\n27192\n27193\n27194\n27195\n27196\n27197\n27198\n27199\n27200\n27201\n27202\n27203\n27204\n27205\n27206\n27207\n27208\n27209\n27210\n27211\n27212\n27213\n27214\n27215\n27216\n27217\n27218\n27219\n27220\n27221\n27222\n27223\n27224\n27225\n27226\n27227\n27228\n27229\n27230\n27231\n27232\n27233\n27234\n27235\n27236\n27237\n27238\n27239\n27240\n27241\n27242\n27243\n27244\n27245\n27246\n27247\n27248\n27249\n27250\n27251\n27252\n27253\n27254\n27255\n27256\n27257\n27258\n27259\n27260\n27261\n27262\n27263\n27264\n27265\n27266\n27267\n27268\n27269\n27270\n27271\n27272\n27273\n27274\n27275\n27276\n27277\n27278\n27279\n27280\n27281\n27282\n27283\n27284\n27285\n27286\n27287\n27288\n27289\n27290\n27291\n27292\n27293\n27294\n27295\n27296\n27297\n27298\n27299\n27300\n27301\n27302\n27303\n27304\n27305\n27306\n27307\n27308\n27309\n27310\n27311\n27312\n27313\n27314\n27315\n27316\n27317\n27318\n27319\n27320\n27321\n27322\n27323\n27324\n27325\n27326\n27327\n27328\n27329\n27330\n27331\n27332\n27333\n27334\n27335\n27336\n27337\n27338\n27339\n27340\n27341\n27342\n27343\n27344\n27345\n27346\n27347\n27348\n27349\n27350\n27351\n27352\n27353\n27354\n27355\n27356\n27357\n27358\n27359\n27360\n27361\n27362\n27363\n27364\n27365\n27366\n27367\n27368\n27369\n27370\n27371\n27372\n27373\n27374\n27375\n27376\n27377\n27378\n27379\n27380\n27381\n27382\n27383\n27384\n27385\n27386\n27387\n27388\n27389\n27390\n27391\n27392\n27393\n27394\n27395\n27396\n27397\n27398\n27399\n27400\n27401\n27402\n27403\n27404\n27405\n27406\n27407\n27408\n27409\n27410\n27411\n27412\n27413\n27414\n27415\n27416\n27417\n27418\n27419\n27420\n27421\n27422\n27423\n27424\n27425\n27426\n27427\n27428\n27429\n27430\n27431\n27432\n27433\n27434\n27435\n27436\n27437\n27438\n27439\n27440\n27441\n27442\n27443\n27444\n27445\n27446\n27447\n27448\n27449\n27450\n27451\n27452\n27453\n27454\n27455\n27456\n27457\n27458\n27459\n27460\n27461\n27462\n27463\n27464\n27465\n27466\n27467\n27468\n27469\n27470\n27471\n27472\n27473\n27474\n27475\n27476\n27477\n27478\n27479\n27480\n27481\n27482\n27483\n27484\n27485\n27486\n27487\n27488\n27489\n27490\n27491\n27492\n27493\n27494\n27495\n27496\n27497\n27498\n27499\n27500\n27501\n27502\n27503\n27504\n27505\n27506\n27507\n27508\n27509\n27510\n27511\n27512\n27513\n27514\n27515\n27516\n27517\n27518\n27519\n27520\n27521\n27522\n27523\n27524\n27525\n27526\n27527\n27528\n27529\n27530\n27531\n27532\n27533\n27534\n27535\n27536\n27537\n27538\n27539\n27540\n27541\n27542\n27543\n27544\n27545\n27546\n27547\n27548\n27549\n27550\n27551\n27552\n27553\n27554\n27555\n27556\n27557\n27558\n27559\n27560\n27561\n27562\n27563\n27564\n27565\n27566\n27567\n27568\n27569\n27570\n27571\n27572\n27573\n27574\n27575\n27576\n27577\n27578\n27579\n27580\n27581\n27582\n27583\n27584\n27585\n27586\n27587\n27588\n27589\n27590\n27591\n27592\n27593\n27594\n27595\n27596\n27597\n27598\n27599\n27600\n27601\n27602\n27603\n27604\n27605\n27606\n27607\n27608\n27609\n27610\n27611\n27612\n27613\n27614\n27615\n27616\n27617\n27618\n27619\n27620\n27621\n27622\n27623\n27624\n27625\n27626\n27627\n27628\n27629\n27630\n27631\n27632\n27633\n27634\n27635\n27636\n27637\n27638\n27639\n27640\n27641\n27642\n27643\n27644\n27645\n27646\n27647\n27648\n27649\n27650\n27651\n27652\n27653\n27654\n27655\n27656\n27657\n27658\n27659\n27660\n27661\n27662\n27663\n27664\n27665\n27666\n27667\n27668\n27669\n27670\n27671\n27672\n27673\n27674\n27675\n27676\n27677\n27678\n27679\n27680\n27681\n27682\n27683\n27684\n27685\n27686\n27687\n27688\n27689\n27690\n27691\n27692\n27693\n27694\n27695\n27696\n27697\n27698\n27699\n27700\n27701\n27702\n27703\n27704\n27705\n27706\n27707\n27708\n27709\n27710\n27711\n27712\n27713\n27714\n27715\n27716\n27717\n27718\n27719\n27720\n27721\n27722\n27723\n27724\n27725\n27726\n27727\n27728\n27729\n27730\n27731\n27732\n27733\n27734\n27735\n27736\n27737\n27738\n27739\n27740\n27741\n27742\n27743\n27744\n27745\n27746\n27747\n27748\n27749\n27750\n27751\n27752\n27753\n27754\n27755\n27756\n27757\n27758\n27759\n27760\n27761\n27762\n27763\n27764\n27765\n27766\n27767\n27768\n27769\n27770\n27771\n27772\n27773\n27774\n27775\n27776\n27777\n27778\n27779\n27780\n27781\n27782\n27783\n27784\n27785\n27786\n27787\n27788\n27789\n27790\n27791\n27792\n27793\n27794\n27795\n27796\n27797\n27798\n27799\n27800\n27801\n27802\n27803\n27804\n27805\n27806\n27807\n27808\n27809\n27810\n27811\n27812\n27813\n27814\n27815\n27816\n27817\n27818\n27819\n27820\n27821\n27822\n27823\n27824\n27825\n27826\n27827\n27828\n27829\n27830\n27831\n27832\n27833\n27834\n27835\n27836\n27837\n27838\n27839\n27840\n27841\n27842\n27843\n27844\n27845\n27846\n27847\n27848\n27849\n27850\n27851\n27852\n27853\n27854\n27855\n27856\n27857\n27858\n27859\n27860\n27861\n27862\n27863\n27864\n27865\n27866\n27867\n27868\n27869\n27870\n27871\n27872\n27873\n27874\n27875\n27876\n27877\n27878\n27879\n27880\n27881\n27882\n27883\n27884\n27885\n27886\n27887\n27888\n27889\n27890\n27891\n27892\n27893\n27894\n27895\n27896\n27897\n27898\n27899\n27900\n27901\n27902\n27903\n27904\n27905\n27906\n27907\n27908\n27909\n27910\n27911\n27912\n27913\n27914\n27915\n27916\n27917\n27918\n27919\n27920\n27921\n27922\n27923\n27924\n27925\n27926\n27927\n27928\n27929\n27930\n27931\n27932\n27933\n27934\n27935\n27936\n27937\n27938\n27939\n27940\n27941\n27942\n27943\n27944\n27945\n27946\n27947\n27948\n27949\n27950\n27951\n27952\n27953\n27954\n27955\n27956\n27957\n27958\n27959\n27960\n27961\n27962\n27963\n27964\n27965\n27966\n27967\n27968\n27969\n27970\n27971\n27972\n27973\n27974\n27975\n27976\n27977\n27978\n27979\n27980\n27981\n27982\n27983\n27984\n27985\n27986\n27987\n27988\n27989\n27990\n27991\n27992\n27993\n27994\n27995\n27996\n27997\n27998\n27999\n28000\n28001\n28002\n28003\n28004\n28005\n28006\n28007\n28008\n28009\n28010\n28011\n28012\n28013\n28014\n28015\n28016\n28017\n28018\n28019\n28020\n28021\n28022\n28023\n28024\n28025\n28026\n28027\n28028\n28029\n28030\n28031\n28032\n28033\n28034\n28035\n28036\n28037\n28038\n28039\n28040\n28041\n28042\n28043\n28044\n28045\n28046\n28047\n28048\n28049\n28050\n28051\n28052\n28053\n28054\n28055\n28056\n28057\n28058\n28059\n28060\n28061\n28062\n28063\n28064\n28065\n28066\n28067\n28068\n28069\n28070\n28071\n28072\n28073\n28074\n28075\n28076\n28077\n28078\n28079\n28080\n28081\n28082\n28083\n28084\n28085\n28086\n28087\n28088\n28089\n28090\n28091\n28092\n28093\n28094\n28095\n28096\n28097\n28098\n28099\n28100\n28101\n28102\n28103\n28104\n28105\n28106\n28107\n28108\n28109\n28110\n28111\n28112\n28113\n28114\n28115\n28116\n28117\n28118\n28119\n28120\n28121\n28122\n28123\n28124\n28125\n28126\n28127\n28128\n28129\n28130\n28131\n28132\n28133\n28134\n28135\n28136\n28137\n28138\n28139\n28140\n28141\n28142\n28143\n28144\n28145\n28146\n28147\n28148\n28149\n28150\n28151\n28152\n28153\n28154\n28155\n28156\n28157\n28158\n28159\n28160\n28161\n28162\n28163\n28164\n28165\n28166\n28167\n28168\n28169\n28170\n28171\n28172\n28173\n28174\n28175\n28176\n28177\n28178\n28179\n28180\n28181\n28182\n28183\n28184\n28185\n28186\n28187\n28188\n28189\n28190\n28191\n28192\n28193\n28194\n28195\n28196\n28197\n28198\n28199\n28200\n28201\n28202\n28203\n28204\n28205\n28206\n28207\n28208\n28209\n28210\n28211\n28212\n28213\n28214\n28215\n28216\n28217\n28218\n28219\n28220\n28221\n28222\n28223\n28224\n28225\n28226\n28227\n28228\n28229\n28230\n28231\n28232\n28233\n28234\n28235\n28236\n28237\n28238\n28239\n28240\n28241\n28242\n28243\n28244\n28245\n28246\n28247\n28248\n28249\n28250\n28251\n28252\n28253\n28254\n28255\n28256\n28257\n28258\n28259\n28260\n28261\n28262\n28263\n28264\n28265\n28266\n28267\n28268\n28269\n28270\n28271\n28272\n28273\n28274\n28275\n28276\n28277\n28278\n28279\n28280\n28281\n28282\n28283\n28284\n28285\n28286\n<!-- saved from url=(0031)https://www.hiperdino.es/c9495/ -->\n<html>\n<head>\n<meta name=\"generator\" content=\n\"HTML Tidy for Mac OS X (vers 31 October 2006 - Apple Inc. build 15.18.1), see www.w3.org\">\n<meta http-equiv=\"Content-Type\" content=\n\"text/html; charset=us-ascii\">\n<title></title>\n</head>\n<body>\n<div class=\"line-gutter-backdrop\"></div>\n<table>\n<tbody>\n<tr>\n<td class=\"line-number\" value=\"1\"></td>\n<td class=\"line-content\"><span class=\"html-doctype\">&lt;!doctype\nhtml&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;html\n<span class=\"html-attribute-name\">lang</span>=\"<span class=\n\"html-attribute-value\">es</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;head\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"5\"></td>\n<td class=\"line-content\">var BASE_URL =\n'https://www.hiperdino.es/c9495/';</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"6\"></td>\n<td class=\"line-content\">var require = {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"7\"></td>\n<td class=\"line-content\">\"baseUrl\":\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"8\"></td>\n<td class=\"line-content\">};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"9\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"10\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;meta\n<span class=\"html-attribute-name\">charset</span>=\"<span class=\n\"html-attribute-value\">utf-8</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"11\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;meta\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">description</span>\" <span class=\n\"html-attribute-name\">content</span>=\"<span class=\n\"html-attribute-value\">HiperDino, los mejores precios de Canarias,\ntambi&#195;&#169;n online. Haz tu compra online,\ndesc&#195;&#161;rgate nuestro folleto de ofertas, localiza tu\ntienda m&#195;&#161;s cercana o accede a nuestro portal de\nempleo.</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"12\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;meta\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">robots</span>\" <span class=\n\"html-attribute-name\">content</span>=\"<span class=\n\"html-attribute-value\">INDEX,FOLLOW</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"13\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;meta\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">viewport</span>\" <span class=\n\"html-attribute-name\">content</span>=\"<span class=\n\"html-attribute-value\">width=device-width,\ninitial-scale=1</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"14\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;meta\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">format-detection</span>\" <span class=\n\"html-attribute-name\">content</span>=\"<span class=\n\"html-attribute-value\">telephone=no</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"15\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;title&gt;</span>Hiperdino - los mejores precios de\nCanarias, ahora tambi&#195;&#169;n online<span class=\n\"html-tag\">&lt;/title&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"16\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/mage/calendar.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/mage/calendar.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"17\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"18\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-grid.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-grid.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"19\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-reboot.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/bootstrap-reboot.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"20\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/main.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/main.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"21\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/custom.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/custom.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"22\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/animate.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/animate.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"23\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/style2.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/css/style2.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"24\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/Itoris_MultipleWishlists/css/mwishlist.css\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/Itoris_MultipleWishlists/css/mwishlist.css</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"25\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://fonts.googleapis.com/css?family=Source+Sans+Pro\" rel=\n\"noreferrer noopener\">https://fonts.googleapis.com/css?family=Source+Sans+Pro</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"26\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/javascript</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/pub/static/version1556565682/_cache/merged/3db68f5875afbd8f7d2ae9564f6c96d6.min.js\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/pub/static/version1556565682/_cache/merged/3db68f5875afbd8f7d2ae9564f6c96d6.min.js</a>\"&gt;</span><span class=\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"27\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">icon</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">image/x-icon</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/favicon/default/icono-online64x64.png\"\nrel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/favicon/default/icono-online64x64.png</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"28\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">shortcut icon</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">image/x-icon</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/favicon/default/icono-online64x64.png\"\nrel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/favicon/default/icono-online64x64.png</a>\"\n/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"29\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!--\nFacebook Pixel Code --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"30\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"31\"></td>\n<td class=\"line-content\">!function(f,b,e,v,n,t,s)</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"32\"></td>\n<td class=\"line-content\">\n{if(f.fbq)return;n=f.fbq=function(){n.callMethod?</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"33\"></td>\n<td class=\"line-content\">\nn.callMethod.apply(n,arguments):n.queue.push(arguments)};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"34\"></td>\n<td class=\"line-content\">\nif(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"35\"></td>\n<td class=\"line-content\">\nn.queue=[];t=b.createElement(e);t.async=!0;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"36\"></td>\n<td class=\"line-content\">\nt.src=v;s=b.getElementsByTagName(e)[0];</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"37\"></td>\n<td class=\"line-content\">\ns.parentNode.insertBefore(t,s)}(window,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"38\"></td>\n<td class=\"line-content\">\ndocument,'script','https://connect.facebook.net/en_US/fbevents.js');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"39\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"40\"></td>\n<td class=\"line-content\">fbq('init', '517201008809116');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"41\"></td>\n<td class=\"line-content\">fbq('track', 'PageView');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"42\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"43\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"44\"></td>\n<td class=\"line-content\">&lt;img height='1' width='1'\nstyle='display:none'</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"45\"></td>\n<td class=\"line-content\">\nsrc='https://www.facebook.com/tr?id=517201008809116&amp;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"46\"></td>\n<td class=\"line-content\">ev=PageView&amp;noscript=1'/&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"47\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"48\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- End\nFacebook Pixel Code --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"49\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;link\n<span class=\"html-attribute-name\">rel</span>=\"<span class=\n\"html-attribute-value\">stylesheet</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/css</span>\" <span class=\n\"html-attribute-name\">media</span>=\"<span class=\n\"html-attribute-value\">all</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"50\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css\"\nrel=\n\"noreferrer noopener\">//maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css</a>\"/&gt;\n<span class=\"html-tag\">&lt;/head&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"51\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;body\n<span class=\n\"html-attribute-name\">data-container</span>=\"<span class=\n\"html-attribute-value\">body</span>\" <span class=\n\"html-attribute-name\">data-mage-init</span>='<span class=\n\"html-attribute-value\">{\"loaderAjax\": {}, \"loader\": { \"icon\":\n\"https://www.hiperdino.es/pub/static/version1556565682/frontend/Hiperdino/hiperdino/es_ES/images/loader-2.gif\"}}</span>'\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cms-home cms-index-index\npage-layout-1column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"52\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;section&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"53\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"54\"></td>\n<td class=\"line-content\">try {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"55\"></td>\n<td class=\"line-content\">if (!window.localStorage ||\n!window.sessionStorage) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"56\"></td>\n<td class=\"line-content\">throw new Error();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"57\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"58\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"59\"></td>\n<td class=\"line-content\">localStorage.setItem('storage_test',\n1);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"60\"></td>\n<td class=\"line-content\">\nlocalStorage.removeItem('storage_test');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"61\"></td>\n<td class=\"line-content\">} catch(e) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"62\"></td>\n<td class=\"line-content\">(function () {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"63\"></td>\n<td class=\"line-content\">var Storage = function (type) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"64\"></td>\n<td class=\"line-content\">var data;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"65\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"66\"></td>\n<td class=\"line-content\">function createCookie(name, value, days)\n{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"67\"></td>\n<td class=\"line-content\">var date, expires;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"68\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"69\"></td>\n<td class=\"line-content\">if (days) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"70\"></td>\n<td class=\"line-content\">date = new Date();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"71\"></td>\n<td class=\"line-content\">date.setTime(date.getTime()+(days * 24 *\n60 * 60 * 1000));</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"72\"></td>\n<td class=\"line-content\">expires = '; expires=' +\ndate.toGMTString();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"73\"></td>\n<td class=\"line-content\">} else {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"74\"></td>\n<td class=\"line-content\">expires = '';</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"75\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"76\"></td>\n<td class=\"line-content\">document.cookie = name + '=' +\nvalue+expires+'; path=/';</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"77\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"78\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"79\"></td>\n<td class=\"line-content\">function readCookie(name) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"80\"></td>\n<td class=\"line-content\">var nameEQ = name + '=',</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"81\"></td>\n<td class=\"line-content\">ca = document.cookie.split(';'),</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"82\"></td>\n<td class=\"line-content\">i = 0,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"83\"></td>\n<td class=\"line-content\">c;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"84\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"85\"></td>\n<td class=\"line-content\">for (i=0; i &lt; ca.length; i++) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"86\"></td>\n<td class=\"line-content\">c = ca[i];</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"87\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"88\"></td>\n<td class=\"line-content\">while (c.charAt(0) === ' ') {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"89\"></td>\n<td class=\"line-content\">c = c.substring(1,c.length);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"90\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"91\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"92\"></td>\n<td class=\"line-content\">if (c.indexOf(nameEQ) === 0) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"93\"></td>\n<td class=\"line-content\">return c.substring(nameEQ.length,\nc.length);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"94\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"95\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"96\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"97\"></td>\n<td class=\"line-content\">return null;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"98\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"99\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"100\"></td>\n<td class=\"line-content\">function setData(data) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"101\"></td>\n<td class=\"line-content\">data =\nencodeURIComponent(JSON.stringify(data));</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"102\"></td>\n<td class=\"line-content\">createCookie(type === 'session' ?\ngetSessionName() : 'localStorage', data, 365);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"103\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"104\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"105\"></td>\n<td class=\"line-content\">function clearData() {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"106\"></td>\n<td class=\"line-content\">createCookie(type === 'session' ?\ngetSessionName() : 'localStorage', '', 365);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"107\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"108\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"109\"></td>\n<td class=\"line-content\">function getData() {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"110\"></td>\n<td class=\"line-content\">var data = type === 'session' ?\nreadCookie(getSessionName()) : readCookie('localStorage');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"111\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"112\"></td>\n<td class=\"line-content\">return data ?\nJSON.parse(decodeURIComponent(data)) : {};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"113\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"114\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"115\"></td>\n<td class=\"line-content\">function getSessionName() {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"116\"></td>\n<td class=\"line-content\">if (!window.name) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"117\"></td>\n<td class=\"line-content\">window.name = new Date().getTime();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"118\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"119\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"120\"></td>\n<td class=\"line-content\">return 'sessionStorage' +\nwindow.name;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"121\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"122\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"123\"></td>\n<td class=\"line-content\">data = getData();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"124\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"125\"></td>\n<td class=\"line-content\">return {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"126\"></td>\n<td class=\"line-content\">length: 0,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"127\"></td>\n<td class=\"line-content\">clear: function () {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"128\"></td>\n<td class=\"line-content\">data = {};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"129\"></td>\n<td class=\"line-content\">this.length = 0;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"130\"></td>\n<td class=\"line-content\">clearData();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"131\"></td>\n<td class=\"line-content\">},</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"132\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"133\"></td>\n<td class=\"line-content\">getItem: function (key) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"134\"></td>\n<td class=\"line-content\">return data[key] === undefined ? null :\ndata[key];</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"135\"></td>\n<td class=\"line-content\">},</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"136\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"137\"></td>\n<td class=\"line-content\">key: function (i) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"138\"></td>\n<td class=\"line-content\">var ctr = 0,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"139\"></td>\n<td class=\"line-content\">k;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"140\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"141\"></td>\n<td class=\"line-content\">for (k in data) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"142\"></td>\n<td class=\"line-content\">if (ctr.toString() === i.toString())\n{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"143\"></td>\n<td class=\"line-content\">return k;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"144\"></td>\n<td class=\"line-content\">} else {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"145\"></td>\n<td class=\"line-content\">ctr++</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"146\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"147\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"148\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"149\"></td>\n<td class=\"line-content\">return null;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"150\"></td>\n<td class=\"line-content\">},</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"151\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"152\"></td>\n<td class=\"line-content\">removeItem: function (key) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"153\"></td>\n<td class=\"line-content\">delete data[key];</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"154\"></td>\n<td class=\"line-content\">this.length--;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"155\"></td>\n<td class=\"line-content\">setData(data);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"156\"></td>\n<td class=\"line-content\">},</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"157\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"158\"></td>\n<td class=\"line-content\">setItem: function (key, value) {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"159\"></td>\n<td class=\"line-content\">data[key] = value.toString();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"160\"></td>\n<td class=\"line-content\">this.length++;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"161\"></td>\n<td class=\"line-content\">setData(data);</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"162\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"163\"></td>\n<td class=\"line-content\">};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"164\"></td>\n<td class=\"line-content\">};</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"165\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"166\"></td>\n<td class=\"line-content\">window.localStorage.__proto__ =\nwindow.localStorage = new Storage('local');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"167\"></td>\n<td class=\"line-content\">window.sessionStorage.__proto__ =\nwindow.sessionStorage = new Storage('session');</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"168\"></td>\n<td class=\"line-content\">})();</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"169\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"170\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"171\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"172\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"173\"></td>\n<td class=\"line-content\">{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"174\"></td>\n<td class=\"line-content\">\"*\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"175\"></td>\n<td class=\"line-content\">\"mage/cookies\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"176\"></td>\n<td class=\"line-content\">\"expires\": null,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"177\"></td>\n<td class=\"line-content\">\"path\": \"/\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"178\"></td>\n<td class=\"line-content\">\"domain\": \".www.hiperdino.es\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"179\"></td>\n<td class=\"line-content\">\"secure\": false,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"180\"></td>\n<td class=\"line-content\">\"lifetime\": \"86400\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"181\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"182\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"183\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"184\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"185\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"186\"></td>\n<td class=\"line-content\">&lt;div class=\"message global\nnoscript\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"187\"></td>\n<td class=\"line-content\">&lt;div class=\"content\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"188\"></td>\n<td class=\"line-content\">&lt;p&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"189\"></td>\n<td class=\"line-content\">&lt;strong&gt;Parece que JavaScript\nest&#195;&#161; deshabilitado en su navegador.&lt;/strong&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"190\"></td>\n<td class=\"line-content\">&lt;span&gt;For the best experience on our\nsite, be sure to turn on Javascript in your\nbrowser.&lt;/span&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"191\"></td>\n<td class=\"line-content\">&lt;/p&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"192\"></td>\n<td class=\"line-content\">&lt;/div&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"193\"></td>\n<td class=\"line-content\">&lt;/div&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"194\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"195\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">alertdialog</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"196\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">tabindex</span>=\"<span class=\n\"html-attribute-value\">-1</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"197\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">message global cookie</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"198\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">notice-cookie-block</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"199\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">style</span>=\"<span class=\n\"html-attribute-value\">display: none;</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"200\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">document</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">content</span>\" <span class=\n\"html-attribute-name\">tabindex</span>=\"<span class=\n\"html-attribute-value\">0</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"201\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;p <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"202\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;strong&gt;</span>Este sitio usa cookies propias y de\nterceros para facilitar la navegaci&#195;&#179;n, obtener\ninformaci&#195;&#179;n y estad&#195;&#173;sticas de uso de nuestros\nvisitantes, y ofrecer contenido multimedia integrado.<span class=\n\"html-tag\">&lt;/strong&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"203\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span>Para m&#195;&#161;s\ninformaci&#195;&#179;n consulte nuestra <span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-cookies/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-cookies/</a>\"&gt;</span>POL&#195;TICA\nDE COOKIES.<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"204\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/p&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"205\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">actions</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"206\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">btn-cookie-allow</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">action allow primary</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"207\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span>Aceptar<span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"208\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"209\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"210\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"211\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"212\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"213\"></td>\n<td class=\"line-content\">{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"214\"></td>\n<td class=\"line-content\">\"#notice-cookie-block\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"215\"></td>\n<td class=\"line-content\">\"cookieNotices\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"216\"></td>\n<td class=\"line-content\">\"cookieAllowButtonSelector\":\n\"#btn-cookie-allow\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"217\"></td>\n<td class=\"line-content\">\"cookieName\":\n\"user_allowed_save_cookie\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"218\"></td>\n<td class=\"line-content\">\"cookieValue\": {\"4\":1},</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"219\"></td>\n<td class=\"line-content\">\"cookieLifetime\": 31536000,</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"220\"></td>\n<td class=\"line-content\">\"noCookiesUrl\":\n\"https\\u003A\\u002F\\u002Fwww.hiperdino.es\\u002Fc9495\\u002Fcookie\\u002Findex\\u002FnoCookies\\u002F\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"221\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"222\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"223\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"224\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"225\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"226\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"227\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"228\"></td>\n<td class=\"line-content\">&lt;iframe\nsrc=\"//www.googletagmanager.com/ns.html?id=GTM-MF35972\" height=\"0\"\nwidth=\"0\"\nstyle=\"display:none;visibility:hidden\"&gt;&lt;/iframe&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"229\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/noscript&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"230\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"231\"></td>\n<td class=\"line-content\">\n{\"*\":{\"yireoGoogleTagManager\":{\"attributes\":{\"pageType\":\"cms\\/index\\/index\"},\"id\":\"GTM-MF35972\"}}}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"232\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"233\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"234\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/section&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">mainView</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main__window</span>\"&gt;</span><span class=\n\"html-tag\">&lt;header <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">page-header</span>\"&gt;</span><span class=\n\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"235\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__wrapper block--container\nflex-container flex-row justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"236\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu-left block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"237\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"238\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper\nis-hidden-mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"239\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/contact/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/contact/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"240\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"241\"></td>\n<td class=\"line-content\">Atenci&#195;&#179;n al cliente\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"242\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"243\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"244\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper\nis-hidden-mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"245\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/noticias/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/noticias/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"246\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Noticias<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"247\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"248\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"249\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper\nis-hidden-mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"250\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/folletos/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/folletos/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"251\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Folletos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"252\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"253\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"254\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper\nis-hidden-mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"255\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/empleo/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/empleo/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"256\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Empleo<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"257\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"258\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"259\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper\nis-hidden-mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"260\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tiendas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tiendas/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"261\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Nuestras tiendas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"262\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"263\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"264\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"265\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"266\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu-right block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"267\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"268\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"269\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">showModalCP</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"270\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"271\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"272\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper flex-item\nhide-in-hdcheckout</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">openCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-postcode</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"273\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"274\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--location\nflex-item</span>\"&gt;</span><span class=\"html-tag\">&lt;i\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-location-pin</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"275\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Comprando para<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"276\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__box\nflex-item</span>\"&gt;</span>38201<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"277\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"278\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"279\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"280\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item item--wrapper flex-item\nhide-out-hdcheckout</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"281\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"282\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--location\nflex-item</span>\"&gt;</span><span class=\"html-tag\">&lt;i\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-location-pin</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"283\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Comprando para<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"284\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__box flex-item</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">hdcheckout-buying-for</span>\"&gt;</span>38201<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"285\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"286\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"287\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"288\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top-bar-menu__item\ntop-bar-menu__item--horary item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"289\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center action_timeslotsModal</span>\" <span class=\n\"html-attribute-name\">data-source-url</span>=\"\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"290\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-hasbooking</span>=\"\" <span class=\n\"html-attribute-name\">data-time</span>=\"\" <span class=\n\"html-attribute-name\">data-max-time</span>=\"<span class=\n\"html-attribute-value\">30</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"291\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--clock\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"292\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-clock</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"293\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"294\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text\nflex-item</span>\"&gt;</span>Horarios de entrega<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"295\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"296\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"297\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"298\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"299\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"300\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"301\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">main-menu</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"302\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"303\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu-left block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"304\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"305\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item category--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"306\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__group category--button\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"307\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__hamburger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"308\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"309\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"310\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"311\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"312\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"313\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"314\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"315\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"316\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__logo\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"317\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"318\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"319\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"320\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"321\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"322\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu-center block--wrapper flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"323\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"324\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item search--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"325\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search_mini_form</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/catalogsearch/result/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">get</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"326\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"327\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu-search\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"328\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu-search--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"329\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--search\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"330\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"331\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-search\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"332\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"333\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"334\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input--search input-text input__text\nflex-item flex-double</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"335\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Buscar productos</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"336\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search-input</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"337\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"338\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">q</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"339\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">value</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"340\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">maxlength</span>=\"<span class=\n\"html-attribute-value\">128</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"341\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">combobox</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"342\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">aria-haspopup</span>=\"<span class=\n\"html-attribute-value\">false</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"343\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">aria-autocomplete</span>=\"<span class=\n\"html-attribute-value\">both</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"344\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">autocomplete</span>=\"<span class=\n\"html-attribute-value\">off</span>\"/&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"345\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--search search--clear\nflex-item is-invisible</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"346\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">searchClear</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"347\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"348\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"349\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"350\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"351\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"352\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"353\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"354\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"355\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"356\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"357\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"358\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"359\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu-right block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"360\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\njustify-end items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"361\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item search-mobile item--wrapper\nflex-item</span>\" &gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"362\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search-mobile-icon</span>\" <span class=\n\"html-attribute-name\">href</span>=\"\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"363\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"364\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-search</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"365\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"366\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"367\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"368\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"369\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">show-wishlists</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\njustify-center items-center</span>\" <span class=\n\"html-attribute-name\">data-logged-in</span>=\"\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"370\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdwishlists/xhr/all/viewAll/1/</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"371\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--options-vertical\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"372\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-option</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"373\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"374\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"375\"></td>\n<td class=\"line-content\">Mis listas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"376\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"377\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"378\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"379\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\njustify-center items-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">openCustomModal</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"380\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-login</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"381\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"382\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-user</span>\"&gt;</span><span class=\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"383\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"384\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">user-mobile menu__text\nflex-item</span>\"&gt;</span>Mi Cuenta<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"385\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"386\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"387\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item basket--wrapper\nbasket--mobile flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"388\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">show-cart-mobile</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"389\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--basket\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"390\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-icon-cart</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"391\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"392\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">badge\nis-invisible</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"393\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"394\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"395\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item basket--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"396\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">show-cart</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\njustify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"397\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdcheckout/cart/info/</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"398\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--basket flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"399\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-basket</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"400\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"401\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__price\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"402\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price</span>\"&gt;</span>0,00&nbsp;&#226;&#8218;&#172;<span class=\"html-tag\">&lt;/span&gt;</span>\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"403\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"404\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/div&gt;</span>\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"405\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"406\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"407\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"408\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">main-menu-mobile</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu main-menu--mobile\nis-invisible</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"409\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"410\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu-center block--wrapper flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"411\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"412\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item search--wrapper-mobile\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"413\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search_mini_form_mobile</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/catalogsearch/result/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">get</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"414\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"415\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu-search\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"416\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu-search--container\nmenu-search--container-mobile flex-container justify-between\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"417\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"418\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"419\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--search flex-item</span>\"\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"420\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"421\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon-search\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"422\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"423\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"424\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input--search input__text flex-item\nflex-double</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"425\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Buscar productos</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"426\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">search-mobile-input</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"427\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"428\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">q</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"429\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">value</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"430\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">maxlength</span>=\"<span class=\n\"html-attribute-value\">128</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"431\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">combobox</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"432\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">aria-haspopup</span>=\"<span class=\n\"html-attribute-value\">false</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"433\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">aria-autocomplete</span>=\"<span class=\n\"html-attribute-value\">both</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"434\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">autocomplete</span>=\"<span class=\n\"html-attribute-value\">off</span>\" /&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"435\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"436\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"437\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"438\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--search search--clear\nflex-item is-invisible</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">searchMobileClear</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"439\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"440\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"441\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"442\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"443\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"444\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"445\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"446\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"447\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"448\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"449\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"450\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"451\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"452\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-login\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"453\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper dialogBox--wrapper-modal\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"454\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__login\ndialogBox__item--sixe-fixed flex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"455\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control\nquickview__control--back</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"456\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__back\nflex-container flex-row justify-center items-center\nlogin__back</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">backPostcodeFromLogin</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"457\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-arrow_back\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"458\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"459\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"460\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"461\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"462\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-login</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"463\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"464\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"465\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"466\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__left\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"467\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"468\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\ndialogBox__description--has-not-margin\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"469\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"470\"></td>\n<td class=\"line-content\">Ya tengo una cuenta. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"471\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"472\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"473\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"474\"></td>\n<td class=\"line-content\">Iniciar sesi&#195;&#179;n. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"475\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"476\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">error-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"477\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"478\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">success-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"479\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"480\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-login</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_customer/account/loginAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">login-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"481\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span>\n<span class=\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"482\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"483\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"484\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"485\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">login[username]</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Correo electr&#195;&#179;nico</span>\"\n<span class=\"html-attribute-name\">required</span>&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"486\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">input</span>\"&gt;</span>Correo\nelectr&#195;&#179;nico<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"487\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"488\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"489\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"490\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"491\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"492\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"493\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"494\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"495\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"496\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">password</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">login[password]</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Contrase&#195;&#177;a</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"497\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">input</span>\"&gt;</span>Contrase&#195;&#177;a<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"498\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--password flex-item</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">togglePasswordVisibility</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"499\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"500\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-visibility\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"501\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"502\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"503\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"504\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"505\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"506\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"507\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__forgetPassword\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"508\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button flex-container flex-row\nitems-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">showForgotPassword</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"509\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"510\"></td>\n<td class=\"line-content\">&#194;&#191;Has olvidado tu\ncontrase&#195;&#177;a? <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"511\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"512\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"513\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"514\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">tryLogin</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"515\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"516\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"517\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"518\"></td>\n<td class=\"line-content\">Continuar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"519\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"520\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"521\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"522\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"523\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"524\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"525\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"526\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"527\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__right flex-item\nhas-margin-top</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"528\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"529\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"530\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"531\"></td>\n<td class=\"line-content\">Crear una cuenta Hiperdino. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"532\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"533\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__description\ndialogBox__description--has-not-margin\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"534\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">description__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"535\"></td>\n<td class=\"line-content\">Por favor introduce tu\ninformaci&#195;&#179;n para crear una nueva cuenta. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"536\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"537\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper flex-item\nhas-margin-top</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"538\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal has-border button__complex--container\nflex-container flex-row justify-center items-center</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">showRegister</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"539\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"540\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"541\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"542\"></td>\n<td class=\"line-content\">Crear cuenta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"543\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"544\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"545\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"546\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"547\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"548\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"549\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"550\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"551\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"552\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"553\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"554\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"555\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-newsletter\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"556\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"557\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper dialogBox--wrapper-modal\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"558\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"559\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__item--little\nnot-padding dialogBox__newsMod dialogBox__item--sixe-fixed\nflex-container justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"560\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"561\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__left\ndialogBox__left--fullheight-image flex-item\npostal-results-wrapper__image\nis-hidden-mobile</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"562\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"563\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"564\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"565\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"566\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__right\ndialogBox__right-has-padding newsletterBox__right\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"567\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column justify-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"568\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"569\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"570\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text\ntitle__text--newsMod</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"571\"></td>\n<td class=\"line-content\">&#194;&#161;Gracias por formar parte de\nHiperDino Online! <span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"572\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"573\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"574\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__description\nnewsletter__description flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"575\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">description__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"576\"></td>\n<td class=\"line-content\">Si no te quieres perder nuestras ofertas\nespeciales, &#195;&#186;nete: <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"577\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"578\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"579\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">showModalNewsletter</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"580\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"581\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_newsletter/newsletter/subscribeAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">subscribe-newsletter-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"582\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"583\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"584\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"585\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--container button__complex--modal has-margin-bottom\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"586\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"587\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"588\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"589\"></td>\n<td class=\"line-content\">&nbsp;S&#195;&#173;, deseo estar informado\nde todas las promociones. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"590\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"591\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"592\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"593\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"594\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"595\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"596\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"597\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_newsletter/newsletter/denySubscribeAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">deny-newsletter-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"598\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"599\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"600\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex has-border\nbutton__complex--container button__complex--modal flex-container\nflex-row justify-center items-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">denyNewsletter</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"601\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"602\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"603\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"604\"></td>\n<td class=\"line-content\">No me interesa, gracias <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"605\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"606\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"607\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"608\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"609\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"610\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"611\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">info__small_text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"612\"></td>\n<td class=\"line-content\">Responsable:&nbsp;DINOSOL SUPERMERCADOS\nS.L.&nbsp;Finalidad:&nbsp;env&#195;&#173;o de newsletter y\ncomunicaciones comerciales con ofertas y promociones que puedan\nresultar de su inter&#195;&#169;s.&nbsp;Base de\nLegitimaci&#195;&#179;n:&nbsp;su consentimiento.&nbsp;Sus datos\npodr&#195;&#161;n ser cedidos a terceros. Sus datos\nser&#195;&#161;n conservados mientras no ejerza sus derechos de\nsupresi&#195;&#179;n u oposici&#195;&#179;n o revoque su\nconsentimiento.&nbsp;Derechos:&nbsp;Acceso,\nRectificaci&#195;&#179;n, Supresi&#195;&#179;n,\nOposici&#195;&#179;n, Portabilidad y Limitaci&#195;&#179;n del\ntratamiento. Puede revisar la informaci&#195;&#179;n ampliada en\nnuestra <span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">target</span>='<span class=\n\"html-attribute-value\">_blank</span>' <span class=\n\"html-attribute-name\">href</span>='<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-privacidad/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-privacidad/</a>'&gt;</span>P.Privacidad<span class=\"html-tag\">&lt;/a&gt;</span>\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"613\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"614\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"615\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"616\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"617\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"618\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"619\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"620\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"621\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-discount\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"622\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper dialogBox--wrapper-modal\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"623\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__login\ndialogBox__item--sixe-fixed flex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"624\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"625\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center items-center</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">closeCustomModal</span>\"\n<span class=\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-discount</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"626\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"627\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"628\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"629\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__full\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"630\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">discount-table</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\" <span class=\n\"html-attribute-name\">data-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdpromotions/cart/promotionsajax/</span>\"&gt;</span><span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"631\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"632\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"633\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"634\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"635\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"636\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"637\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-register dialogBox-modal\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"638\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">register-modal dialogBox--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"639\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"640\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-register</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_customer/account/createAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">register-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"641\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span>\n<span class=\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__register\nflex-container flex-column flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"642\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control\nquickview__control--back</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"643\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__back\nflex-container flex-row justify-center items-center</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">backLoginFromRegister</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"644\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-arrow_back\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"645\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"646\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"647\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"648\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center items-center</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">closeCustomModal</span>\"\n<span class=\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-register</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"649\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"650\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"651\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"652\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__register-item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"653\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content\nflex-container</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"654\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"655\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"656\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"657\"></td>\n<td class=\"line-content\">Crear una cuenta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"658\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"659\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"660\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"661\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__register-item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"662\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content\ndialogBox__content-columns flex-container flex-wrap\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"663\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__left\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"664\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"665\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">error-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"666\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"667\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"668\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"669\"></td>\n<td class=\"line-content\">Datos personales <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"670\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"671\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"672\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"673\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"674\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"675\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">firstname</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text text--input flex-item\nflex-double required-entry</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"676\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Nombre</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"677\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">firstname</span>\"&gt;</span>Nombre<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"678\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"679\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"680\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"681\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"682\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"683\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"684\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"685\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"686\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">lastname</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text text--input flex-item\nflex-double required-entry</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"687\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Apellidos</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"688\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">lastname</span>\"&gt;</span>Apellidos<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"689\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"690\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"691\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"692\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"693\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"694\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"695\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"696\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"697\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Correo\nelectr&#195;&#179;nico</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"698\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">email</span>\"&gt;</span>Correo\nelectr&#195;&#179;nico<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"699\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"700\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"701\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"702\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"703\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"704\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"705\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"706\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"707\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">tel</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">telephone</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Tel&#195;&#169;fono</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"708\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">telephone</span>\"&gt;</span>Tel&#195;&#169;fono<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"709\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"710\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"711\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"712\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"713\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"714\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"715\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"716\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"717\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">date</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">dob</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Fecha de nacimiento</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"718\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">dob</span>\"&gt;</span>Fecha de\nnacimiento<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"719\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"720\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"721\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"722\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"723\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"724\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"725\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"726\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"727\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">password</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">password</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"728\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Contrase&#195;&#177;a</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"729\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">password</span>\"&gt;</span>Contrase&#195;&#177;a<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"730\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button--password flex-item</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">togglePasswordVisibility</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"731\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"732\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-visibility\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"733\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"734\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"735\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"736\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"737\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"738\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"739\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"740\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"741\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__right\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"742\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"743\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"744\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"745\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"746\"></td>\n<td class=\"line-content\">Direcci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"747\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"748\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"749\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"750\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"751\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"752\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"753\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">street</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Calle</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"754\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">street</span>\"&gt;</span>Calle /\nN&#194;&#186; / Piso / Puerta<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"755\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"756\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"757\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"758\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"759\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"760\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"761\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"762\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"763\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"764\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">city</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Ciudad</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"765\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">city</span>\"&gt;</span>Municipio<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"766\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"767\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"768\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"769\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"770\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"771\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"772\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"773\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"774\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"775\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">postcode</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"776\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">C&#195;&#179;digo Postal</span>\"\n<span class=\"html-attribute-name\">required</span> <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">38201</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"777\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">postcode</span>\"&gt;</span>C&#195;&#179;digo\nPostal<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"778\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"779\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"780\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"781\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"782\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"783\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type-select type__select block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"784\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">items--container flex-container flex-row\njustify-between normal-select</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"785\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">select__item item--wrapper\nquickview-type__select flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"786\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;select\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">select2-normal required-entry\nselect2</span>\" <span class=\"html-attribute-name\">required</span>\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">region</span>\" <span class=\n\"html-attribute-name\">data-placeholder</span>=\"<span class=\n\"html-attribute-value\">Provincia</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"787\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;option&gt;</span><span class=\n\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"788\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">157</span>\"&gt;</span>Las Palmas<span class=\n\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"789\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">170</span>\"&gt;</span>Santa Cruz de\nTenerife<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"790\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/select&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"791\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"792\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"793\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"794\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"795\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block__text info__small_text no-margin\njustify__text</span>\"&gt;</span>Sus datos ser&#195;&#161;n tratados\npor DINOSOL SUPERMERCADOS S.L., con el fin de gestionar su registro\ncomo usuario, gestionar sus compras online y enviarle\ncomunicaciones comerciales. Sus datos son tratados en base al\nconsentimiento prestado. Sus datos personales no ser&#195;&#161;n\ncedidos o comunicados a terceros . Los usuarios cuyos datos sean\nobjeto de tratamiento podr&#195;&#161;n ejercitar gratuitamente los\nderechos de acceso e informaci&#195;&#179;n,\nrectificaci&#195;&#179;n,\ncancelaci&#195;&#179;n/supresi&#195;&#179;n o, en su caso,\noposici&#195;&#179;n de sus datos, en los t&#195;&#169;rminos\nespecificados en el Reglamento General de Protecci&#195;&#179;n de\nDatos de Car&#195;&#161;cter Personal, conforme al procedimiento\nlegalmente establecido de acuerdo con la informaci&#195;&#179;n\nampliada en nuestra <span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-privacidad/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-privacidad/</a>\"&gt;</span>P.Privacidad<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"796\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"797\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input-radio-container flex-container\nflex-row items-center no-margin</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"798\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input--radio input--radio--card\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"799\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">checkbox</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">retrieve</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">subscribe</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">is_subscribed</span>\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"800\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">subscribe</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"801\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"802\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"803\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"804\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"805\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;p <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block__text block__text--register\ninfo__small_text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"806\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">subscribe</span>\"&gt;</span>Deseo\nsuscribirme al newsletter semanal con ofertas\nespeciales<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"807\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/p&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"808\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"809\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"810\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input-radio-container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"811\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input--radio input--radio--card\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"812\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">checkbox</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">retrieve</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">terms</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">terms_and_conditions</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"813\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">required-entry</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"814\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">terms</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"815\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"816\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"817\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"818\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;p <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block__text block__text--register\ninfo__small_text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"819\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">terms</span>\"&gt;</span>Soy mayor de edad y\ndeclaro que he le&#195;&#173;do y acepto la pol&#195;&#173;tica\n<span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-privacidad/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-privacidad/</a>\"&gt;</span>pol&#195;&#173;tica\nde privacidad<span class=\"html-tag\">&lt;/a&gt;</span> y las\n<span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/condiciones-compra/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/condiciones-compra/</a>\"&gt;</span>\ncondiciones de compra.<span class=\n\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"820\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/p&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"821\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"822\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"823\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"824\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"825\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__register-item cart__button\nblock--wrapper flex-item flex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"826\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">tryRegister</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"827\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"828\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"829\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span>Continuar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"830\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"831\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"832\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"833\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"834\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"835\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"836\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"837\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"838\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"839\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal\ndialogBox-modal-forgotpassword flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"840\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper dialogBox--wrapper-modal\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"841\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__item--little\ndialogBox__recover flex-container\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"842\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"843\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-forgotpassword</span>\"\n<span class=\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_customer/account/forgotpasswordAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"844\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">forgotpassword-form</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"845\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"846\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"847\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"848\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-forgotpassword</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"849\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"850\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"851\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"852\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"853\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"854\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"855\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"856\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"857\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"858\"></td>\n<td class=\"line-content\">Recordar contrase&#195;&#177;a.\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"859\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"860\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"861\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"862\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"863\"></td>\n<td class=\"line-content\">Por favor introduce tu\ninformaci&#195;&#179;n para reestablecer su contrase&#195;&#177;a.\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"864\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"865\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"866\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">error-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"867\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"868\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"869\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"870\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"871\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"872\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"873\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">required</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"874\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">Correo\nelectr&#195;&#179;nico</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"875\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">email</span>\"&gt;</span>Correo\nelectr&#195;&#179;nico<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"876\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"877\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"878\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"879\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"880\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"881\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"882\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"883\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">tryForgotPassword</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"884\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"885\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"886\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"887\"></td>\n<td class=\"line-content\">Continuar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"888\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"889\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"890\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"891\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__forgetPassword\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"892\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button flex-container flex-row\nitems-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">backLoginFromForgotPassword</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"893\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"894\"></td>\n<td class=\"line-content\">Crear una cuenta hiperdino <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"895\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"896\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"897\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"898\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"899\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"900\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"901\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"902\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"903\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"904\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"905\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"906\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"907\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"908\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"909\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal\ndialogBox-modal-forgotpasswordsuccess flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"910\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper dialogBox--wrapper-modal\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"911\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"912\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__item--little\ndialogBox__recover flex-container\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"913\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"914\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"915\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-forgotpasswordsuccess</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"916\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"917\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"918\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"919\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"920\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content flex-container\nitems-center flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"921\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column justify-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"922\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-menu__item dialogBox__recover-item\nitem--wrapper flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"923\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/\" rel=\"noreferrer noopener\">/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"924\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__logo flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"925\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"926\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"927\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"928\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"929\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"930\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"931\"></td>\n<td class=\"line-content\">Perfecto, te hemos enviado un email de\nrecuperaci&#195;&#179;n a: <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"932\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"933\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"934\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"935\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub__title</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">forgotpasswordEmail</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"936\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"937\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"938\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"939\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"940\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"941\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"942\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"943\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"944\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"945\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"946\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"947\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"948\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"949\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"950\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"951\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-postcode dialogBox-modal\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"952\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"953\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">postal-wrapper dialogBox--wrapper\ndialogBox--wrapper-modal flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"954\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"955\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__item--little\nnot-padding dialogBox__postal dialogBox__item--sixe-fixed\nflex-container justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"956\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"957\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"958\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"959\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-postcode</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"960\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"961\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"962\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"963\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"964\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__left\ndialogBox__left--fullheight-image flex-item\npostal-results-wrapper__image\nis-hidden-mobile</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"965\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"966\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"967\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"968\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"969\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__right\ndialogBox__right-has-padding flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"970\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column justify-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"971\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"972\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\ndialogBox__description--has-not-margin\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"973\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text\nhas-less-height</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"974\"></td>\n<td class=\"line-content\">&#194;&#161;Bienvenido! <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"975\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"976\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"977\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"978\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"979\"></td>\n<td class=\"line-content\">Introduce tu C&#195;&#179;digo Postal.\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"980\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"981\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"982\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"983\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">description__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"984\"></td>\n<td class=\"line-content\">Te mostraremos la mejor oferta de\nproductos de tu zona. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"985\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"986\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"987\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-postcode</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/postcodeAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">postcode-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"988\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"989\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"990\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"991\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"992\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"993\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">number</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">postcode</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double\nrequired-entry</span>\" <span class=\n\"html-attribute-name\">placeholder</span>=\"<span class=\n\"html-attribute-value\">C&#195;&#179;digo Postal</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"994\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">38201</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"995\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">postcode</span>\"&gt;</span>C&#195;&#179;digo\nPostal<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"996\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"997\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"998\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"999\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1000\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1001\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1002\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--container button__complex--modal has-margin-bottom\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1003\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">checkCp</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1004\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1005\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1006\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1007\"></td>\n<td class=\"line-content\">Empezar a comprar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1008\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1009\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1010\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1011\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1012\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1013\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1014\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1015\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1016\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex has-border\nbutton__complex--container button__complex--modal flex-container\nflex-row justify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1017\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">showLogin</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1018\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1019\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1020\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1021\"></td>\n<td class=\"line-content\">Ya tengo una cuenta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1022\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1023\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1024\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1025\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1026\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1027\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1028\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1029\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1030\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1031\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1032\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1033\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1034\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1035\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-pickup dialogBox-modal\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1036\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1037\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">postal-code-results dialogBox--wrapper\ndialogBox--wrapper-modal flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1038\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1039\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__item--little\nnot-padding dialogBox__postal dialogBox__item--sixe-fixed\nflex-container justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1040\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1041\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1042\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-pickup</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1043\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1044\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1045\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1046\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__left\ndialogBox__left--fullheight-image flex-item\npickup-results-wrapper__image\nis-hidden-mobile</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1047\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1048\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1049\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1050\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__right\ndialogBox__right-has-padding flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1051\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1052\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column justify-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1053\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1054\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1055\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1056\"></td>\n<td class=\"line-content\">Para el c&#195;&#179;digo postal:\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1057\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1058\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1059\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1060\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">postcodePickupShop</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1061\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1062\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1063\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1064\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1065\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">description__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1066\"></td>\n<td class=\"line-content\">No disponemos de entrega a domicilio en tu\nzona pero puedes recoger tu pedido en alguna de estas tiendas:\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1067\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1068\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1069\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title has-margin\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1070\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1071\"></td>\n<td class=\"line-content\">Elige una tienda <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1072\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1073\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-pickup</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/pickupShopAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">pickup-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1074\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1075\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type-select type-select-modal block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1076\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">items--container flex-container flex-row\njustify-between normal-select</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1077\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">select__item item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1078\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;select\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">select2-normal required-entry\nselect2</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">pickupShop</span>\" <span class=\n\"html-attribute-name\">data-placeholder</span>=\"<span class=\n\"html-attribute-value\">Elige una Tienda</span>\" <span class=\n\"html-attribute-name\">required</span>&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1079\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;option&gt;</span><span class=\n\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1080\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">4</span>\"&gt;</span>HIPERDINO\nMILLER<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1081\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">6</span>\"&gt;</span>HIPERDINO TOME\nCANO<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1082\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">7</span>\"&gt;</span>HIPERDINO CHAFIRAS\nII<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1083\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">8</span>\"&gt;</span>HIPERDINO PIEDRA\nREDONDA<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1084\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">9</span>\"&gt;</span>HIPERDINO\nVECINDARIO<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1085\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">13</span>\"&gt;</span>HIPERDINO GRAN\nTARAJAL<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1086\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">17</span>\"&gt;</span>HIPERDINO LAS\nROTONDAS<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1087\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">222</span>\"&gt;</span>HIPERDINO SAN\nBARTOLOM&#195;&#8240;<span class=\n\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1088\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">234</span>\"&gt;</span>HIPERDINO EL\nPASO<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1089\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;option\n<span class=\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">250</span>\"&gt;</span>HIPERDINO AVDA. EL\nPUENTE<span class=\"html-tag\">&lt;/option&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1090\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/select&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1091\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1092\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1093\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1094\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1095\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1096\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container has-margin-bottom\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1097\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">setPickupShop</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1098\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1099\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1100\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1101\"></td>\n<td class=\"line-content\">Empezar a comprar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1102\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1103\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1104\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1105\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1106\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1107\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1108\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1109\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex has-border\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1110\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">showPostcodeModal</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1111\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1112\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1113\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1114\"></td>\n<td class=\"line-content\">Introduce otro c&#195;&#179;digo postal\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1115\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1116\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1117\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1118\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1119\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1120\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1121\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1122\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1123\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1124\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1125\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-warning\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1126\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1127\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1128\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1129\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1130\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1131\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1132\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1133\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1134\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1135\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1136\"></td>\n<td class=\"line-content\">&#194;&#161;Cuidado! <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1137\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1138\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1139\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1140\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text is-invisible</span>\"\n<span class=\"html-attribute-name\">data-type</span>=\"<span class=\n\"html-attribute-value\">1</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1141\"></td>\n<td class=\"line-content\">Si cambias el c&#195;&#179;digo postal, es\nposible que se te redirija a otra tienda y pierdas las\nconfiguraciones actuales. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1142\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text is-invisible</span>\"\n<span class=\"html-attribute-name\">data-type</span>=\"<span class=\n\"html-attribute-value\">2</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1143\"></td>\n<td class=\"line-content\">La informaci&#195;&#179;n de tu cuenta no\ncoincide con la configuraci&#195;&#179;n actual. &#194;&#191;Deseas\ncontinuar con los datos de tu cuenta? Si cambias es posible que se\nte redirija a otra tienda y pierdas las configuraciones actuales.\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1144\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text is-invisible</span>\"\n<span class=\"html-attribute-name\">data-type</span>=\"<span class=\n\"html-attribute-value\">3</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1145\"></td>\n<td class=\"line-content\">Aun no tienes informaci&#195;&#179;n sobre\ntu tienda preferida. &#194;&#161;Puedes cambiarla en cualquier\nmomento cambiando el c&#195;&#179;digo postal! <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1146\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text is-invisible</span>\"\n<span class=\"html-attribute-name\">data-type</span>=\"<span class=\n\"html-attribute-value\">4</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1147\"></td>\n<td class=\"line-content\">Por favor introduce tu\ninformaci&#195;&#179;n para crear una nueva cuenta. <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1148\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1149\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-warning</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_freenavigation/delivery/acceptWarningAjax/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">warning-form</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1150\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1151\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">postcode</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1152\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">pickup</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1153\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1154\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1155\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container has-margin-bottom\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1156\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">acceptWarning</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1157\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1158\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1159\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1160\"></td>\n<td class=\"line-content\">Continuar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1161\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1162\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1163\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1164\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1165\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1166\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1167\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">cancel-warning</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex has-border\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1168\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">cancelWarning</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1169\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1170\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1171\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1172\"></td>\n<td class=\"line-content\">Me quedo como estaba <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1173\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1174\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1175\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1176\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1177\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1178\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1179\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1180\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1181\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1182\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1183\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1184\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1185\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1186\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1187\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview-modal flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1188\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1189\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1190\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1191\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__item flex-container\nflex-row-toggle justify-between</span>\" <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">quickview-demo</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1192\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1193\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__left\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1194\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__gallery flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1195\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1196\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top__badges is-hidden-desktop\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1197\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top__badges--container flex-container\nflex-row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1198\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">offer--badge is-invisible badge__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1199\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">badge__text\ntext--semi-bold</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1200\"></td>\n<td class=\"line-content\">Oferta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1201\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1202\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">promotion--badge is-invisible badge__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1203\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">badge__text\ntext--semi-bold</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1204\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!--\nPromotion Description --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1205\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1206\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1207\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1208\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1209\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1210\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__title is-hidden-desktop\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1211\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1212\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Product\nName --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1213\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1214\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1215\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1216\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">gallery__swiper swiper-container\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1217\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">swiper-wrapper\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1218\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Product\nBig Images --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1219\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1220\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1221\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1222\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">gallery__thumbs swiper-container\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1223\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">swiper-wrapper\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1224\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Product\nThumb --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1225\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1226\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1227\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1228\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1229\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1230\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__right\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1231\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1232\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1233\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top__badges is-hidden-mobile\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1234\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">top__badges--container flex-container\nflex-row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1235\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">offer--badge is-invisible badge__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1236\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">badge__text\ntext--semi-bold</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1237\"></td>\n<td class=\"line-content\">Oferta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1238\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1239\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">promotion--badge is-invisible badge__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1240\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">badge__text\ntext--semi-bold</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1241\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!--\nPromotion Description --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1242\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1243\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1244\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1245\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1246\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1247\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__title is-hidden-mobile\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1248\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1249\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Product\nName --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1250\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1251\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1252\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1253\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1254\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Product\nPrice Text --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1255\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1256\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1257\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">bottom__badges\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1258\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">bottom__badges--container flex-container\nflex-row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1259\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Tags\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1260\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1261\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1262\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1263\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__price\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1264\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__price--container flex-container\nflex-row justify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1265\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price__left price--final\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1266\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1267\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Special\nPrice --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1268\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1269\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1270\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price__right price--previous flex-item\nis-invisible</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1271\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1272\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Price\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1273\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1274\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1275\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1276\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1277\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1278\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">wrapper_addToCartComponent</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1279\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__buttons\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1280\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__buttons--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1281\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1282\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__type flex-item\nis-invisible</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1283\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__type--container flex-container\nflex-row justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1284\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type__item flex-item\nflex-half</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1285\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-product-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1286\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1287\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-min_qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1288\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty-unit</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1289\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1290\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty_label</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1291\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-options</span>=\"\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1292\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex button--units\nis-selected border--grey has-border flex-container flex-row\njustify-center items-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1293\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">addUnits</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1294\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content border--grey\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1295\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1296\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1297\"></td>\n<td class=\"line-content\">Por unidades <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1298\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1299\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__checkdot\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1300\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1301\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1302\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1303\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1304\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type__item flex-item\nflex-half</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1305\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-product-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1306\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1307\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-min_qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1308\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty-unit</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1309\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1310\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-qty_label</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1311\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-options</span>=\"\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1312\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex button--weight\nborder--grey has-border flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1313\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">addWeight</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1314\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content border--grey\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1315\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1316\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1317\"></td>\n<td class=\"line-content\">Por peso <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1318\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1319\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__checkdot\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1320\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1321\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1322\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1323\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1324\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1325\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1326\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1327\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">selector__buttons is-disabled flex-item\nwrapper_weightSelector</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1328\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight__title flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1329\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight__line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1330\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight__text\nflex-item</span>\"&gt;</span>Selecciona el peso<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1331\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight__line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1332\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1333\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">selector__buttons--container flex-container\nflex-row justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1334\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type__item type__item--kg flex-item\nflex-half</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1335\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__complex border--grey has-border\nhas-buttons flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1336\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content border--grey\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1337\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-between items-center\nwrapper_weightKgs</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1338\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1339\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight-qty</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span> <span class=\n\"html-tag\">&lt;span&gt;</span> Kg<span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1340\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1341\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1342\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container\njustify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1343\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon flex-container flex-row\njustify-center items-center\nproductview-item-modify-qty</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1344\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action</span>=\"<span class=\n\"html-attribute-value\">decrease</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1345\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-unit</span>=\"<span class=\n\"html-attribute-value\">kg</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1346\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1347\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-real-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1348\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-min-qty</span>=\"\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1349\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-remove\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1350\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1351\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon flex-container flex-row\njustify-center items-center\nproductview-item-modify-qty</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1352\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action</span>=\"<span class=\n\"html-attribute-value\">increase</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1353\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-unit</span>=\"<span class=\n\"html-attribute-value\">kg</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1354\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1355\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-real-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1356\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-max-qty</span>=\"<span class=\n\"html-attribute-value\">20</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1357\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-add\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1358\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1359\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1360\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1361\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1362\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1363\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1364\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1365\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type__item type__item--gr flex-item\nflex-half</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1366\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__complex border--grey has-border\nhas-buttons flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1367\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content border--grey\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1368\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-between items-center\nwrapper_weightGrs</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1369\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1370\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">weight-qty</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span> <span class=\n\"html-tag\">&lt;span&gt;</span> gr<span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1371\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1372\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1373\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container\njustify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1374\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon flex-container flex-row\njustify-center items-center\nproductview-item-modify-qty</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1375\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action</span>=\"<span class=\n\"html-attribute-value\">decrease</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1376\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-unit</span>=\"<span class=\n\"html-attribute-value\">gr</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1377\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1378\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-real-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1379\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-min-qty</span>=\"\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1380\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-remove\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1381\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1382\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon flex-container flex-row\njustify-center items-center\nproductview-item-modify-qty</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1383\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action</span>=\"<span class=\n\"html-attribute-value\">increase</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1384\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-unit</span>=\"<span class=\n\"html-attribute-value\">gr</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1385\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1386\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-real-item-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1387\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-max-qty</span>=\"<span class=\n\"html-attribute-value\">950</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1388\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-add\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1389\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1390\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1391\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1392\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1393\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1394\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1395\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1396\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1397\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1398\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1399\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">type-select block--wrapper flex-item\nis-invisible</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1400\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">items--container flex-container\nflex-row-toggle justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1401\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- Custom\nOptions --&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1402\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1403\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1404\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1405\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__add2cart\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1406\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex flex-container\nflex-row justify-center items-center action-productViewAddToCart\nproductViewAddToCart</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1407\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-item-id</span>=\"<span class=\n\"html-attribute-value\">0</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1408\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-product-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1409\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-parent-id</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1410\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-can-add-to-cart</span>=\"<span class=\n\"html-attribute-value\">1</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1411\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action-url</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1412\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-modify-url</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1413\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-remove-action-url</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1414\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-current-qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1415\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-min_qty</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1416\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-must-select</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1417\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-selected-options</span>=\"\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1418\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-product-qty-unit</span>=\"\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1419\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1420\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1421\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text flex-item\nlabel-addToCart</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1422\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span><span class=\"html-comment\">&lt;!--\nCantidad --&gt;</span><span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1423\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;span&gt;</span>A&#195;&#177;adir<span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1424\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1425\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--wrapper flex-item\nis-invisible</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1426\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container\njustify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1427\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">price__bottom price--final\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1428\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1429\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__icon list__icon--first button\nbutton__icon flex-container flex-row justify-center items-center\nis-invisible</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1430\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">removeQVQty</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1431\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-remove\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1432\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1433\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__icon list__icon--first button\nbutton__icon flex-container flex-row justify-center\nitems-center</span> \"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1434\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">removeQVProduct</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1435\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-trash\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1436\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1437\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__icon button button__icon\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1438\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">addQVProduct</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1439\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-add\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1440\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1441\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1442\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1443\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1444\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1445\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1446\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1447\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1448\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1449\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1450\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__add2list\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1451\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button flex-container flex-row items-center\naction_wishlistAddProduct</span>\" <span class=\n\"html-attribute-name\">data-product-id</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1452\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__icon--small\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1453\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-option</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1454\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1455\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1456\"></td>\n<td class=\"line-content\">A&#195;&#177;adir a mi lista <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1457\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1458\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1459\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1460\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1461\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1462\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1463\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1464\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1465\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1466\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1467\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">quickview__control</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1468\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1469\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeQuickview</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1470\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1471\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1472\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1473\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1474\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1475\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1476\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1477\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1478\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-error\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1479\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1480\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1481\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1482\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1483\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1484\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1485\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1486\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-error</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1487\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1488\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1489\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1490\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1491\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1492\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1493\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1494\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1495\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1496\"></td>\n<td class=\"line-content\">Ha ocurrido un error <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1497\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1498\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1499\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1500\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">error-modal-message</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1501\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1502\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1503\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1504\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1505\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1506\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1507\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1508\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1509\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1510\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1511\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-timeslots\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1512\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1513\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1514\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1515\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1516\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1517\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1518\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1519\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-timeslots</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1520\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1521\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1522\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1523\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1524\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">w-100</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1525\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1526\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">error-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1527\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1528\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">success-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1529\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1530\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1531\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">timeslots-modal-content-wrapper</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1532\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-logged-in</span>=\"<span class=\n\"html-attribute-value\">0</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1533\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-action-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdcheckout/xhr/selectMethod/form_key/JTZ8TY7ZrxstF7cc/</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1534\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-source-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdcheckout/timeslots/getbooking/</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1535\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-in-checkout</span>=\"<span class=\n\"html-attribute-value\">0</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1536\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1537\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1538\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1539\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1540\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1541\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1542\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1543\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1544\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1545\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-renewalert\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1546\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1547\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1548\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1549\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1550\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1551\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1552\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1553\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-renewalert</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1554\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1555\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1556\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1557\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1558\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1559\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column\ntimeslots-renewalert-content-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1560\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1561\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">error-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1562\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1563\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">success-message is-invisible input\ninput__complex--container flex-container</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1564\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">flex-row justify-center\nitems-center</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1565\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1566\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1567\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1568\"></td>\n<td class=\"line-content\">&#194;&#161;Cuidado! <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1569\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1570\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1571\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title dialogBox__description\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1572\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">bookingText</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1573\"></td>\n<td class=\"line-content\">Tu reserva est&#195;&#161; a punto de\ncaducar <span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1574\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1575\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">timeleft</span>\" <span class=\n\"html-attribute-name\">data-time</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1576\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1577\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1578\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1579\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1580\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form form-timeslots-renew</span>\"\n<span class=\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdcheckout/timeslots/renew/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1581\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">form-timeslots-renew</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1582\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1583\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1584\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container has-border\nhas-margin-bottom flex-container flex-row justify-center\nitems-center action-renewBooking</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1585\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1586\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1587\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1588\"></td>\n<td class=\"line-content\">Renovar Reserva <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1589\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1590\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1591\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1592\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1593\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1594\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1595\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1596\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1597\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1598\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1599\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1600\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1601\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1602\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\n\"html-tag\">&lt;/header&gt;</span><span class=\"html-tag\">&lt;main\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">maincontent</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">page-main</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">contentarea</span>\" <span class=\n\"html-attribute-name\">tabindex</span>=\"<span class=\n\"html-attribute-value\">-1</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1603\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">window-content flex-container flex-row\njustify-start</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1604\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu side-menu-user-account\nflex-container flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1605\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-body\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1606\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-body--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1607\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1608\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-controls--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1609\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-controls--container flex-container\nflex-row justify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1610\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-contols-left--wrapper flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1611\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-contols-left--container\nflex-container flex-row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1612\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-controls__item item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1613\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center</span>\" <span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">openCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-postcode</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1614\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--location\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1615\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-location-pin</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1616\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1617\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1618\"></td>\n<td class=\"line-content\">Comprando para <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1619\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__box\nflex-item</span>\"&gt;</span>38201<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1620\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1621\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/div&gt;</span>\n<span class=\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-controls__item\nside-menu-controls__item--horary item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1622\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\"noreferrer noopener\">#</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item--container flex-container flex-row\nitems-center action_timeslotsModal</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1623\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-source-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdcheckout/timeslots/get/</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1624\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__icon icon--clock\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1625\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-clock</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1626\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1627\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1628\"></td>\n<td class=\"line-content\">Horarios de entrega <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1629\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1630\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1631\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1632\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1633\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-contols-right--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1634\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__group category--button\ncategory--button-sidebar is-active flex-container flex-row\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1635\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__hamburger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1636\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1637\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1638\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">hamburger--line\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1639\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1640\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1641\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1642\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1643\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1644\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1645\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-category--wrapper flex-item\nis-hidden-mobile</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1646\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-category--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1647\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1648\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1649\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1650\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1651\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1652\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1653\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1654\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1655\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1656\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-alimentacion flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1657\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1658\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1659\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1660\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1661\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1662\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1663\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/aceites.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aceites.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1664\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Aceites<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1665\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1666\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1667\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1668\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/aperitivo.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aperitivo.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1669\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Aperitivo<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1670\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1671\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1672\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1673\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/arroz.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/arroz.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1674\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Arroz<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1675\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1676\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1677\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1678\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1679\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Az&#195;&#186;car y\nedulcorantes<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1680\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1681\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1682\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1683\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1684\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cacao y caf&#195;&#169;<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1685\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1686\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1687\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1688\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1689\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Caldos, sopas y cremas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1690\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1691\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1692\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1693\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/cereales.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cereales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1694\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cereales<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1695\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1696\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1697\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1698\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/chocolate.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/chocolate.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1699\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Chocolate<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1700\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1701\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1702\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1703\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1704\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Comida internacional<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1705\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1706\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1707\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1708\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/condimentos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/condimentos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1709\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Condimentos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1710\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1711\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1712\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1713\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1714\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Conservas carne<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1715\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1716\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1717\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1718\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1719\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Conservas fruta y dulces<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1720\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1721\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1722\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1723\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1724\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Conservas pescado<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1725\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1726\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1727\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1728\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1729\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Conservas platos\npreparados<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1730\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1731\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1732\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1733\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1734\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Conservas vegetales<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1735\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1736\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1737\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1738\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/dieteticos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/dieteticos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1739\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Diet&#195;&#169;ticos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1740\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1741\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1742\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1743\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/galletas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/galletas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1744\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Galletas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1745\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1746\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1747\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1748\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/golosinas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/golosinas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1749\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Golosinas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1750\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1751\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1752\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1753\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1754\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Harinas y gofio<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1755\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1756\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1757\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1758\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1759\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Infusiones y\nt&#195;&#169;s<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1760\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1761\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1762\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1763\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1764\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Legumbres secas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1765\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1766\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1767\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1768\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/panaderia.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/panaderia.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1769\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Panader&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1770\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1771\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1772\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1773\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/pasta.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/pasta.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1774\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Pasta<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1775\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1776\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1777\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1778\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1779\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Pasteler&#195;&#173;a\nindustrial<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1780\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1781\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1782\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1783\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/reposteria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/reposteria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1784\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Reposter&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1785\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1786\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1787\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1788\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/salsas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/salsas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1789\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Salsas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1790\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1791\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1792\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1793\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1794\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1795\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1796\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1797\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1798\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1799\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1800\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1801\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1802\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1803\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1804\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1805\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bebidas\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1806\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bebidas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1807\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1808\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1809\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1810\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1811\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1812\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/agua.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/agua.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1813\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Agua<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1814\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1815\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1816\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1817\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/alcoholicas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/alcoholicas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1818\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Alcoh&#195;&#179;licas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1819\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1820\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1821\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1822\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/cervezas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/cervezas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1823\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cervezas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1824\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1825\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1826\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1827\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/refrescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/refrescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1828\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Refrescos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1829\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1830\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1831\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1832\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1833\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Zumos y\nn&#195;&#169;ctares<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1834\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1835\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1836\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1837\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1838\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1839\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1840\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1841\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1842\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1843\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1844\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1845\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1846\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1847\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1848\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1849\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bodega\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1850\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bodega<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1851\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1852\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1853\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1854\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1855\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1856\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/espumosos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/espumosos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1857\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Espumosos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1858\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1859\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1860\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1861\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1862\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Sangr&#195;&#173;a y tinto de\nverano<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1863\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1864\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1865\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1866\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/sidras.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/sidras.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1867\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Sidras<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1868\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1869\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1870\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1871\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-blanco.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-blanco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1872\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino blanco<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1873\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1874\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1875\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1876\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1877\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino de Jerez<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1878\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1879\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1880\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1881\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1882\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino de mesa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1883\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1884\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1885\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1886\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-dulce.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-dulce.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1887\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino dulce<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1888\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1889\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1890\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1891\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-rosado.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-rosado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1892\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino rosado<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1893\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1894\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1895\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1896\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-tinto.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-tinto.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1897\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Vino tinto<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1898\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1899\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1900\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1901\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1902\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1903\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1904\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1905\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1906\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1907\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1908\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1909\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1910\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1911\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1912\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1913\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-frescos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1914\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Frescos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1915\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1916\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1917\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1918\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1919\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1920\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/carne.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1921\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Carne<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1922\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1923\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1924\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1925\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1926\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>C&#195;&#161;rnicos\nenvasados<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1927\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1928\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1929\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1930\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1931\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Charcuter&#195;&#173;a al\ncorte<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1932\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1933\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1934\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1935\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1936\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Charcuteria envasada<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1937\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1938\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1939\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1940\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/fruta.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/fruta.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1941\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Fruta<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1942\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1943\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1944\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1945\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1946\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Panader&#195;&#173;a y\npasteler&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1947\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1948\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1949\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1950\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1951\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Pescado y marisco<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1952\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1953\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1954\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1955\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/platos-preparados.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1956\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Platos preparados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1957\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1958\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1959\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1960\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1961\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Quesos al corte<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1962\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1963\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1964\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1965\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/quesos-envasados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/quesos-envasados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1966\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Quesos envasados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1967\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1968\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1969\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1970\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1971\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Salsas refrigeradas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1972\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1973\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1974\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1975\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1976\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Verduras y Hortalizas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1977\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1978\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1979\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1980\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1981\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Zumos y sopas refrigeradas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1982\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1983\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1984\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1985\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1986\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1987\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1988\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1989\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1990\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1991\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1992\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1993\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1994\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1995\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1996\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1997\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-congelados\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1998\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Congelados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"1999\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2000\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2001\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2002\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2003\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2004\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/bases-y-masas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/bases-y-masas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2005\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Bases y masas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2006\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2007\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2008\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2009\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/carne.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2010\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Carne<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2011\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2012\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2013\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2014\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/helados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/helados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2015\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Helados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2016\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2017\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2018\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2019\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/hielo.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/hielo.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2020\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Hielo<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2021\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2022\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2023\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2024\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2025\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Panader&#195;&#173;a y\npasteler&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2026\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2027\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2028\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2029\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2030\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Pescado y marisco<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2031\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2032\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2033\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2034\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/platos-preparados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2035\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Platos preparados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2036\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2037\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2038\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2039\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2040\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Verduras y hortalizas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2041\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2042\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2043\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2044\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2045\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2046\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2047\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2048\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2049\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2050\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2051\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2052\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2053\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2054\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2055\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2056\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-derivados-lacteos-y-huevos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2057\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Derivados l&#195;&#161;cteos y\nhuevos<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2058\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2059\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2060\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2061\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2062\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2063\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2064\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Batidos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2065\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2066\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2067\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2068\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2069\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Bebidas vegetales<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2070\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2071\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2072\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2073\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2074\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Caf&#195;&#169;\nfr&#195;&#173;o<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2075\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2076\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2077\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2078\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2079\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Flan<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2080\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2081\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2082\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2083\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2084\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Huevos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2085\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2086\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2087\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2088\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2089\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Leches<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2090\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2091\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2092\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2093\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2094\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Mantequilla<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2095\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2096\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2097\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2098\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2099\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Margarina<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2100\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2101\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2102\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2103\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2104\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Nata l&#195;&#173;quida<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2105\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2106\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2107\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2108\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2109\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Nata montada<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2110\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2111\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2112\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2113\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2114\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Natillas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2115\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2116\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2117\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2118\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2119\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Postres<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2120\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2121\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2122\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2123\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2124\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Yogur y petit<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2125\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2126\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2127\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2128\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2129\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2130\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2131\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2132\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2133\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2134\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2135\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2136\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2137\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2138\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2139\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2140\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bebe\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2141\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Beb&#195;&#169;<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2142\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2143\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2144\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2145\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2146\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2147\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/accesorios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/accesorios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2148\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Accesorios<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2149\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2150\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2151\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2152\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2153\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2154\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2155\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2156\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2157\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/higiene.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/higiene.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2158\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Higiene<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2159\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2160\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2161\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2162\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2163\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2164\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2165\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2166\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2167\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2168\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2169\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2170\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2171\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2172\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2173\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2174\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-higiene-y-perfumeria\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2175\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Higiene y\nperfumer&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2176\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2177\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2178\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2179\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2180\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2181\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2182\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Afeitado<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2183\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2184\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2185\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2186\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2187\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cuidado corporal<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2188\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2189\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2190\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2191\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2192\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cuidado del cabello<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2193\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2194\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2195\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2196\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2197\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Cuidado facial<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2198\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2199\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2200\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2201\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2202\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Depilaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2203\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2204\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2205\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2206\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2207\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Desodorantes<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2208\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2209\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2210\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2211\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2212\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Fragancias<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2213\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2214\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2215\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2216\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2217\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Higiene bucal<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2218\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2219\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2220\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2221\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2222\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Maquillaje<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2223\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2224\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2225\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2226\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2227\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Parafarmacia<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2228\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2229\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2230\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2231\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2232\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Protecci&#195;&#179;n e higiene\n&#195;&#173;ntima<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2233\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2234\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2235\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2236\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2237\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2238\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2239\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2240\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2241\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2242\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2243\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2244\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2245\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2246\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2247\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2248\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-drogueria-y-limpieza\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2249\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Droguer&#195;&#173;a y\nlimpieza<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2250\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2251\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2252\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2253\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2254\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2255\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2256\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Celulosa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2257\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2258\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2259\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2260\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2261\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Detergentes ropa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2262\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2263\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2264\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2265\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2266\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Limpieza<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2267\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2268\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2269\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2270\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2271\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Suavizantes ropa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2272\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2273\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2274\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2275\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2276\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Tratamientos ropa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2277\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2278\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2279\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2280\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2281\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2282\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2283\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2284\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2285\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2286\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2287\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2288\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2289\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2290\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2291\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2292\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-hogar\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2293\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Hogar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2294\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2295\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2296\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2297\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2298\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2299\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2300\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Accesorios ba&#195;&#177;o<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2301\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2302\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2303\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2304\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2305\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Limpieza del hogar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2306\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2307\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2308\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2309\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-cocina.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-cocina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2310\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Menaje cocina<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2311\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2312\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2313\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2314\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-desechable.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-desechable.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2315\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Menaje desechable<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2316\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2317\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2318\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2319\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-mesa.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-mesa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2320\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Menaje mesa<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2321\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2322\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2323\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2324\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/ordenacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/ordenacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2325\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Ordenaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2326\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2327\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2328\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2329\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2330\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Peque&#195;&#177;o aparato\nel&#195;&#169;ctrico<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2331\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2332\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2333\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2334\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2335\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2336\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2337\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2338\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2339\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2340\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2341\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2342\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2343\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2344\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2345\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2346\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bazar\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2347\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bazar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2348\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2349\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2350\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2351\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2352\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2353\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/automovil.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/automovil.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2354\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Autom&#195;&#179;vil<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2355\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2356\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2357\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2358\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/bricolaje.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/bricolaje.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2359\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Bricolaje<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2360\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2361\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2362\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2363\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/jardineria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/jardineria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2364\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Jardiner&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2365\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2366\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2367\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2368\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/kiosco.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/kiosco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2369\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Kiosco<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2370\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2371\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2372\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2373\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2374\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Menaje\ndecoraci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2375\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2376\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2377\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2378\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/papeleria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/papeleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2379\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Papeler&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2380\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2381\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2382\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2383\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2384\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2385\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2386\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2387\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2388\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2389\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2390\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2391\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2392\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2393\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2394\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2395\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-mascotas\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2396\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Mascotas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2397\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2398\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2399\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2400\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2401\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2402\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/mascotas/accesorios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/mascotas/accesorios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2403\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Accesorios<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2404\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2405\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2406\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2407\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/mascotas/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/mascotas/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2408\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2409\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2410\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2411\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2412\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2413\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2414\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2415\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2416\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2417\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2418\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2419\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2420\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2421\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2422\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2423\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2424\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-ecologicos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2425\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Ecol&#195;&#179;gicos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2426\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2427\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2428\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2429\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2430\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2431\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2432\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2433\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2434\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2435\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2436\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2437\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Beb&#195;&#169;<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2438\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2439\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2440\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2441\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/bebidas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/bebidas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2442\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Bebidas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2443\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2444\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2445\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2446\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2447\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Derivados l&#195;&#161;cteos y\nhuevos<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2448\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2449\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2450\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2451\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/frescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/frescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2452\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Frescos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2453\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2454\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2455\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2456\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2457\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2458\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2459\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2460\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2461\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2462\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2463\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2464\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2465\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2466\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2467\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2468\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-gourmet\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2469\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Gourmet<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2470\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2471\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2472\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2473\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2474\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2475\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2476\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2477\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2478\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2479\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2480\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/bebidas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/bebidas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2481\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Bebidas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2482\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2483\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2484\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2485\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/congelados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/congelados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2486\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Congelados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2487\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2488\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2489\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2490\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/frescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/frescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2491\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Frescos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2492\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2493\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2494\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2495\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2496\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2497\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2498\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2499\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2500\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2501\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2502\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2503\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2504\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2505\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2506\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2507\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-ocio\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2508\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Ocio<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2509\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2510\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2511\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2512\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2513\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2514\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/camping.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/camping.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2515\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Camping<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2516\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2517\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2518\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2519\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/jardin.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/jardin.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2520\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Jard&#195;&#173;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2521\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2522\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2523\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2524\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2525\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Playa y piscina<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2526\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2527\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2528\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2529\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/varios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/varios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2530\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span>Varios<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2531\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2532\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2533\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2534\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2535\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2536\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2537\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2538\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2539\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-category--wrapper user-menu\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2540\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-category--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2541\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2542\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2543\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2544\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2545\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span>Categor&#195;&#173;as<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2546\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2547\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2548\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2549\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2550\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2551\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2552\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2553\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2554\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2555\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2556\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2557\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2558\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2559\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2560\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2561\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2562\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-alimentacion flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2563\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Alimentaci&#195;&#179;n<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2564\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2565\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2566\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2567\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2568\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2569\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2570\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/aceites.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aceites.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2571\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2572\"></td>\n<td class=\"line-content\">Aceites <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2573\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2574\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2575\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2576\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/aperitivo.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aperitivo.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2577\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2578\"></td>\n<td class=\"line-content\">Aperitivo <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2579\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2580\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2581\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2582\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/arroz.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/arroz.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2583\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2584\"></td>\n<td class=\"line-content\">Arroz <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2585\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2586\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2587\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2588\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2589\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2590\"></td>\n<td class=\"line-content\">Az&#195;&#186;car y edulcorantes\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2591\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2592\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2593\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2594\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2595\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2596\"></td>\n<td class=\"line-content\">Cacao y caf&#195;&#169; <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2597\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2598\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2599\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2600\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2601\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2602\"></td>\n<td class=\"line-content\">Caldos, sopas y cremas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2603\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2604\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2605\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2606\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/cereales.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cereales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2607\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2608\"></td>\n<td class=\"line-content\">Cereales <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2609\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2610\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2611\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2612\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/chocolate.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/chocolate.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2613\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2614\"></td>\n<td class=\"line-content\">Chocolate <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2615\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2616\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2617\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2618\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2619\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2620\"></td>\n<td class=\"line-content\">Comida internacional <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2621\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2622\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2623\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2624\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/condimentos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/condimentos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2625\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2626\"></td>\n<td class=\"line-content\">Condimentos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2627\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2628\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2629\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2630\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2631\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2632\"></td>\n<td class=\"line-content\">Conservas carne <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2633\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2634\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2635\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2636\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-fruta-y-dulces.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2637\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2638\"></td>\n<td class=\"line-content\">Conservas fruta y dulces <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2639\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2640\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2641\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2642\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-pescado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2643\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2644\"></td>\n<td class=\"line-content\">Conservas pescado <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2645\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2646\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2647\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2648\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2649\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2650\"></td>\n<td class=\"line-content\">Conservas platos preparados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2651\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2652\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2653\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2654\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/conservas-vegetales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2655\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2656\"></td>\n<td class=\"line-content\">Conservas vegetales <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2657\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2658\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2659\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2660\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/dieteticos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/dieteticos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2661\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2662\"></td>\n<td class=\"line-content\">Diet&#195;&#169;ticos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2663\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2664\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2665\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2666\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/galletas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/galletas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2667\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2668\"></td>\n<td class=\"line-content\">Galletas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2669\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2670\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2671\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2672\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/golosinas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/golosinas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2673\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2674\"></td>\n<td class=\"line-content\">Golosinas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2675\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2676\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2677\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2678\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/harinas-y-gofio.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2679\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2680\"></td>\n<td class=\"line-content\">Harinas y gofio <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2681\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2682\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2683\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2684\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/infusiones-y-tes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2685\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2686\"></td>\n<td class=\"line-content\">Infusiones y t&#195;&#169;s <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2687\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2688\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2689\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2690\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/legumbres-secas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2691\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2692\"></td>\n<td class=\"line-content\">Legumbres secas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2693\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2694\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2695\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2696\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/panaderia.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/panaderia.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2697\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2698\"></td>\n<td class=\"line-content\">Panader&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2699\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2700\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2701\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2702\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/pasta.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/pasta.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2703\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2704\"></td>\n<td class=\"line-content\">Pasta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2705\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2706\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2707\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2708\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/pasteleria-industrial.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2709\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2710\"></td>\n<td class=\"line-content\">Pasteler&#195;&#173;a industrial\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2711\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2712\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2713\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2714\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/reposteria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/reposteria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2715\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2716\"></td>\n<td class=\"line-content\">Reposter&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2717\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2718\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2719\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2720\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/alimentacion/salsas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/salsas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2721\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2722\"></td>\n<td class=\"line-content\">Salsas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2723\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2724\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2725\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2726\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2727\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2728\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2729\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2730\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2731\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2732\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2733\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2734\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2735\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2736\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2737\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2738\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2739\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bebidas\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2740\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bebidas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2741\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2742\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2743\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2744\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2745\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2746\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2747\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/agua.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/agua.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2748\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2749\"></td>\n<td class=\"line-content\">Agua <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2750\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2751\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2752\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2753\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/alcoholicas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/alcoholicas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2754\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2755\"></td>\n<td class=\"line-content\">Alcoh&#195;&#179;licas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2756\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2757\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2758\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2759\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/cervezas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/cervezas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2760\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2761\"></td>\n<td class=\"line-content\">Cervezas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2762\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2763\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2764\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2765\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/refrescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/refrescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2766\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2767\"></td>\n<td class=\"line-content\">Refrescos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2768\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2769\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2770\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2771\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebidas/zumos-y-nectares.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2772\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2773\"></td>\n<td class=\"line-content\">Zumos y n&#195;&#169;ctares <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2774\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2775\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2776\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2777\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2778\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2779\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2780\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2781\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2782\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2783\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2784\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2785\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2786\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2787\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2788\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2789\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2790\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bodega\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2791\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bodega<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2792\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2793\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2794\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2795\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2796\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2797\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2798\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/espumosos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/espumosos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2799\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2800\"></td>\n<td class=\"line-content\">Espumosos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2801\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2802\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2803\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2804\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/sangria-y-tinto-de-verano.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2805\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2806\"></td>\n<td class=\"line-content\">Sangr&#195;&#173;a y tinto de verano\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2807\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2808\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2809\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2810\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/sidras.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/sidras.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2811\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2812\"></td>\n<td class=\"line-content\">Sidras <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2813\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2814\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2815\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2816\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-blanco.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-blanco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2817\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2818\"></td>\n<td class=\"line-content\">Vino blanco <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2819\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2820\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2821\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2822\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-de-jerez.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2823\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2824\"></td>\n<td class=\"line-content\">Vino de Jerez <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2825\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2826\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2827\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2828\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-de-mesa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2829\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2830\"></td>\n<td class=\"line-content\">Vino de mesa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2831\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2832\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2833\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2834\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-dulce.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-dulce.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2835\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2836\"></td>\n<td class=\"line-content\">Vino dulce <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2837\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2838\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2839\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2840\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-rosado.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-rosado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2841\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2842\"></td>\n<td class=\"line-content\">Vino rosado <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2843\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2844\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2845\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2846\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bodega/vino-tinto.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bodega/vino-tinto.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2847\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2848\"></td>\n<td class=\"line-content\">Vino tinto <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2849\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2850\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2851\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2852\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2853\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2854\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2855\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2856\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2857\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2858\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2859\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2860\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2861\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2862\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2863\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2864\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2865\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-frescos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2866\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Frescos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2867\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2868\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2869\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2870\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2871\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2872\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2873\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/carne.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2874\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2875\"></td>\n<td class=\"line-content\">Carne <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2876\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2877\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2878\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2879\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/carnicos-envasados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2880\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2881\"></td>\n<td class=\"line-content\">C&#195;&#161;rnicos envasados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2882\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2883\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2884\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2885\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/charcuteria-al-corte.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2886\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2887\"></td>\n<td class=\"line-content\">Charcuter&#195;&#173;a al corte\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2888\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2889\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2890\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2891\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/charcuteria-envasada.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2892\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2893\"></td>\n<td class=\"line-content\">Charcuteria envasada <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2894\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2895\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2896\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2897\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/fruta.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/fruta.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2898\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2899\"></td>\n<td class=\"line-content\">Fruta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2900\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2901\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2902\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2903\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/panaderia-y-pasteleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2904\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2905\"></td>\n<td class=\"line-content\">Panader&#195;&#173;a y\npasteler&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2906\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2907\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2908\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2909\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/pescado-y-marisco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2910\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2911\"></td>\n<td class=\"line-content\">Pescado y marisco <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2912\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2913\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2914\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2915\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/platos-preparados.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2916\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2917\"></td>\n<td class=\"line-content\">Platos preparados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2918\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2919\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2920\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2921\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/quesos-al-corte.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2922\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2923\"></td>\n<td class=\"line-content\">Quesos al corte <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2924\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2925\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2926\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2927\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/quesos-envasados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/quesos-envasados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2928\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2929\"></td>\n<td class=\"line-content\">Quesos envasados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2930\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2931\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2932\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2933\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/salsas-refrigeradas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2934\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2935\"></td>\n<td class=\"line-content\">Salsas refrigeradas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2936\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2937\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2938\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2939\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2940\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2941\"></td>\n<td class=\"line-content\">Verduras y Hortalizas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2942\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2943\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2944\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2945\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/zumos-y-sopas-refrigeradas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2946\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2947\"></td>\n<td class=\"line-content\">Zumos y sopas refrigeradas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2948\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2949\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2950\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2951\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2952\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2953\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2954\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2955\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2956\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2957\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2958\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2959\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2960\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2961\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2962\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2963\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2964\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-congelados\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2965\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Congelados<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2966\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2967\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2968\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2969\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2970\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2971\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2972\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/bases-y-masas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/bases-y-masas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2973\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2974\"></td>\n<td class=\"line-content\">Bases y masas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2975\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2976\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2977\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2978\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/carne.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/carne.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2979\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2980\"></td>\n<td class=\"line-content\">Carne <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2981\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2982\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2983\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2984\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/helados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/helados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2985\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2986\"></td>\n<td class=\"line-content\">Helados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2987\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2988\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2989\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2990\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/hielo.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/hielo.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2991\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2992\"></td>\n<td class=\"line-content\">Hielo <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2993\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2994\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2995\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2996\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/panaderia-y-pasteleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2997\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2998\"></td>\n<td class=\"line-content\">Panader&#195;&#173;a y\npasteler&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"2999\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3000\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3001\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3002\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/pescado-y-marisco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3003\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3004\"></td>\n<td class=\"line-content\">Pescado y marisco <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3005\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3006\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3007\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3008\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/platos-preparados.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/platos-preparados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3009\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3010\"></td>\n<td class=\"line-content\">Platos preparados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3011\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3012\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3013\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3014\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/congelados/verduras-y-hortalizas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3015\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3016\"></td>\n<td class=\"line-content\">Verduras y hortalizas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3017\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3018\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3019\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3020\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3021\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3022\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3023\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3024\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3025\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3026\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3027\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3028\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3029\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3030\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3031\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3032\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3033\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-derivados-lacteos-y-huevos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3034\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Derivados l&#195;&#161;cteos y\nhuevos<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3035\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3036\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3037\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3038\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3039\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3040\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3041\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/batidos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3042\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3043\"></td>\n<td class=\"line-content\">Batidos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3044\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3045\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3046\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3047\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/bebidas-vegetales.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3048\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3049\"></td>\n<td class=\"line-content\">Bebidas vegetales <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3050\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3051\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3052\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3053\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/cafe-frio.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3054\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3055\"></td>\n<td class=\"line-content\">Caf&#195;&#169; fr&#195;&#173;o\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3056\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3057\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3058\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3059\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/flan.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3060\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3061\"></td>\n<td class=\"line-content\">Flan <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3062\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3063\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3064\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3065\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/huevos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3066\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3067\"></td>\n<td class=\"line-content\">Huevos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3068\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3069\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3070\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3071\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3072\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3073\"></td>\n<td class=\"line-content\">Leches <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3074\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3075\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3076\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3077\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/mantequilla.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3078\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3079\"></td>\n<td class=\"line-content\">Mantequilla <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3080\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3081\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3082\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3083\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/margarina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3084\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3085\"></td>\n<td class=\"line-content\">Margarina <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3086\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3087\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3088\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3089\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-liquida.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3090\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3091\"></td>\n<td class=\"line-content\">Nata l&#195;&#173;quida <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3092\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3093\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3094\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3095\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/nata-montada.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3096\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3097\"></td>\n<td class=\"line-content\">Nata montada <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3098\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3099\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3100\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3101\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/natillas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3102\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3103\"></td>\n<td class=\"line-content\">Natillas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3104\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3105\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3106\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3107\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/postres.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3108\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3109\"></td>\n<td class=\"line-content\">Postres <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3110\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3111\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3112\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3113\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3114\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3115\"></td>\n<td class=\"line-content\">Yogur y petit <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3116\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3117\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3118\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3119\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3120\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3121\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3122\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3123\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3124\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3125\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3126\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3127\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3128\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3129\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3130\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3131\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3132\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bebe\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3133\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Beb&#195;&#169;<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3134\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3135\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3136\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3137\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3138\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3139\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3140\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/accesorios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/accesorios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3141\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3142\"></td>\n<td class=\"line-content\">Accesorios <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3143\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3144\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3145\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3146\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3147\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3148\"></td>\n<td class=\"line-content\">Alimentaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3149\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3150\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3151\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3152\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bebe/higiene.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bebe/higiene.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3153\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3154\"></td>\n<td class=\"line-content\">Higiene <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3155\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3156\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3157\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3158\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3159\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3160\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3161\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3162\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3163\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3164\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3165\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3166\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3167\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3168\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3169\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3170\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3171\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-higiene-y-perfumeria\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3172\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Higiene y\nperfumer&#195;&#173;a<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3173\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3174\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3175\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3176\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3177\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3178\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3179\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/afeitado.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3180\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3181\"></td>\n<td class=\"line-content\">Afeitado <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3182\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3183\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3184\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3185\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-corporal.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3186\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3187\"></td>\n<td class=\"line-content\">Cuidado corporal <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3188\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3189\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3190\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3191\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3192\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3193\"></td>\n<td class=\"line-content\">Cuidado del cabello <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3194\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3195\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3196\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3197\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-facial.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3198\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3199\"></td>\n<td class=\"line-content\">Cuidado facial <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3200\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3201\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3202\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3203\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/depilacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3204\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3205\"></td>\n<td class=\"line-content\">Depilaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3206\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3207\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3208\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3209\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/desodorantes.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3210\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3211\"></td>\n<td class=\"line-content\">Desodorantes <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3212\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3213\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3214\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3215\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/fragancias.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3216\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3217\"></td>\n<td class=\"line-content\">Fragancias <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3218\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3219\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3220\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3221\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/higiene-bucal.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3222\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3223\"></td>\n<td class=\"line-content\">Higiene bucal <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3224\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3225\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3226\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3227\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/maquillaje.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3228\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3229\"></td>\n<td class=\"line-content\">Maquillaje <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3230\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3231\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3232\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3233\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/parafarmacia.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3234\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3235\"></td>\n<td class=\"line-content\">Parafarmacia <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3236\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3237\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3238\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3239\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/proteccion-e-higiene-intima.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3240\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3241\"></td>\n<td class=\"line-content\">Protecci&#195;&#179;n e higiene\n&#195;&#173;ntima <span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3242\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3243\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3244\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3245\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3246\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3247\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3248\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3249\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3250\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3251\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3252\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3253\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3254\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3255\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3256\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3257\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3258\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon\ncat-icon-drogueria-y-limpieza\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3259\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Droguer&#195;&#173;a y\nlimpieza<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3260\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3261\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3262\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3263\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3264\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3265\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3266\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/celulosa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3267\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3268\"></td>\n<td class=\"line-content\">Celulosa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3269\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3270\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3271\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3272\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/detergentes-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3273\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3274\"></td>\n<td class=\"line-content\">Detergentes ropa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3275\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3276\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3277\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3278\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/limpieza.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3279\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3280\"></td>\n<td class=\"line-content\">Limpieza <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3281\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3282\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3283\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3284\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/suavizantes-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3285\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3286\"></td>\n<td class=\"line-content\">Suavizantes ropa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3287\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3288\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3289\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3290\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/drogueria-y-limpieza/tratamientos-ropa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3291\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3292\"></td>\n<td class=\"line-content\">Tratamientos ropa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3293\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3294\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3295\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3296\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3297\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3298\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3299\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3300\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3301\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3302\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3303\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3304\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3305\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3306\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3307\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3308\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3309\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-hogar\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3310\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Hogar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3311\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3312\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3313\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3314\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3315\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3316\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3317\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/accesorios-ba-o.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3318\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3319\"></td>\n<td class=\"line-content\">Accesorios ba&#195;&#177;o <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3320\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3321\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3322\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3323\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/limpieza-del-hogar.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3324\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3325\"></td>\n<td class=\"line-content\">Limpieza del hogar <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3326\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3327\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3328\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3329\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-cocina.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-cocina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3330\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3331\"></td>\n<td class=\"line-content\">Menaje cocina <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3332\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3333\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3334\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3335\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-desechable.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-desechable.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3336\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3337\"></td>\n<td class=\"line-content\">Menaje desechable <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3338\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3339\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3340\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3341\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/menaje-mesa.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/menaje-mesa.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3342\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3343\"></td>\n<td class=\"line-content\">Menaje mesa <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3344\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3345\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3346\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3347\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/ordenacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/ordenacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3348\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3349\"></td>\n<td class=\"line-content\">Ordenaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3350\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3351\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3352\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3353\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/hogar/peque-o-aparato-electrico.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3354\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3355\"></td>\n<td class=\"line-content\">Peque&#195;&#177;o aparato\nel&#195;&#169;ctrico <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3356\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3357\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3358\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3359\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3360\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3361\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3362\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3363\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3364\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3365\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3366\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3367\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3368\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3369\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3370\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3371\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3372\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-bazar\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3373\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Bazar<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3374\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3375\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3376\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3377\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3378\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3379\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3380\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/automovil.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/automovil.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3381\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3382\"></td>\n<td class=\"line-content\">Autom&#195;&#179;vil <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3383\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3384\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3385\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3386\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/bricolaje.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/bricolaje.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3387\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3388\"></td>\n<td class=\"line-content\">Bricolaje <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3389\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3390\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3391\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3392\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/jardineria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/jardineria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3393\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3394\"></td>\n<td class=\"line-content\">Jardiner&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3395\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3396\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3397\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3398\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/kiosco.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/kiosco.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3399\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3400\"></td>\n<td class=\"line-content\">Kiosco <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3401\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3402\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3403\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3404\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/menaje-decoracion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3405\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3406\"></td>\n<td class=\"line-content\">Menaje decoraci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3407\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3408\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3409\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3410\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/bazar/papeleria.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/bazar/papeleria.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3411\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3412\"></td>\n<td class=\"line-content\">Papeler&#195;&#173;a <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3413\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3414\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3415\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3416\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3417\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3418\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3419\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3420\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3421\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3422\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3423\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3424\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3425\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3426\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3427\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3428\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3429\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-mascotas\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3430\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Mascotas<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3431\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3432\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3433\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3434\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3435\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3436\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3437\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/mascotas/accesorios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/mascotas/accesorios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3438\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3439\"></td>\n<td class=\"line-content\">Accesorios <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3440\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3441\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3442\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3443\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/mascotas/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/mascotas/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3444\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3445\"></td>\n<td class=\"line-content\">Alimentaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3446\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3447\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3448\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3449\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3450\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3451\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3452\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3453\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3454\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3455\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3456\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3457\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3458\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3459\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3460\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3461\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3462\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-ecologicos\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3463\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Ecol&#195;&#179;gicos<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3464\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3465\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3466\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3467\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3468\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3469\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3470\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3471\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3472\"></td>\n<td class=\"line-content\">Alimentaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3473\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3474\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3475\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3476\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/catalog/category/view/s/bebe/id/819/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3477\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3478\"></td>\n<td class=\"line-content\">Beb&#195;&#169; <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3479\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3480\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3481\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3482\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/bebidas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/bebidas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3483\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3484\"></td>\n<td class=\"line-content\">Bebidas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3485\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3486\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3487\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3488\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/derivados-lacteos-y-huevos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3489\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3490\"></td>\n<td class=\"line-content\">Derivados l&#195;&#161;cteos y huevos\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3491\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3492\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3493\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3494\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ecologicos/frescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ecologicos/frescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3495\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3496\"></td>\n<td class=\"line-content\">Frescos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3497\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3498\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3499\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3500\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3501\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3502\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3503\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3504\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3505\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3506\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3507\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3508\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3509\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3510\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3511\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3512\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3513\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-gourmet\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3514\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Gourmet<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3515\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3516\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3517\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3518\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3519\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3520\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3521\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/alimentacion.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/alimentacion.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3522\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3523\"></td>\n<td class=\"line-content\">Alimentaci&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3524\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3525\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3526\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3527\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/bebidas.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/bebidas.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3528\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3529\"></td>\n<td class=\"line-content\">Bebidas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3530\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3531\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3532\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3533\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/congelados.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/congelados.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3534\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3535\"></td>\n<td class=\"line-content\">Congelados <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3536\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3537\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3538\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3539\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/gourmet/frescos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/gourmet/frescos.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3540\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3541\"></td>\n<td class=\"line-content\">Frescos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3542\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3543\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3544\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3545\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3546\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3547\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3548\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3549\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3550\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3551\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header\nsubdropdown--trigger flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3552\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3553\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3554\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3555\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subdropdown__icon icon icon-right\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3556\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3557\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3558\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__icon cat-icon cat-icon-ocio\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3559\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--header flex-item\nflex-double</span>\"&gt;</span>Ocio<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3560\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3561\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3562\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3563\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">subcategory-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3564\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3565\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3566\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/camping.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/camping.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3567\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3568\"></td>\n<td class=\"line-content\">Camping <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3569\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3570\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3571\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3572\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/jardin.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/jardin.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3573\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3574\"></td>\n<td class=\"line-content\">Jard&#195;&#173;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3575\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3576\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3577\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3578\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/playa-y-piscina.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3579\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3580\"></td>\n<td class=\"line-content\">Playa y piscina <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3581\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3582\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3583\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper flex-item</span>\n\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3584\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ocio/varios.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/ocio/varios.html</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3585\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item\nmenu--link</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3586\"></td>\n<td class=\"line-content\">Varios <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3587\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3588\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3589\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3590\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3591\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3592\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3593\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3594\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3595\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3596\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3597\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3598\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3599\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/div&gt;</span>\n<span class=\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-info--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3600\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">side-menu-info--container flex-container\nflex-column</span> \"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3601\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3602\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3603\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3604\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3605\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control dropdown__control--info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3606\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3607\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon--info icon\nicon-user</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3608\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3609\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3610\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span>Mi cuenta<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3611\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3612\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3613\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3614\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3615\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3616\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3617\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3618\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3619\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\n\"noreferrer noopener\">#</a>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3620\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3621\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">openCustomModal</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3622\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-login</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3623\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3624\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-user</span>\"&gt;</span><span class=\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3625\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3626\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper menu--link dropdown---info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3627\"></td>\n<td class=\"line-content\">Iniciar sesi&#195;&#179;n <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3628\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3629\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3630\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3631\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/#\" rel=\n\"noreferrer noopener\">#</a>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3632\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3633\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">openCustomModal</span>\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3634\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-login</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3635\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3636\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-add</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3637\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3638\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper menu--link dropdown---info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3639\"></td>\n<td class=\"line-content\">Crear nueva cuenta <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3640\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3641\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3642\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3643\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3644\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3645\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3646\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group dropdown--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3647\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3648\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3649\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__header--container\nflex-container flex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3650\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control dropdown__control--info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3651\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3652\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon--info icon\nicon-info</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3653\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3654\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3655\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span>Informaci&#195;&#179;n\ncorporativa<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3656\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3657\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3658\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3659\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3660\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3661\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3662\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">category__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3663\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3664\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/contact/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/contact/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3665\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3666\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-Bubble</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3667\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3668\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">linl--wrapper menu--link dropdown---info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3669\"></td>\n<td class=\"line-content\">Atenci&#195;&#179;n al cliente\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3670\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3671\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3672\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3673\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/folletos/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/folletos/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3674\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3675\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-Openbook</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3676\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3677\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3678\"></td>\n<td class=\"line-content\">Folletos <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3679\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3680\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3681\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3682\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/noticias/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/noticias/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3683\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3684\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-news</span>\"&gt;</span><span class=\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3685\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3686\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3687\"></td>\n<td class=\"line-content\">Noticias <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3688\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3689\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3690\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3691\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/empleo/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/empleo/</a>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3692\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3693\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3694\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-Briefcase</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3695\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3696\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3697\"></td>\n<td class=\"line-content\">Empleo <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3698\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3699\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3700\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3701\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tiendas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tiendas/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3702\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3703\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-house</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3704\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3705\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3706\"></td>\n<td class=\"line-content\">Nuestras tiendas <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3707\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3708\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3709\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar-item--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3710\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tarjeta-hiperdino/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link-info item--container flex-container\nflex-row items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3711\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sidebar__item-info\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3712\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon\nicon-payment</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3713\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3714\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3715\"></td>\n<td class=\"line-content\">Tarjeta Hiperdino <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3716\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3717\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3718\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3719\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3720\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3721\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3722\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3723\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/div&gt;</span>\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3724\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3725\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3726\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">content--wrapper has-category flex-item\nflex-double</span>\"&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">page messages</span>\"&gt;</span><span class=\n\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">data-placeholder</span>=\"<span class=\n\"html-attribute-value\">messages</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3727\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">container container-message</span>\"\n<span class=\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">scope: 'messages'</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3728\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- ko if:\ncookieMessages &amp;&amp; cookieMessages.length &gt; 0\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3729\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">alert</span>\" <span class=\n\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">foreach: { data: cookieMessages, as:\n'message' }</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">messages</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3730\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">attr: {</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3731\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">class: 'message-' + message.type + ' ' +\nmessage.type + ' message ' + message.type + '-message input\ninput__complex--container flex-container flex-row\nitems-center',</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3732\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">'data-ui-id': 'message-' +\nmessage.type</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3733\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">}</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3734\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">html:\nmessage.text</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3735\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3736\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3737\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- /ko\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3738\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- ko if:\nmessages().messages &amp;&amp; messages().messages.length &gt; 0\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3739\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">role</span>=\"<span class=\n\"html-attribute-value\">alert</span>\" <span class=\n\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">foreach: { data: messages().messages, as:\n'message' }</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">messages</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3740\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">attr: {</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3741\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">class: 'message-' + message.type + ' ' +\nmessage.type + ' message ' + message.type + '-message input\ninput__complex--container flex-container flex-row\nitems-center',</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3742\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">'data-ui-id': 'message-' +\nmessage.type</span></span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3743\"></td>\n<td class=\"line-content\"><span class=\"html-tag\"><span class=\n\"html-attribute-value\">}</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3744\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">data-bind</span>=\"<span class=\n\"html-attribute-value\">html:\nmessage.text</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3745\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3746\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3747\"></td>\n<td class=\"line-content\"><span class=\"html-comment\">&lt;!-- /ko\n--&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3748\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3749\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3750\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3751\"></td>\n<td class=\"line-content\">{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3752\"></td>\n<td class=\"line-content\">\"*\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3753\"></td>\n<td class=\"line-content\">\"Magento_Ui/js/core/app\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3754\"></td>\n<td class=\"line-content\">\"components\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3755\"></td>\n<td class=\"line-content\">\"messages\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3756\"></td>\n<td class=\"line-content\">\"component\":\n\"Magento_Theme/js/view/messages\"</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3757\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3758\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3759\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3760\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3761\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3762\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3763\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3764\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;section\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">big-banner\nsection--block</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3765\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">container</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3766\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3767\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3768\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3769\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3770\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3771\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/campana-lanzamiento\" rel=\n\"noreferrer noopener\">/campana-lanzamiento</a>\" &gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3772\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/Banner_primera_compra-onlineTodaslasislas-web.jpg\"\nrel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/Banner_primera_compra-onlineTodaslasislas-web.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3773\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3774\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3775\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3776\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3777\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3778\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3779\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3780\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3781\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3782\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/video-web\" rel=\n\"noreferrer noopener\">video-web</a>\" &gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3783\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/New_Banner_577x3775_1_.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/New_Banner_577x3775_1_.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3784\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3785\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3786\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3787\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3788\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3789\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3790\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3791\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3792\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper\ncol-12</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3793\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner big--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3794\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3795\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/carne.html#vacuno-a-ojo-entrecot\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/carne.html#vacuno-a-ojo-entrecot</a>\"\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3796\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/af.slide_1190X577_1_mayo.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/af.slide_1190X577_1_mayo.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3797\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3798\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3799\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3800\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3801\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3802\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3803\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3804\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3805\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3806\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3807\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3808\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html#papa-seleccionada\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/frescos/verduras-y-hortalizas.html#papa-seleccionada</a>\"\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3809\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/af.slide_577x377px_1_mayo2.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/af.slide_577x377px_1_mayo2.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3810\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3811\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3812\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3813\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3814\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3815\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3816\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3817\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3818\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3819\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html#pascual-leche-semidesnatada-1-lt\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/leches.html#pascual-leche-semidesnatada-1-lt</a>\"\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3820\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/af.slide_577x377px_1_mayo.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/af.slide_577x377px_1_mayo.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3821\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3822\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3823\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3824\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3825\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3826\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3827\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3828\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3829\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper\ncol-12</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3830\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner big--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3831\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3832\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/Slide_780x368_sem14-diadelamadre.jpg\"\nrel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/Slide_780x368_sem14-diadelamadre.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3833\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3834\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3835\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3836\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3837\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3838\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3839\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3840\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3841\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3842\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3843\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html#danone-actimel-liquido-natural-6x100-gr\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/derivados-lacteos-y-huevos/yogur-y-petit.html#danone-actimel-liquido-natural-6x100-gr</a>\"\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3844\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/af._banner_577x377px_1_mayo2_1.jpg\"\nrel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/af._banner_577x377px_1_mayo2_1.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3845\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3846\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3847\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3848\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3849\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3850\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3851\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3852\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3853\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3854\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html?brand%5B%5D=2780&amp;cat=341\"\nrel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/higiene-y-perfumeria/cuidado-del-cabello.html?brand%5B%5D=2780&amp;cat=341</a>\"\n&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3855\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/af._banner_577x377px_1_mayo.jpg\"\nrel=\"noreferrer noopener\">https://cdn.hiperdino.es/home/af._banner_577x377px_1_mayo.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3856\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3857\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3858\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3859\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3860\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3861\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3862\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3863\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3864\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3865\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3866\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3867\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/ofertas-spot\" rel=\n\"noreferrer noopener\">ofertas-spot</a>\" &gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3868\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/Banners_577x377-Spot_1_.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/Banners_577x377-Spot_1_.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3869\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3870\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3871\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3872\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3873\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3874\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3875\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper col-sm-12 col-md-6\ncol-lg-6</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3876\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner\nmedium--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3877\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3878\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.plandinobp.es/es/inicio\" rel=\n\"noreferrer noopener\">https://www.plandinobp.es/es/inicio</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3879\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/Banners_577x377-BP.jpg\" rel=\n\"noreferrer noopener\">https://cdn.hiperdino.es/home/Banners_577x377-BP.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3880\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3881\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3882\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3883\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3884\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3885\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3886\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3887\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3888\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner--wrapper\ncol-12</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3889\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner big--banner</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3890\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3891\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/recetas/\" rel=\n\"noreferrer noopener\">recetas/</a>\" &gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3892\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;img\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__image</span>\" <span class=\n\"html-attribute-name\">src</span>=\"<a class=\n\"html-attribute-value html-resource-link\" target=\"_blank\" href=\n\"https://cdn.hiperdino.es/home/Banners_1190X577_Recetas_1_.jpg\"\nrel=\"noreferrer noopener\">https://cdn.hiperdino.es/home/Banners_1190X577_Recetas_1_.jpg</a>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3893\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3894\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3895\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3896\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3897\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3898\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3899\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3900\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3901\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3902\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3903\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3904\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/section&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3905\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3906\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;section\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">small-banner\nsection--block</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3907\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">container</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3908\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">banner__group row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3909\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3910\"></td>\n<td class=\"line-content\"></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3911\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3912\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3913\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/section&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3914\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">form_key</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">value</span>=\"<span class=\n\"html-attribute-value\">JTZ8TY7ZrxstF7cc</span>\"\n/&gt;</span><span class=\"html-tag\">&lt;script <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3915\"></td>\n<td class=\"line-content\">\n{\"*\":{\"Magento_Customer\\/js\\/section-config\":{\"sections\":{\"stores\\/store\\/switch\":\"*\",\"directory\\/currency\\/switch\":\"*\",\"*\":[\"messages\"],\"customer\\/account\\/logout\":[\"recently_viewed_product\",\"recently_compared_product\"],\"customer\\/account\\/loginpost\":\"*\",\"customer\\/account\\/createpost\":\"*\",\"customer\\/account\\/editpost\":\"*\",\"customer\\/ajax\\/login\":[\"checkout-data\",\"cart\"],\"catalog\\/product_compare\\/add\":[\"compare-products\"],\"catalog\\/product_compare\\/remove\":[\"compare-products\"],\"catalog\\/product_compare\\/clear\":[\"compare-products\"],\"sales\\/guest\\/reorder\":[\"cart\"],\"sales\\/order\\/reorder\":[\"cart\"],\"review\\/product\\/post\":[\"review\"],\"checkout\\/cart\\/add\":[\"cart\"],\"checkout\\/cart\\/delete\":[\"cart\"],\"checkout\\/cart\\/updatepost\":[\"cart\",\"yireo-gtm-order\",\"yireo-gtm-quote\"],\"checkout\\/cart\\/updateitemoptions\":[\"cart\"],\"checkout\\/cart\\/couponpost\":[\"cart\"],\"checkout\\/cart\\/estimatepost\":[\"cart\"],\"checkout\\/cart\\/estimateupdatepost\":[\"cart\"],\"checkout\\/onepage\\/saveorder\":[\"cart\",\"checkout-data\",\"last-ordered-items\",\"checkout-fields\",\"yireo-gtm-order\",\"yireo-gtm-quote\"],\"checkout\\/sidebar\\/removeitem\":[\"cart\"],\"checkout\\/sidebar\\/updateitemqty\":[\"cart\"],\"rest\\/*\\/v1\\/carts\\/*\\/payment-information\":[\"cart\",\"checkout-data\",\"last-ordered-items\",\"instant-purchase\"],\"rest\\/*\\/v1\\/guest-carts\\/*\\/payment-information\":[\"cart\",\"checkout-data\"],\"rest\\/*\\/v1\\/guest-carts\\/*\\/selected-payment-method\":[\"cart\",\"checkout-data\"],\"rest\\/*\\/v1\\/carts\\/*\\/selected-payment-method\":[\"cart\",\"checkout-data\",\"instant-purchase\"],\"wishlist\\/index\\/update\":[\"cart\",\"wishlist\"],\"wishlist\\/index\\/add\":[\"wishlist\"],\"wishlist\\/index\\/remove\":[\"wishlist\"],\"wishlist\\/index\\/updateitemoptions\":[\"wishlist\"],\"wishlist\\/index\\/cart\":[\"wishlist\",\"cart\"],\"wishlist\\/index\\/fromcart\":[\"wishlist\",\"cart\"],\"wishlist\\/index\\/allcart\":[\"wishlist\",\"cart\"],\"wishlist\\/shared\\/allcart\":[\"wishlist\",\"cart\"],\"wishlist\\/shared\\/cart\":[\"cart\"],\"paypal\\/express\\/placeorder\":[\"cart\",\"checkout-data\"],\"paypal\\/payflowexpress\\/placeorder\":[\"cart\",\"checkout-data\"],\"authorizenet\\/directpost_payment\\/place\":[\"cart\",\"checkout-data\"],\"braintree\\/paypal\\/placeorder\":[\"cart\",\"checkout-data\"],\"customer\\/address\\/*\":[\"instant-purchase\"],\"customer\\/account\\/*\":[\"instant-purchase\"],\"vault\\/cards\\/deleteaction\":[\"instant-purchase\"],\"multishipping\\/checkout\\/overviewpost\":[\"cart\"],\"checkout\\/onepage\\/success\":[\"yireo-gtm-order\",\"yireo-gtm-quote\"]},\"clientSideSections\":[\"checkout-data\",\"cart-data\"],\"baseUrls\":[\"https:\\/\\/www.hiperdino.es\\/c9495\\/\"]}}}<span class=\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3916\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3917\"></td>\n<td class=\"line-content\">\n{\"*\":{\"Magento_Customer\\/js\\/customer-data\":{\"sectionLoadUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/customer\\/section\\/load\\/\",\"expirableSectionLifetime\":60,\"expirableSectionNames\":[\"cart\"],\"cookieLifeTime\":\"86400\",\"updateSessionUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/customer\\/account\\/updateSession\\/\"}}}<span class=\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3918\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3919\"></td>\n<td class=\"line-content\">\n{\"*\":{\"Magento_Customer\\/js\\/invalidation-processor\":{\"invalidationRules\":{\"website-rule\":{\"Magento_Customer\\/js\\/invalidation-rules\\/website-rule\":{\"scopeConfig\":{\"websiteId\":4}}}}}}}<span class=\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3920\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3921\"></td>\n<td class=\"line-content\">{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3922\"></td>\n<td class=\"line-content\">\"body\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3923\"></td>\n<td class=\"line-content\">\"pageCache\":\n{\"url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/page_cache\\/block\\/render\\/\",\"handles\":[\"default\",\"cms_index_index\",\"cms_page_view\",\"cms_index_index_id_home\"],\"originalRequest\":{\"route\":\"cms\",\"controller\":\"index\",\"action\":\"index\",\"uri\":\"\\/c9495\\/\"},\"versionCookieName\":\"private_content_version\"}\n}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3924\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3925\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3926\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;footer\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">page-footer</span>\"&gt;</span><span class=\n\"html-tag\">&lt;div <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">ban-news</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3927\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">ban-news__wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3928\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h2 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text text--center\ntit--news</span>\"&gt;</span>Recibe nuestras ofertas por\nEmail<span class=\"html-tag\">&lt;/h2&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3929\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">newsletter-form</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hiperdino_newsletter/subscribe/</span>\"\n<span class=\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3930\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center ban-news__email</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3931\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3932\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3933\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3934\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__text flex-item flex-double</span>\"\n<span class=\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">placeholder</span>=\"\"/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3935\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">input</span>\"&gt;</span>Correo\nelectr&#195;&#179;nico<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3936\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3937\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3938\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3939\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3940\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__button block--wrapper flex-item\nban-news__button</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3941\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal button__complex--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3942\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3943\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3944\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text\nflex-item</span>\"&gt;</span>Suscribirse<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3945\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3946\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3947\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3948\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3949\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3950\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3951\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3952\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">main-footer</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3953\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">container</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3954\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3955\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__left--wrapper col-md-12\ncol-lg-4</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3956\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-left--container flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3957\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__logo flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3958\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3959\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__text flex-item</span>\"&gt;</span>Haz\ntu compra Online en cualquier lugar, en cualquier\nmomento.<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3960\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-store--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3961\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-store--container flex-container\nflex-row flex-wrap justify-start\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3962\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3963\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://itunes.apple.com/es/app/hiperdino-online/id1195964502\"\nrel=\"noreferrer noopener\">https://itunes.apple.com/es/app/hiperdino-online/id1195964502</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3964\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\napp-store--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3965\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3966\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3967\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3968\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://play.google.com/store/apps/details?id=com.hiperdino.compraonline\"\nrel=\n\"noreferrer noopener\">https://play.google.com/store/apps/details?id=com.hiperdino.compraonline</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3969\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\ngoogle-play--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3970\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3971\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3972\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3973\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3974\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__text\nflex-item</span>\"&gt;</span>S&#195;&#173;guenos en:<span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3975\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-store--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3976\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-store--container flex-container\nflex-row flex-wrap justify-start\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3977\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3978\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://twitter.com/HiperDino_\" rel=\n\"noreferrer noopener\">https://twitter.com/HiperDino_</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3979\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\ntwitter--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3980\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3981\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3982\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3983\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.facebook.com/HiperdinoSupermercados.es\" rel=\n\"noreferrer noopener\">https://www.facebook.com/HiperdinoSupermercados.es</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3984\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\nfacebook--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3985\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3986\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3987\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3988\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.instagram.com/hiperdino_\" rel=\n\"noreferrer noopener\">https://www.instagram.com/hiperdino_</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3989\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\ninstagram--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3990\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3991\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3992\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3993\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.pinterest.es/hiperdinosuper\" rel=\n\"noreferrer noopener\">https://www.pinterest.es/hiperdinosuper</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3994\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\npinterest--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3995\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3996\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3997\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store__item\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3998\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.youtube.com/user/Hiperdinomercado\" rel=\n\"noreferrer noopener\">https://www.youtube.com/user/Hiperdinomercado</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">link--wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"3999\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">store--badge\nyoutube--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4000\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/a&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4001\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4002\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4003\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4004\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-cards--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4005\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-cards--container flex-container\nflex-row justify-start items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4006\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">card__item flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4007\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">card--badge\nvisa--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4008\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4009\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">card__item flex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4010\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">card--badge\nmastercard--badge</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4011\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4012\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4013\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4014\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4015\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4016\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__right--wrapper col-md-12\ncol-lg-8</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4017\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">row</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4018\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-sections--wrapper col-sm-6\ncol-md-4</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4019\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4020\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span>Informaci&#195;&#179;n\ncorporativa<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4021\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4022\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4023\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/folletos/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/folletos/</a>\"&gt;</span>Folletos<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4024\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/noticias/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/noticias/</a>\"&gt;</span>Noticias<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4025\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tiendas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tiendas/</a>\"&gt;</span>Nuestras\ntiendas<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4026\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/empleo/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/empleo/</a>\"&gt;</span>Empleo<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4027\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tarjeta-hiperdino/</a>\"&gt;</span>Tarjeta\nHiperDino<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4028\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://fundaciondinosol.org/\" rel=\n\"noreferrer noopener\">https://fundaciondinosol.org/</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>Fundacion\nDinoSol<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4029\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"http://www.hiperdinoexpress.es/\" rel=\n\"noreferrer noopener\">http://www.hiperdinoexpress.es/</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>HiperDino\nExpress<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4030\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.dinosol.es/\" rel=\n\"noreferrer noopener\">https://www.dinosol.es/</a>\" <span class=\n\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>Grupo\nDinoSol<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4031\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/instagram-alisiosygaldar/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/instagram-alisiosygaldar/</a>\"&gt;</span>Concurso\nInstagram Alisios y G&#195;&#161;ldar<span class=\n\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4032\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/ul&gt;</span>\n<span class=\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4033\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4034\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-help--wrapper col-sm-6\ncol-md-4</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4035\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span>Informaci&#195;&#179;n compra\nonline<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4036\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4037\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/pago/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/pago/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pago<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4038\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/condiciones-entrega/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/condiciones-entrega/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Condiciones de\nentrega<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4039\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/producto-hiperdino/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/producto-hiperdino/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Producto\nHiperDino<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4040\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/devoluciones/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/devoluciones/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Devoluciones<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4041\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/condiciones-compra/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/condiciones-compra/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Condiciones de\ncompra<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4042\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/recetas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/recetas/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Recetas<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4043\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/campana-lanzamiento/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/campana-lanzamiento/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Campa&#195;&#177;a\nLanzamiento<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span> <span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4044\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4045\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-services--wrapper col-sm-6\ncol-md-4</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4046\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span>Servicio atenci&#195;&#179;n al\ncliente<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4047\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4048\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4049\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-privacidad/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-privacidad/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pol&#195;&#173;tica\nde privacidad<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4050\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-cookies/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-cookies/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pol&#195;&#173;tica\nde cookies<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4051\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/aviso-legal/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/aviso-legal/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Aviso\nlegal<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4052\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/conexion-segura/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/conexion-segura/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Conexi&#195;&#179;n\nsegura<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4053\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/contact/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/contact/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Contacto<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4054\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/ul&gt;</span>\n<span class=\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4055\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4056\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4057\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4058\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4059\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4060\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4061\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4062\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4063\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-mobile</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4064\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-mobile__wrapper flex-column\nflex-container</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4065\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group click--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4066\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group--container flex-container\njustify-between flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4067\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4068\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header--container\nflex-container flex-row justify-between\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4069\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4070\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4071\"></td>\n<td class=\"line-content\">Informaci&#195;&#179;n corporativa\n<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4072\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4073\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4074\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-cente justify-end</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4075\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4076\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4077\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4078\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4079\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4080\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4081\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4082\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4083\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/folletos/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/folletos/</a>\"&gt;</span>Folletos<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4084\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/noticias/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/noticias/</a>\"&gt;</span>Noticias<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4085\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tiendas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tiendas/</a>\"&gt;</span>Nuestras\ntiendas<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4086\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/empleo/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/empleo/</a>\"&gt;</span>Empleo<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4087\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/tarjeta-hiperdino/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/tarjeta-hiperdino/</a>\"&gt;</span>Tarjeta\nHiperDino<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4088\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://fundaciondinosol.org/\" rel=\n\"noreferrer noopener\">https://fundaciondinosol.org/</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>Fundacion\nDinoSol<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4089\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"http://www.hiperdinoexpress.es/\" rel=\n\"noreferrer noopener\">http://www.hiperdinoexpress.es/</a>\"\n<span class=\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>HiperDino\nExpress<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4090\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.dinosol.es/\" rel=\n\"noreferrer noopener\">https://www.dinosol.es/</a>\" <span class=\n\"html-attribute-name\">target</span>=\"<span class=\n\"html-attribute-value\">_blank</span>\"&gt;</span>Grupo\nDinoSol<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4091\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\" <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/instagram-alisiosygaldar/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/instagram-alisiosygaldar/</a>\"&gt;</span>Concurso\nInstagram Alisios y G&#195;&#161;ldar<span class=\n\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4092\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/ul&gt;</span>\n<span class=\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4093\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4094\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4095\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4096\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group click--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4097\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group--container flex-container\njustify-between flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4098\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4099\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header--container\nflex-container flex-row justify-between\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4100\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4101\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4102\"></td>\n<td class=\"line-content\">Informaci&#195;&#179;n compra online\n<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4103\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4104\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4105\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-cente justify-end</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4106\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4107\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4108\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4109\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4110\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4111\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4112\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4113\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/pago/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/pago/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pago<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4114\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/condiciones-entrega/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/condiciones-entrega/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Condiciones de\nentrega<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4115\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/producto-hiperdino/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/producto-hiperdino/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Producto\nHiperDino<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4116\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/devoluciones/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/devoluciones/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Devoluciones<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4117\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/condiciones-compra/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/condiciones-compra/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Condiciones de\ncompra<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4118\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/recetas/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/recetas/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Recetas<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4119\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/campana-lanzamiento/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/campana-lanzamiento/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Campa&#195;&#177;a\nLanzamiento<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span> <span class=\n\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4120\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4121\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4122\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4123\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group click--trigger\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4124\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group--container flex-container\njustify-between flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4125\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4126\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__header--container\nflex-container flex-row justify-between\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4127\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">menu__text dropdown--info flex-item\nflex-double</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4128\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;h3 <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">header__text\nfooter--header</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4129\"></td>\n<td class=\"line-content\">Servicio atenci&#195;&#179;n al cliente\n<span class=\"html-tag\">&lt;/h3&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4130\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4131\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4132\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__control--container flex-container\nflex-row items-cente justify-end</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4133\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dropdown__icon dropdown__icon--info icon\nicon-right flex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4134\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4135\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4136\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4137\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4138\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer-group__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4139\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;ul <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">footer__list flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4140\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4141\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-privacidad/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-privacidad/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pol&#195;&#173;tica\nde privacidad<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4142\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/politica-cookies/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/politica-cookies/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Pol&#195;&#173;tica\nde cookies<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4143\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/aviso-legal/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/aviso-legal/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Aviso\nlegal<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4144\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/conexion-segura/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/conexion-segura/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Conexi&#195;&#179;n\nsegura<span class=\"html-tag\">&lt;/a&gt;</span><span class=\n\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4145\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;li <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">list__item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;a <span class=\n\"html-attribute-name\">href</span>=\"<a class=\n\"html-attribute-value html-external-link\" target=\"_blank\" href=\n\"https://www.hiperdino.es/c9495/contact/\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/contact/</a>\"\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">item__text</span>\"&gt;</span>Contacto<span class=\"html-tag\">&lt;/a&gt;</span><span class=\"html-tag\">&lt;/li&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4146\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;/ul&gt;</span>\n<span class=\"html-tag\">&lt;/ul&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4147\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4148\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4149\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4150\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4151\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4152\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/footer&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\n\"html-tag\">&lt;/main&gt;</span><span class=\"html-tag\">&lt;script\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text/x-magento-init</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4153\"></td>\n<td class=\"line-content\">{</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4154\"></td>\n<td class=\"line-content\">\"*\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4155\"></td>\n<td class=\"line-content\">\"Magento_Ui/js/core/app\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4156\"></td>\n<td class=\"line-content\">\"components\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4157\"></td>\n<td class=\"line-content\">\"storage-manager\": {</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4158\"></td>\n<td class=\"line-content\">\"component\":\n\"Magento_Catalog/js/storage-manager\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4159\"></td>\n<td class=\"line-content\">\"appendTo\": \"\",</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4160\"></td>\n<td class=\"line-content\">\"storagesConfiguration\" :</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4161\"></td>\n<td class=\"line-content\">\n{\"recently_viewed_product\":{\"requestConfig\":{\"syncUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/catalog\\/product\\/frontend_action_synchronize\\/\"},\"lifetime\":\"1000\",\"allowToSendRequest\":null},\"recently_compared_product\":{\"requestConfig\":{\"syncUrl\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/catalog\\/product\\/frontend_action_synchronize\\/\"},\"lifetime\":\"1000\",\"allowToSendRequest\":null},\"product_data_storage\":{\"updateRequestConfig\":{\"url\":\"https:\\/\\/www.hiperdino.es\\/c9495\\/rest\\/c9494\\/V1\\/products-render-info\"},\"allowToSendRequest\":null}}\n}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4162\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4163\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4164\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4165\"></td>\n<td class=\"line-content\">}</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4166\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/script&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4167\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4168\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart-modal flex-container flex-row\njustify-end items-start</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4169\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4170\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4171\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4172\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">cart-modal-info-wrapper</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">block--container flex-container flex-column\njustify-start</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4173\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4174\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4175\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__control</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4176\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon cart__close\nflex-container flex-row justify-center items-center</span>\"\n<span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\"html-attribute-value\">closeCustomModal</span>\"\n<span class=\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">cart-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4177\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4178\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4179\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4180\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4181\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4182\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">listas-modal flex-container flex-row\njustify-end items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4183\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4184\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4185\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">listas--container listas--container--full\nflex-container flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4186\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4187\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__controls--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4188\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__controls--container flex-row\njustify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4189\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__control cart__control--lists\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4190\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon cart__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4191\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">listas-modal</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4192\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4193\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4194\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4195\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__control--list cart__control--lists\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4196\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon cart__back--list\nflex-container flex-row justify-center items-center\naction_openDinolistasModal</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4197\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdwishlists/xhr/dinolistasAll/viewAll/1/</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4198\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item text-base</span>\"&gt;</span>Ver\nlistas HiperDino<span class=\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4199\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-arrow_forward\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4200\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4201\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4202\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4203\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4204\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4205\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">wishlists-all-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4206\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4207\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4208\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4209\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4210\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4211\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4212\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal\ndialogBox-modal-wishlists-add flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4213\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4214\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4215\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4216\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4217\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4218\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4219\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4220\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-wishlists-add</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4221\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4222\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4223\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4224\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4225\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4226\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4227\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4228\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4229\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4230\"></td>\n<td class=\"line-content\">Selecciona una lista <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4231\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4232\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4233\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">wishlists-add-form</span>\" <span class=\n\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdwishlists/xhr/addWishlistProduct/</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4234\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">product_id</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4235\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">qty</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4236\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">from_cart</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4237\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">from_dinolista</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4238\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">from_recipe</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4239\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">product_options</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4240\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">recipe_products</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4241\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">wishlists-add-form-content</span>\"\n<span class=\"html-attribute-name\">data-url</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdwishlists/xhr/addForm/</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4242\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4243\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4244\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4245\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4246\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4247\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4248\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4249\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4250\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4251\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4252\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dinolistas-modal flex-container flex-row\njustify-end items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4253\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4254\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4255\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">listas--container listas--container--full\nflex-container flex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4256\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4257\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__controls--wrapper\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4258\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__controls--container flex-row\njustify-between items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4259\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__control cart__control--lists\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4260\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon cart__close\nflex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4261\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dinolistas-modal</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4262\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4263\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4264\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4265\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">cart__control--list cart__control--lists\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4266\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon cart__back--list\nflex-container flex-row justify-center items-center\naction_backToListas</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4267\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-arrow_back\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4268\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;span\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-item text-base</span>\"&gt;</span>Volver\na Mis Listas<span class=\"html-tag\">&lt;/span&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4269\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4270\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4271\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4272\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4273\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4274\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">dinolistas-all-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4275\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4276\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4277\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4278\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4279\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4280\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4281\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal\ndialogBox-modal-wishlists-share flex-container flex-row\njustify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4282\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4283\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4284\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4285\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4286\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4287\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4288\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4289\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-wishlists-share</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4290\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4291\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4292\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4293\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4294\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4295\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4296\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4297\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4298\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\" <span class=\n\"html-attribute-name\">style</span>=\"<span class=\n\"html-attribute-value\">line-height: 1;</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4299\"></td>\n<td class=\"line-content\">Escribe el email de la persona con la que\nquieres compartir esta lista <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4300\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4301\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4302\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">wishlists-share-form</span>\" <span class=\n\"html-attribute-name\">method</span>=\"<span class=\n\"html-attribute-value\">post</span>\" <span class=\n\"html-attribute-name\">action</span>=\"<span class=\n\"html-attribute-value\">https://www.hiperdino.es/c9495/hdwishlists/xhr/shareWishlist/</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4303\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">hidden</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">wishlist_id</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4304\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4305\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4306\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4307\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4308\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">text</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">email</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" <span class=\n\"html-attribute-name\">placeholder</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4309\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">input</span>\"&gt;</span>Correo\nelectr&#195;&#179;nico<span class=\n\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4310\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4311\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4312\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4313\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4314\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4315\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal checked has-margin-bottom flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4316\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4317\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4318\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text button__text--checkout\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4319\"></td>\n<td class=\"line-content\">Compartir <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4320\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4321\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4322\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4323\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4324\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4325\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4326\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4327\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4328\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4329\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4330\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4331\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4332\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4333\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal dialogBox-modal-checkoutpswd\nflex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4334\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4335\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox--wrapper\ndialogBox--wrapper--height-fixed postal-wrapper has-not-padding\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4336\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4337\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__item dialogBox__recover\nflex-container flex-row-toggle\njustify-between</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4338\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4339\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">login__control quickview__control\nquickview__control-modal</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4340\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__icon quickview__close\ncontrol-position flex-container flex-row justify-center\nitems-center</span>\"</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4341\"></td>\n<td class=\"line-content\"><span class=\n\"html-attribute-name\">data-myaction</span>=\"<span class=\n\"html-attribute-value\">closeCustomModal</span>\" <span class=\n\"html-attribute-name\">data-target</span>=\"<span class=\n\"html-attribute-value\">dialogBox-modal-checkoutpswd</span>\"&gt;</td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4342\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;i <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">icon icon-close\nflex-item</span>\"&gt;</span><span class=\n\"html-tag\">&lt;/i&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4343\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4344\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4345\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4346\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__recover-content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4347\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__content flex-container\nflex-column</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4348\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4349\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4350\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4351\"></td>\n<td class=\"line-content\">Introduce tu contrase&#195;&#177;a\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4352\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4353\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4354\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">dialogBox__sub-title\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4355\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">sub-title__text</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4356\"></td>\n<td class=\"line-content\">Para usar una tarjeta guardada es\nnecesario que introduzcas nuevamente tu clave de usuario.\n<span class=\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4357\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4358\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4359\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;br/&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4360\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4361\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;form\n<span class=\"html-attribute-name\">id</span>=\"<span class=\n\"html-attribute-value\">modalCheckoutPswdForm</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4362\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form-control\nno-border</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4363\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input input__complex input__complex--modal\ninput__complex--container flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4364\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4365\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">flex-container flex-row justify-center\nitems-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4366\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">input-wrapper</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4367\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;input\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">password</span>\" <span class=\n\"html-attribute-name\">name</span>=\"<span class=\n\"html-attribute-value\">modal-checkoutpswd</span>\" <span class=\n\"html-attribute-name\">value</span>=\"\" <span class=\n\"html-attribute-name\">placeholder</span>=\"\" /&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4368\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;label\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">control-label</span>\" <span class=\n\"html-attribute-name\">for</span>=\"<span class=\n\"html-attribute-value\">input</span>\"&gt;</span>Contrase&#195;&#177;a<span class=\"html-tag\">&lt;/label&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4369\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4370\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4371\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4372\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4373\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4374\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">form-control\nno-border</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4375\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;button\n<span class=\"html-attribute-name\">type</span>=\"<span class=\n\"html-attribute-value\">submit</span>\" <span class=\n\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button button__complex\nbutton__complex--modal checked has-margin-bottom flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4376\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4377\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__content--container flex-container\nflex-row justify-center items-center</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4378\"></td>\n<td class=\"line-content\"><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">button__text button__text--checkout\nflex-item</span>\"&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4379\"></td>\n<td class=\"line-content\">Realizar pedido <span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4380\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4381\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4382\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/button&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4383\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4384\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/form&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4385\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4386\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4387\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4388\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4389\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4390\"></td>\n<td class=\"line-content\"><br></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4391\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4392\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4393\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/div&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">full-select--wrapper</span>\"&gt;</span><span class=\"html-tag\">&lt;div\n<span class=\"html-attribute-name\">class</span>=\"<span class=\n\"html-attribute-value\">full-select--container</span>\"&gt;</span>&amp;nbsp;<span class=\"html-tag\">&lt;/div&gt;</span><span class=\"html-tag\">&lt;/div&gt;</span>\n<span class=\"html-tag\">&lt;/body&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4394\"></td>\n<td class=\"line-content\"><span class=\n\"html-tag\">&lt;/html&gt;</span></td>\n</tr>\n<tr>\n<td class=\"line-number\" value=\"4395\"></td>\n<td class=\"line-content\"></td>\n</tr>\n</tbody>\n</table>\n</body>\n</html>\n\n", "url": "/tema3-web/practicas/p9-t3-transforming-data/hiperdino.html" }, { "title": "Reto p9-t3-transfoming-data", "excerpt": "\n", "content": "Reto p9-t3-transfoming-data\n\nUsando los módulos\n\n\n request o request-promise y\n cheerio,\n\n\nEscriba un programa Node.js al que se le pasa como argumento en línea de comandos una categoría de alimento \ny que muestre una lista de objetos JSON con las descripciones de \nlos productos y precios de los productos en Hiperdino que caen en dicha categoría.\n\nAlgo similar a esto:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n$ ./hiperdino.js cacao-y-cafe\n{ \"precio\": \"1,04 €\", \"descripcion\": \"Candelaria baxcao cacao 250 gr\"}\n{ \"precio\": \"2,72 €\", \"descripcion\": \"Cola Cao avenacao cacao soluble 350 gr\"}\n{ \"precio\": \"2,42 €\", \"descripcion\": \"Cola Cao cacao 0% fibra 300 gr\"}\n{ \"precio\": \"13,94 €\", \"descripcion\": \"Cola Cao cacao 3 kg\"}\n{ \"precio\": \"22,52 €\", \"descripcion\": \"Cola Cao cacao caja 5 kg\"}\n{ \"precio\": \"2,62 €\", \"descripcion\": \"Cola Cao cacao complet 360 gr\"}\n{ \"precio\": \"5,46 €\", \"descripcion\": \"Cola Cao cacao ecobolsa 1,2 kg\"}\n{ \"precio\": \"6,59 €\", \"descripcion\": \"Cola Cao cacao en polvo instantáneo 0% 700 gr\"}\n{ \"precio\": \"2,96 €\", \"descripcion\": \"Cola Cao cacao light 325 gr\"}\n{ \"precio\": \"3,29 €\", \"descripcion\": \"Cola Cao cacao noir300 gr\"}\n{ \"precio\": \"2,70 €\", \"descripcion\": \"Cola Cao cacao original 400 gr\"}\n{ \"precio\": \"4,41 €\", \"descripcion\": \"Cola Cao cacao original 800 gr\"}\n...\n\n\n\nLa idea es que en la web de Hiperdino para obtener la información sobre una categoría de productos como arroz debemos hacer un request a una ruta como esta:\n\nhttps://online.hiperdino.es/c9495/alimentacion/arroz.html\n\nEn general para una :categoria-de-alimento \nla ruta será https://online.hiperdino.es/c9495/alimentacion/:categoria-de-alimento.html\n\nCategorías de Alimentos de Hiperdino\n\nEstas son algunas categorías de alimentos reconocidas por Hiperdino:\n\n\n arroz\n aceites\n azucar-y-edulcorantes\n cacao-y-cafe\n conservas-fruta-y-dulces\n\n\nEn general, se puede saber que categorías de alimentos están disponibles visitando la página\nhttps://www.hiperdino.es/. En la izquierda aparece un menu navgable con los categorías de alimentos. Cuando visite esta página,\npulse en el menú de contexto inspeccionar estando en el panel izquierdo \nsobre la categoría de alimento deseada y así podrá saber el nombre la página HTML:\n\n\n\nDe hecho si nos descargamos \nla página html de https://www.hiperdino.es/ \ny hacemos una búsqueda con grep \ncomo esta:\n\n1\n$ grep 'https://www.hiperdino.es/c9495/alimentacion/' hiperdino.md \n\n\nobtenemos la lista de páginas HTML para las categorías de alimentos:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n\"https://www.hiperdino.es/c9495/alimentacion/aceites.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aceites.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/aperitivo.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/aperitivo.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/arroz.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/arroz.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html\"\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/azucar-y-edulcorantes.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html\"\nrel=\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cacao-y-cafe.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html\"\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/caldos-sopas-y-cremas.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/cereales.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/cereales.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/chocolate.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/chocolate.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html\"\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/comida-internacional.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/condimentos.html\" rel=\n\"noreferrer noopener\">https://www.hiperdino.es/c9495/alimentacion/condimentos.html</a>\"\n\"https://www.hiperdino.es/c9495/alimentacion/conservas-carne.html\"\n...\n\n\nSugerencias para Buscar la Descripción y Precio de un Item de una Categoría de Producto\n\nA fecha de Mayo de 2019 la página de Hiperdino para una categoría de producto\nhttps://online.hiperdino.es/c9495/alimentacion/categoria-de-alimento.html\ntiene una estructura como sigue:\n\n\n \n Cada producto se describe en un elemento li con la clase .product-list-item\n\n \n \n \n La descripción del producto está en un div con la clase .description__text\n\n \n \n \n El precio aparece en un elemento divcon la clase .price__left y dentro del mismo en un div con la clase\n.price__text\n\n \n \n\n\nRecursos. Páginas Completas\n\n\n Página Completa de la categoría arroz: https://www.hiperdino.es/c9495/alimentacion/arroz.html (Mayo 2019)\n Página Completa https://www.hiperdino.es/c9495/ (Mayo 2019)\n\n", "url": "/tema3-web/practicas/p9-t3-transforming-data/reto.html" }, { "title": "React", "excerpt": "\n", "content": "React\n\nIntro to React\n\nLearn by Doing\n\n\n Tutorial: Intro to React\n\n\nHello World React (Learning Concepts from the Ground Up)\n\n\n React: Hello World\n Introducing JSX\n Rendering Elements\n Components and Props\n State and Lifecycle\n Handling Events\n Conditional Rendering\n Lists and Keys\n Forms\n Lifting State Up\n Composition vs Inheritance\n Thinking In React\n Listenable Events\n\n\nCreating a React App\n\nThis page describes a few popular React toolchains (like create-react-app, gatsby) which help with tasks like:\n\n\n Scaling to many files and components.\n Using third-party libraries from npm.\n Detecting common mistakes early.\n Live-editing CSS and JS in development.\n Optimizing the output for production.\n\n\nCreate React App. Set up a modern web app by running one command\n\n\n Create a new React App\n create-react-app docs\n Create React App. Set up a modern web app by running one command\n YouTube video: Getting Started with Create React App by Elijah Manor\n Emoji Search. Created with create-react-app GitHub Example Repo\n This project was bootstrapped with Create React App\n\n\nHow to get “create-react-app” to work with your API\n\n\n How to get “create-react-app” to work with your API by Anthony Accomazzo. A simple food nutrition lookup table. The data driving the app is supplied by the USDA’s National Nutrient Database.\n npm concurrently package\n \n \n \n Why?: I like task automation with npm but the usual way to run multiple commands concurrently is npm run watch-js & npm run watch-css. That’s fine but it’s hard to keep on track of different outputs. Also if one process fails, others still keep running and you won’t even notice the difference. Another option would be to just run all commands in separate terminals. I got tired of opening terminals and made concurrently.\n \n \n Blog: 4 Solutions To Run Multiple Node.js or NPM Commands Simultaneously by Paige Niedringhaus\n \n \n Section Proxying API Requests in Development in the Create React App docs\n Deploying in Heroku\n \n The Heroku CLI article\n \n \n sql.js\n\n\nReact and Boostrap. React-Boostrap\n\n\n React Bootstrap\n Getting Started\n\n\nReact Tutorial How to build React App in few minutes\n\n\n React Tutorial How to build React App in few minutes YouTube\n \n GitHub Repo for How to build React App in few minutes using react-bootstrap\n \n React Tutorial: How to build React App in few minutes\n \n Index\n References\n Installing create-react-app\n Creating API Call\n \n Trying the fake API\n Adding componentDidMount\n \n \n Styling with Boostrap\n Adding Pagination\n Factorizing Components\n Styling with react-bootstrap\n \n React-Bootstrap References\n \n \n Rewriting the App using Only Functional Components\n \n useState\n useEffect\n \n Cleaning up an effect\n Conditionally firing an effect\n Mount and Unmount Effects\n \n \n The result\n \n \n \n \n \n \n ButtonGroup\n Buttons\n \n \n\n\nReact in Visual Studio Code\n\n\n Using React in Visual Studio Code\n Visual studio code changes format (React-JSX)\n\n\nFor a Web App\n\nThe majority of websites aren’t, and don’t need to be, single-page apps. With a few lines of code and no build tooling, try React in a small part of your website. You can then either gradually expand its presence, or keep it contained to a few dynamic widgets.\n\n\n Add React to a Web Site\n\n\nFrom Scratch\n\n\n Creating a React App… From Scratch\n \n Github repo paradoxinversion/creating-a-react-app-from-scratch\n \n \n\n\nReact Function Components\n\n\n React Function Components\n\n\n\n In the past, there have been various React Component Types, but with the introduction of React Hooks it’s possible to write your entire application with just functions as React components.\n\n\n\n This in-depth guide shows you everything about React Function Components – which are basically just JavaScript Functions being React Components which return JSX (React’s Syntax) – so that after you have read this tutorial you should be well prepared to implement modern React applications with them.\n\n\nCSS modules\n\n\n Css Modules by Example\n CSS Modules\n\n\nLearning React by Eve Porcello, Alex Banks\n\n\n Table of contents of the book Learning React by Eve Porcello, Alex Banks Index. Be sure you are authenticated in PuntoQ\n MoonHighway/learning-react Github repo with the code samples for Learning React by Alex Banks and Eve Porcello, published by O’Reilly Media\n\n\nReact Router\n\nThe Problem\n\nThe biggest difference of Single Page Apps (SPA) with traditional multi-page apps is that navigating a single-page app doesn’t involve going to an entirely new page. Instead, your pages (commonly known as views in this context) typically load inline within the same page itself.\n\nWhen you are loading content inline, things get a little challenging. The hard part is not loading the content itself. That is relatively easy. The hard part is making sure that single-page apps behave in a way that is consistent with what your users are used to. More specifically, when users navigate your app, they expect that:\n\n\n The URL displayed in the address bar always reflects the thing that they are viewing.\n They can use the browser’s back and forward buttons…successfully.\n They can navigate to a particular view (aka deep link) directly using the appropriate URL.\n\n\nWith multi-page apps, these three things come for free. There is nothing extra you have to do for any of it. With single-page apps, because you aren’t navigating to an entirely new page, you have to do real work to deal with these three things that your users expect to just work.\n\nTo deal with all of this, you have a bucket full of techniques commonly known as routing.\n\nThe Solution\n\nSee Creating a Single-Page App in React: using React Router \nby kirupa\n\nGatsBy: A Static Site Generator Using React\n\n\n Gatsby\n\n\nReferences\n\n{% include references-react.md %}\n\nPráctica p11-t3-react-tic: Tutorial “Intro to React”. Tic-Tac-Toe\n\n\n Descripción de la práctica\n\n\nPráctica p14-t3-react-components\n\n\n Descripción de la práctica\n\n\nPráctica p15-t3-react-lists-and-conditionals\n\n\n Descripción de la práctica\n\n\n", "url": "/tema3-web/react.html" }, { "title": "REST", "excerpt": "\n", "content": "REST\n\nREST is an acronym that stands for Representational State Transfer.\n\n\n REST en http://crguezl.github.io/apuntes-ruby/\n\n\nWhen an API is RESTful, it is HTTP-based and its resources are identified by their URLs.\n\nRequesting or making a change to a resource comes down to issuing an HTTP request using the particular method that matches your intent.\n\nFor example, the HTTP GET method retrieves a resource, and HTTP PUT sends a resource to be saved.\n\nBibliografía Básica\n\n\n Safari. Chapter 6. Commanding Databases\n \n BULL PuntoQ\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way con las soluciones (privado)\n \n \n REST API Tutorial\n Libro Pro REST API Development with Node.js by Fernando Doglio. Apress 2015 Book PuntoQ BULL\n REST with Hypermedia - Hot or Not? blog by Tom Hombergs\n \n mikekelly/hal-browser\n \n \n\n\nREST API concepts and examples (Youtube video)\n\nAPI for beginners (Youtube video) por Le Wagon\n\n\n programmableweb.com/\n How to Send an SMS With Node.js Using Twilio\n Google >Servicios web > Geocoding API\n Wufoo: Crea y comparte tus formularios\n Trello for developers\n Guerrilla Mail - Direcciones de email temporales\n Zapier\n \n Getting Started With Zapier\n \n \n RequestBin gives you a URL that will collect requests made to it and let you inspect them in a human-friendly way.\nUse RequestBin to see what your HTTP client is sending or to inspect and debug webhook requests.\n\n\nTutorial: Crear API RESTful utilizando Node.js + Express.js + MongoDB\n\nChristopher Buecheler tutorial\n\n\n The Dead-Simple Step-By-Step Guide for Front-End Developers to Getting Up and Running With Node.JS, Express, and MongoDB by Christopher Buecheler\n \n Repo ULL-ESIT-MII-CA-1718/node-tutorial-for-frontend-devs\n \n \n Creating a Simple RESTful Web App with Node.js, Express, and MongoDB\n\n\nRESTful Web services: The basics by Alex Rodríguez\n\nBuild a RESTful API Using Node and Express 4\n\n\n GitHub repo ULL-ESIT-MII-CA-1718/node-api\n\n\nRESTful API From Scratch Using Node, Express and MongoDB (YouTube video. Sencillo)\n\nREST API con Express, Mongodb y Async/Await 6 vídeos por Fatz\n\nClientes para APIS REST\n\n{% include rest-clients.md %}\n\nMoleculer\n\n\n Moleculer services\n Repo de TFM de Alexis (Usamos Moleculer)\n\n\nEs una maravilla:\n\n\n Implementa automáticamente un API Gateway\n \n moleculer-web\n \n \n Implementa un patrón de publicador / suscriptor a eventos\n \n Events\n \n \n \n Examples\n \n YouTube video: An Introduction to Moleculer JS\n\n\nAPI Gateway es un servicio para la creación, publicación, mantenimiento, monitoreo y protección de API REST, HTTP y WebSocket a cualquier escala.\n\nUn API Gateway es la pieza encargada de unificar la publicación de APIs para que sean consumidas por otras aplicaciones o por los desarrolladores.\n\n\n Intercambiador de APIs: Componente cuya principal función es la de habilitar la conexión entre los servicios y los clientes.\n Gestor de APIs: Permite la configuración y publicación de APIs en el componente API Gateway.\n Dashboard de APIs: Recopila toda la información necesaria para los clientes sobre las APIs publicadas.\n\n\nPagination in the REST API\n\n\n Pagination in the REST API\n\n\nGoogle APIs\n\ngooglemaps/google-maps-services-js GitHub\n\n ¿Sabes cómo incluir Google Maps gratis en tu web? 07/09/2018\n\n\nGoogle Calendar API\n\n Repo de ejemplo de uso en NodeJS de la API de Calendar\n Tutorial Building a Google Calendar Booking App with MongoDB, ExpressJS, AngularJS, and Node.js \n Google APIs Client Library for JavaScript\n Google API Client Libraries JavaScript. Tutorial\n\n\nPrácticas\n\n\n Descripción de la práctica p10-t3-commanding-databases\n Práctica: developing RESTful Web Services (p11-t3-restful)\n\n", "url": "/tema3-web/rest.html" }, { "title": "Serverless", "excerpt": "\n", "content": "Serverless\n\n¿Qué es Serverless?\n\nServerless Stack\n\n\n La computación sin servidor (o serverless para abreviar) es un modelo de ejecución en el que el proveedor en la nube (AWS, Azure o Google Cloud) es responsable de ejecutar un fragmento de código mediante la asignación dinámica de los recursos. Y cobrando solo por la cantidad de recursos utilizados para ejecutar el código. El código, generalmente, se ejecuta dentro de contenedores sin estado que pueden ser activados por una variedad de eventos que incluyen solicitudes HTTP, eventos de base de datos, servicios de colas, alertas de monitoreo, carga de archivos, eventos programados (trabajos cron), etc. El código que se envía a al proveedor en la nube para la ejecución es generalmente en forma de una función. Por lo tanto, serverless a veces se denomina “Funciones como servicio” o “FaaS”. Las siguientes son las ofertas de FaaS de los principales proveedores en la nube:\n\n\n\n AWS: AWS Lambda\n Microsoft Azure: Azure Functions\n Google Cloud: Cloud Functions\n\n\nMientras que serverless abstrae la infraestructura subyacente al desarrollador, los servidores aún participan en la ejecución de nuestras funciones.\n\nDado que el código se ejecutará como funciones individuales, hay algunas cosas que debemos tener en cuenta.\n\nMicroservicios\n\n\n El cambio más grande al que nos enfrentamos durante la transición a un mundo sin servidor es que nuestra aplicación debe ser diseñada en forma de funciones. Puede que estés acostumbrado a implementar tu desarrollo como una sola aplicación monolítica en Rails o Express. Pero, en el mundo sin servidor normalmente se requiere que adopte una arquitectura basada en microservicios. Puedes solucionar esto ejecutando toda la aplicación dentro de una sola función como un monolito y manejando el enrutamiento por ti mismo. Pero esto no se recomienda ya que es mejor reducir el tamaño de tus funciones.\n\n\nserverless-stack.com tutorial\n\nPreface\n\n\n Who is this guide for?\n What does this guide cover?\n How to get help?\n\n\nIntroduction\n\n\n What is Serverless?\n What is AWS Lambda?\n Why create Serverless apps?\n\n\nSet up your AWS account\n\n\n Create an AWS account\n Create an IAM user\n \n What is IAM\n What is an ARN\n \n \n Configure the AWS CLI\n\n\nSetting up the Serverless backend\n\n\n Create a DynamoDB table\n Create an S3 bucket for file uploads\n Create a Cognito user pool\n \n Create a Cognito test user\n \n \n Set up the Serverless Framework\n \n Add support for ES6/ES7 JavaScript\n \n \n Initialize the backend repo\n\n\nBuilding a Serverless REST API\n\n\n Add a create note API\n Add a get note API\n Add a list all the notes API\n Add an update note API\n Add a delete note API\n Working with 3rd party APIs\n \n Setup a Stripe account\n Add a billing API\n Load secrets from .env\n Test the billing API\n \n \n Unit tests in Serverless\n Handle API Gateway CORS errors\n\n\nDeploying the backend\n\n\n Deploy the APIs\n Create a Cognito identity pool\n \n Cognito user pool vs identity pool\n \n \n Test the APIs\n\n\nSetting up a React app\n\n\n Create a new React.js app\n \n Initialize the frontend repo\n Add app favicons\n Set up custom fonts\n Set up Bootstrap\n \n \n Handle routes with React Router\n \n Create containers\n Adding links in the navbar\n Handle 404s\n \n \n Configure AWS Amplify\n\n\nBuilding a React app\n\n\n Create a login page\n \n Login with AWS Cognito\n Add the session to the state\n Load the state from the session\n Clear the session on logout\n Redirect on login and logout\n Give feedback while logging in\n Create a Custom React Hook to Handle Form Fields\n \n \n Create a signup page\n \n Create the signup form\n Signup with AWS Cognito\n \n \n Add the create note page\n \n Call the create API\n Upload a file to S3\n \n \n List all the notes\n \n Call the list API\n \n \n Display a note\n \n Render the note form\n Save changes to a note\n Delete a note\n \n \n Create a settings page\n \n Add Stripe keys to config\n Create a billing form\n Connect the billing form\n \n \n Set up secure pages\n \n Create a route that redirects\n Use the redirect routes\n Redirect on login\n \n \n\n\nDeploying the backend to production\n\n\n Getting production ready\n What is Infrastructure as Code?\n \n Configure DynamoDB in Serverless\n Configure S3 in Serverless\n Configure Cognito User Pool in Serverless\n Configure Cognito Identity Pool in Serverless\n \n \n Deploy your Serverless infrastructure\n Automating Serverless deployments\n \n Setting up your project on Seed\n Configure secrets in Seed\n Deploying through Seed\n Set custom domains through Seed\n \n \n Test the configured APIs\n Monitoring deployments in Seed\n\n\nDeploying the frontend to production\n\n\n Automating React Deployments\n \n Manage environments in Create React App\n Create a build script\n Setting up your project on Netlify\n Custom Domains in Netlify\n \n \n Frontend workflow\n\n\nConclusion\n\n\n Wrapping up\n Futher reading\n Translations\n Giving back\n Changelog\n Staying up to date\n\n", "url": "/tema3-web/serverless.html" }, { "title": "SQLite", "excerpt": "\n", "content": "SQLite\n\n\n Using DB Browser for SQLite\n SqLite Browser: Command Line Interface\n\n", "url": "/tema3-web/sqlite.html" }, { "title": "Tools for Static Blogs", "excerpt": "\n", "content": "Tools for Static Blogs\n\n\n A Faster Better Way to Build Websites: Introduction to Static Site Generators and the JAMstack YouTube\n\n\nJekyll\n\nGatsby\n\nHugo\n\nSpike\n\nPublii\n\n\n publii a new Static CMS with GUI to build an extremely\nsafe, fast and stylish HTML website\n\n\nThe New Dynamic\n\n\n The New Dynamic\n\n\n{ static is } The New Dynamic is one of the best resources for developers and designers that are embracing the static web technology.\n", "url": "/tema3-web/static-blogs.html" }, { "title": "Capítulo: Web Scrapping", "excerpt": "\n", "content": "Capítulo: Web Scrapping\n\n\n Crawling refers to the act of going through multiple sites. Web scrapping refers to going after content from a website. Scrapping refers to the act of getting the content from the site. See Stackoverflow\n\n\n\n Lea el \nCapítulo 5 “Transforming Data and Testing Continuously” de Node.JS The Right Way\ny resuelva los problemas en la secciónes \nExtracting Classification Codes y Extracting Sources\n\n\nPrácticas\n\n\n Práctica Transforming Data and Testing Continuously (p9-t3-transfoming-data)\n\n\nPuppeteer\n\n\n Web Scraping made simple with JAVASCRIPT tutorial YouTube video. Using puppeteer the author scrapes the information about a book in amazon. Pretty nice basic introduction to puppeteer\n Web Scraping with Puppeteer in 10 minutes - IMDB Movie Scraping NodeJs\n Web Scraping using Node.js and Puppeteer. A short introductory tutorial to Web Scraping\n Web Scraping with Puppeteer… And some more useful JavaScript nuances Blog\n Check out this tutorial how to use headless Chrome and Puppeteer to automatically scrape Craigslist.org and turn that data into a JSON API! YouTube video\n\n\nReferencias\n\n\n Cheerio. Introducción al Web Scraping con Nodejs, Javascript, y Async/await YouTube Video de Fazt Code\n How to Perform Web-Scraping using Node.js- Part 1\n \n How to Perform Web-Scraping using Node.js- Part 1\n How to Perform Web-Scraping using Node.js- Part 2\n ankitjain28may/scraping-nodejs\n ankitjain28may/scraping-using-node\n \n \n How can I scrape sites that require authentication using node.js? Stackoverflow\n\n", "url": "/tema3-web/web-scrapping.html" }, { "title": "Capítulo: Web Workers", "excerpt": "\n", "content": "Capítulo: Web Workers\n\nCode to create a worker from a String\n\n1\n2\n➜ jsday-canarias-2019-examples-multithreading git:(master) ✗ pwd\n/Users/casianorodriguezleon/campus-virtual/2021/learning/jsday-canarias-2019-examples-multithreading\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n/**\n * Create a new worker from JavaScript code instead of a URL\n * @param {string} workerCode The raw JavaScript code for the worker\n * @returns Returns the created worker\n */\nfunction createWorker(workerCode) {\n const blob = new Blob([workerCode], {type: 'application/javascript'});\n const workerURL = URL.createObjectURL(blob);\n return new Worker(workerURL);\n}\n\n\npostMessage Syntax and semantics\n\nThe postMessage() method of the Worker interface sends a message to the worker’s inner scope. This accepts a single parameter, which is the data to send to the worker. The data may be any value or JavaScript object handled by the structured clone algorithm, which includes cyclical references.\n\nThe Worker can send back information to the thread that spawned it using the DedicatedWorkerGlobalScope.postMessage method.\n\nSyntax\n\n1\nworker.postMessage(message, [transfer]);\n\n\nParameters\n\nmessage\n\nThe object to deliver to the worker; this will be in the data field in the event delivered to the DedicatedWorkerGlobalScope.onmessage handler. This may be any value or JavaScript object handled by the structured clone algorithm, which includes cyclical references.\n\nIf the message parameter is not provided, a TypeError will be thrown. If the data to be passed to the worker is unimportant, null or undefined can be passed explicitly.\n\ntransfer Optional\n\nAn optional array of Transferable objects to transfer ownership of. If the ownership of an object is transferred, it becomes unusable (neutered) in the context it was sent from and becomes available only to the worker it was sent to.\n\nTransferable objects are instances of classes like ArrayBuffer, MessagePort or ImageBitmap objects that can be transferred. null is not an acceptable value for transfer.\n\nReturns\n\nVoid.\n\nExamples of Web Worker Threads in Node.js\n\nSee the folder nodejs-threads inside the repo\nULL-MII-SYTWS-1920/jsday-canarias-2019-examples-multithreading\n\nReferences\n\n\n fibonacci-worker A web worker that calculates fibonacci numbers.\n Chinenye Onuegbu: Code examples for JSDay Canarias 2019\n \n Video\n /Users/casianorodriguezleon/campus-virtual/2021/learning/jsday-canarias-2019-examples-multithreading\n \n \n Book Web Workers: Safari O’Reilly. Usa Acceso ULL\n parallel-js-examples repo Parallel.js is a lib for parallel programming\n\n", "url": "/tema3-web/web-workers.html" }, { "title": "Webpack", "excerpt": "\n", "content": "Webpack\n\nWebpack: Getting Started\n\n\n Getting Started\n Tutorial del profesor en ULL-ESIT-PL/async-js-series-webpack\n\n\nSurvive.js Webpack book\n\n\n Foreword\n Preface\n Introduction\n What is Webpack\n Developing\n Getting Started\n webpack-dev-server\n Composing Configuration\n Styling\n Loading Styles\n Separating CSS\n Eliminating Unused CSS\n Autoprefixing\n Loading Assets\n Loader Definitions\n Loading Images\n Loading Fonts\n Loading JavaScript\n Building\n Source Maps\n Bundle Splitting\n Code Splitting\n Tidying Up\n Optimizing\n Minifying\n Tree Shaking\n Environment Variables\n Adding Hashes to Filenames\n Separating a Manifest\n Build Analysis\n Performance\n Output\n Build Targets\n Multiple Pages\n Server Side Rendering\n Techniques\n Dynamic Loading\n Web Workers\n Internationalization\n Testing\n Deploying Applications\n Consuming Packages\n Extending\n Extending with Loaders\n Extending with Plugins\n Conclusion\n Appendices\n Comparison of Build Tools\n Hot Module Replacement\n CSS Modules\n Searching with React\n Troubleshooting\n Glossary\n\n\nReferences\n\n{% include references-webpack.md %}\n\nParcel\n\n\n Parceljs: Getting Started\n\n", "url": "/tema3-web/webpack.html" }, { "title": "Capítulo: WebSockets", "excerpt": "\n", "content": "Capítulo: WebSockets\n\nLea:\n\n\n Capítulo WebSocket del libro The Modern JavaScript Tutorial\n Socket.io Official Guide: a chat\n \n Associated Repo\n \n \n\n\nBibliografía Complementaria\n\nBuild a simple chat app with node.js and socket.io Medium.com\n\n\n Build a simple chat app with node.js and socket.io By Noufel Gouirhate Dec 24, 2017 Medium.com\n \n Repo ULL-ESIT-DSI-1819/simpleChatApp\n \n \n\n\nReal Time Presentation Slides\n\n\n Real-time Presentation Slides with Socket.io, Node.js and Javascript by Nafeu Nasir at Medium.com\n \n Repo ULL-ESIT-DSI-1819/realtime-slides-tut.git\n \n \n\n\nWeb Sockets Tutorial (Node.js and Socket.io Chat App) in the Net Ninja Youtube Channel (5 videos)\n\n\n Repo ULL-ESIT-DSI-1819/websockets-playlist\n WebSockets (using Socket.io) Tutorial #1 - What Are WebSockets?\n \n Branch lesson 1\n \n \n WebSockets (using Socket.io) Tutorial #2 - Creating an Express App\n \n Branch lesson 2\n \n \n WebSockets (using Socket.io) Tutorial #3 - Using Socket.io\n \n Branch lesson 3\n \n \n\n\nYet Another Chat: Socket.io & Express NodeJS Tutorial to build a Realtime Chat App Youtube (2 videos)\n\n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 1\n Socket.io & Express NodeJS Tutorial to build a Realtime Chat App - Part 2\n Corresponding repo at GitHub\n\n\nUn artículo cortito para los que tienen prisa\n\n\n Article Introduction to Socket.io by Udara Bibile at Medium.com\n\n\nUn chat con mas funcionalidades aunque usando versiones algo obsoletas\n\n\n Node.js & Socket.io Chat video list by Smitha Milli (4 videos. Includes private messaging and MongoDB. Versiones viejas de express, socket.io y mongodb)\n \n code: nodejs-chat-complete\n Skeleton code for 2014 Hackers@Berkeley Node.js workshop\n \n \n\n\nBibliografía\n\n\n Libro: Socket.IO Real-time Web Application Development By: Rohit Rai book at PuntoQ ULL\n\n\nPrácticas\n\n\n Descripción de la práctica p5-t3-websockets\n\n", "url": "/tema3-web/websockets.html" }, { "title": "Software Development Cycle", "excerpt": "\n", "content": "Software Development Cycle\n\nGit Submódulos. Repos con varios Subproyectos\n\nEn muchas ocasiones es necesario tener junto a nuestro repo de proyecto otros repos de otros proyectos.\nPor ejemplo, cuando hacemos un paquete para npm es conveniente tener junto al repo del paquete un segundo \nrepositorio con un cliente que nos sirva para probar el correcto uso del paquete en producción. \nEsto nos lleva a veces a crear \nun macro-repo que contiene los repos acoplados.\n\n\n Chacon’s book on Git: Chapter 7.11 Git Tools - Submodules\n Ejemplo en https://github.com/ULL-ESIT-DSI-1617/create-a-npm-module\n \n Submódulo https://github.com/ULL-ESIT-DSI-1617/scapegoat\n Submódulo https://github.com/ULL-ESIT-DSI-1617/prueba-scapegoat\n \n \n\n\nGitHub Actions\n\n{% include github-actions.md %}\n\nVideos about GitHub Actions\n\n{% include videos-about-github-actions.md %}\n\nGitHub Package Registry\n\nGitHub Package Registry is a software package hosting service, similar to npmjs.org, rubygems.org, or hub.docker.com, that allows you to host your packages and code in one place. You can host software packages privately or publicly and use them as dependencies in your projects.\n\n\n About GitHub Package Registry\n Supported clients and formats\n Searching packages on GitHub\n Deleting a package\n Contacting support\n\n", "url": "/tema4-devops/control-version.html" }, { "title": "Docker", "excerpt": "\n", "content": "Docker\n\n¿Qué es un contenedor Docker?\n\nUn contenedor es más ligero, ya que mientras que a una máquina virtual necesitas instalarle un sistema operativo para funcionar, un contenedor de Docker funciona utilizando el sistema operativo que tiene la máquina en la que se ejecuta el contenedor\n\n¿Qué es una imagen de Docker?\n\nLas imágenes de Docker son esencialmente una instantánea de un contenedor. Las imágenes se crean con el comando build, que crean un contenedor cuando se inicia con run. Una vez creada una imagen, se pueden almacenar en el Hub Docker\n\n\n Docker Quick Start Guide. Earl Waud 2018 PuntoQ ULL Libro\n\n", "url": "/tema4-devops/docker.html" }, { "title": "A quick demo showing how to use GitHub Actions to build, package, and publish Node.js modules to the NPM and GitHub package registries.", "excerpt": "\n", "content": "A quick demo showing how to use GitHub Actions to build, package, and publish Node.js modules to the NPM and GitHub package registries.\n\nThis repo ULL-ESIT-PL-1920/lexer-generator contains the solution code for\na Lab for the subject “Procesadores de Lenguajes” (Language Processors)\nat Grado de Informatica de la ULL.\n\nIn branch github-action-npm I follow the YouTube tutorial\nA quick demo showing how to use GitHub Actions to build, package, and publish Node.js modules to the NPM and GitHub package registries.\n\nInitially:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created\n# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages\n\nname: Node.js Package\n\non:\n release:\n types: [created]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n - run: npm ci\n - run: npm test\n\n publish-npm:\n needs: build\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n registry-url: https://registry.npmjs.org/\n - run: npm ci\n - run: npm publish\n env:\n NODE_AUTH_TOKEN: ${{secrets.npm_token}}\n\n publish-gpr:\n needs: build\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n registry-url: https://npm.pkg.github.com/\n - run: npm ci\n - run: npm publish\n env:\n NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}\n\n\nrelease\n\nRuns your workflow anytime the release event occurs. More than one activity type triggers this event. For information about the REST API, see “Releases” in the GitHub Developer documentation.\n\n\n\n\nWebhook event payload\nActivity types\nGITHUB_SHA\nGITHUB_REF\n\n\n\n\nrelease\n- published, \n\n- unpublished \n\n- created \n\n- edited \n\n- deleted \n\n- prereleased\nLast commit in the tagged release\nTag of release\n\n\n\n\nFor example, you can run a workflow when a release has been published.\n\n1\n2\n3\non:\n release:\n types: [published]\n\n\nnpm tokens\n\n\n Creating and viewing authentication tokens\n\n", "url": "/tema4-devops/github-action-npm-publish.html" }, { "title": "GitHub Actions: An Introduction", "excerpt": "\n", "content": "GitHub Actions: An Introduction\n\nGithub Actions enables you to create custom software development lifecycle workflows directly in your Github repository. These workflows are made out of different tasks so-called actions that can be run automatically on certain events.\n\nThis enables you to include Continues Integration (CI) and continuous deployment (CD) capabilities and many other features directly in your repository.\n\nHere is a brief glossary of terms (for more see Core concepts for GitHub Actions):\n\nWorkflow\n\nA Workflow is an automated process that is made up of one or multiple jobs and can be triggered by an event. Workflows are defined using a YAML file in the .github/workflows directory.\n\nWorkflows can be created inside the .github/workflows directory by adding a .yml workflow file. Here in the terminal we do:\n\n1\n2\n$ mkdir -p .github/workflows\n$ touch .github/workflows/nodejs.yml\n\n\nand use our favourite editor.\n\nEjemplo:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nname: Node.js Package\non:\n release:\n types: [created]\njobs:\n build:\n ...\n publish-npm:\n ...\n publish-gpr:\n needs: build\n ...\n\n\nThe Editor of Github Actions\n\nWe can also use the GitHub Interface.\n\nThe Github Actions Editor is quite clever: Auto-complete can be triggered with Ctrl+Space almost anywhere.\n\n\n\nAuto-complete works even inside expressions\n\n\n\nJob\n\nA job is made up of multiple steps and runs in an instance of the virtual environment. Jobs can\n\n\n run independently of each other or\n sequential if the current job depends on the previous job to be successful.\n\n\nExample:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\nname: Node.js Package\n\non:\n release:\n types: [created]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n - run: npm ci\n - run: npm test\n\n publish-npm:\n needs: build\n runs-on: ubuntu-latest\n steps:\n ...\n publish-gpr:\n needs: build\n runs-on: ubuntu-latest\n steps:\n ...\n\n\nThe needs attribute inside the publish-npm job tell us that this job \ncan not start until the build step has finished\n\nStep\n\nA step is a set of tasks that can be executed by a job. Steps can run commands or actions.\n\nExample:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\nname: Node.js Package\non:\n release:\n types: [created]\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2 # An action\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n - run: npm ci # A command\n - run: npm test\n\n\nActions\n\nActions are the smallest portable building block of a workflow and can be combined as steps to create a job.\n\n\n You can create your own Actions\n or use publicly shared Actions from the Marketplace.\n\n\nThere are two types of actions:\n\n\n Docker container and\n JavaScript actions\n\n\nDocker container actions allow the environment to be packaged with the GitHub Actions code and can only execute in the GitHub-Hosted Linux environment.\n\nJavaScript actions decouple the GitHub Actions code from the environment allowing faster execution but accepting greater dependency management responsibility.\n\nActions require a metadata file to define the\n\n\n inputs,\n outputs and\n main entrypoint\n\n\nfor your action.\n\nThe metadata filename must be either action.yml or action.yaml.\n\n\n\n\nType\nOperating system\n\n\n\n\nDocker container\nLinux\n\n\nJavaScript\nLinux, MacOS, Windows\n\n\n\n\n\n \n Here you can find instructions if you want to develop an action for other people to use\n \n \n Here is an example of an action: actions/create-release\n \n\n\nEvent\n\nEvents are specific activities that trigger a workflow run. For example, a workflow is triggered when somebody pushes to the repository or when a pull request is created. Events can also be configured to listen to external events using Webhooks.\n\nThe release event\n\n\n See GitHub Releases\n\n\nRunner\n\nA runner is a machine with the Github Actions runner application installed. Then runner waits for available jobs it can then execute. After picking up a job they run the job’s actions and report the progress and results back to Github. Runners can be hosted on Github or self-hosted on your own machines/servers.\n\nSyntax of the .yml File\n\nGithub Actions files are written using YAML syntax and have either a .yml or .yaml file extension. Here are the most important concepts for the workflow file.\n\nName:\n\nThe name of your workflow that is displayed on the Github actions page. If you omit this field, it is set to the file name.\n\n1\nname: CI for scapegoat module\n\n\nOn:\n\nThe on keyword defines the Github events that trigger the workflow. You can provide a single event, array or events or a configuration map that schedules a workflow.\n\n1\non: push\n\n\nor\n\n1\non: [pull_request, issues]\n\n\nJobs:\n\nA workflow run is made up of one or more jobs. Jobs define the functionality that will be run in the workflow and run in parallel by default.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\njobs: \n ci-scapegoat:\n # Define the OS our workflow should run on\n runs-on: ubuntu-latest\n\n strategy:\n # To test across multiple language versions\n matrix:\n node-version: [12.x]\n\n steps: # Clone the repo. See https://github.com/actions/checkout\n - uses: actions/checkout@v2\n # Example of using an environment variable\n - name: Use Node.js ${{ \"{{ matrix.node-version\" }} }} # Will be: \"Use Node.js 12.x\"\n uses: actions/setup-node@v1 # Install node. See https://github.com/actions/setup-node\n with:\n node-version: ${{ \"{{ matrix.node-version\" }} }}\n # Install a project with a clean slate\n - run: npm ci\n - run: npm test\n # Environment variables\n env:\n CI: true\n\n\nEnv:\n\nEnv defines a map of environment variables that are available to all jobs and steps in the workflow. You can also set environment variables that are only available to a job or step.\n\n1\n2\nenv:\nCI: true\n\n\nsteps.with\n\nA map of the input parameters defined by the action. \nEach input parameter is a key/value pair.\n\nInput parameters are set as environment variables.\n\nThe variable is prefixed with INPUT_ and converted to upper case.\n\nExample\n\nDefines the three input parameters (first_name, middle_name, and last_name) \ndefined by the hello_world action.\n\nThese input variables will be accessible to the hello-world action as INPUT_FIRST_NAME, INPUT_MIDDLE_NAME, and INPUT_LAST_NAME environment variables.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\njobs:\n my_first_job:\n steps:\n - name: My first step\n uses: actions/hello_world@master\n with:\n first_name: Mona\n middle_name: The\n last_name: Octocat \n\n\nExpression Syntax\n\nYou can use expressions to programmatically set variables in workflow files and access contexts.\n\n1\n${{ \"{{ <expression>\" }} }}\n\nYou can combine literals, context references, and functions using operators.\n\nAn expression can be any combination of\n\nliteral values,\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\nenv:\n myNull: ${ { null }}\n myBoolean: ${ { false }}\n myIntegerNumber: ${ { 711 }}\n myFloatNumber: ${ { -9.2 }}\n myHexNumber: ${ { 0xff }}\n myExponentialNumber: ${ { -2.99-e2 }}\n myString: ${ { 'Mona the Octocat' }}\n myEscapedString: ${ { 'It''s open source!' }}\n\n\nOperators\n\n\n \n \n Operator\n Description\n \n \n \n \n ( )\n Logical grouping\n \n \n [ ]\n Index\n \n \n .\n Property dereference\n \n \n !\n Not\n \n \n <\n Less than\n \n \n <=\n Less than or equal\n \n \n >\n Greater than\n \n \n >=\n Greater than or equal\n \n \n ==\n Equal\n \n \n !=\n Not equal\n \n \n &&\n And\n \n \n ||\n Or\n \n \n\n\nfunctions\n\nGitHub offers a set of built-in functions\n\nExample:\n\n1\nformat('Hello {0} {1} {2}', 'Mona', 'the', 'Octocat')\n\n\nReturns 'Hello Mona the Octocat'\n\ncontains('Hello world', 'llo') returns true\n\nThe if Keyword and Functions to Check Job Status\n\nExpressions are commonly used with the conditional if keyword \nin a workflow file to determine whether a step should run.\n\nWhen you use expressions in an if conditional, \nyou do not need to use the expression syntax (${ { }}) \nbecause GitHub automatically evaluates the if conditional as an expression.\n\nFor more information about if conditionals, see “Workflow syntax for GitHub Actions.”\n\nExample expression in an if conditional\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\nsteps:\n - name: Git checkout\n if: github.event.check_suite.app.name == 'Netlify' && github.event.check_suite.conclusion == 'success'\n uses: actions/checkout@master\n\n - name: Install Node\n if: success()\n uses: actions/setup-node@v1\n with:\n node-version: 10.x\n\n - name: Install npm dependencies\n if: success()\n run: npm install\n\n - name: Run Audit\n if: success()\n uses: ./.github/actions/run-audit\n\n\nsuccess() returns true when none of the previous steps have failed or been canceled.\n\nSee Job status check functions\n\nObject Filters\n\nYou can use the * syntax to apply a filter and select matching items in a collection:\n\n1\n2\n3\n4\n5\n[\n { \"name\": \"apple\", \"quantity\": 1 },\n { \"name\": \"orange\", \"quantity\": 2 },\n { \"name\": \"pear\", \"quantity\": 1 }\n]\n\n\nThe filter fruits.*.name returns the array [ \"apple\", \"orange\", \"pear\" ]\n\nHere is another example:\n\n1\ncontains(github.event.issue.labels.*.name, 'bug')\n\n\nwill be true if the attribute name of one of the labels of the issue that \nhas triggered the event is 'bug'\n\nContexts\n\nContexts are a way to access information about workflow runs, runner environments, jobs, and steps. Contexts use the expression syntax. See Context and expression syntax for GitHub Actions at the GitHub Actions Reference.\n\n1\n${{ \"{{ <context>\" }} }}\n\n\nMatrix Context\n\nThe matrix context enables access to the matrix parameters you configured for the current job.\n\nFor example, if you configure a matrix build with the os and node versions, the matrix context object includes the os and node versions of the current job.\n\nGitHub Context\n\nThe github context contains information about\n\n\n the workflow run and\n the event that triggered the run.\n\n\nYou can read most of the github context data in environment variables.\n\nfor example, github.refcontains the branch or tag ref that triggered the workflow run\n\nEnv Context\n\nThe env context contains environment variables that have been set in a workflow, job, or step.\n\nThis context changes for each step in a job. \nYou can access this context from any step in a job.\n\nSteps Context\n\nThe steps context contains information about the steps in the current job that have already run.\n\nHere is a more complex example using step information and functions\n\n1\n2\n3\n4\n5\n6\n...\n- name: save vsix\n uses: actions/upload-artifact@master\n with:\n name: ${ { format('vscode-hugo-{0}-{1}.vsix', steps.build_package.outputs.version, github.sha) }}\n path: ${ { format('vscode-hugo-{0}.vsix', steps.build_package.outputs.version) }}\n\n\nThe Runner Context\n\nThe runner context contains information about the runner that is executing the current job.\n\nExamples are runner.os for the Operating System or runner.temp for the path of the temporary directory for the runner. This directory is guaranteed to be empty at the start of each job, even on self-hosted runners.\n\nThe Strategy Context\n\nThe strategy context enables access to the configured strategy parameters and information about the current job.\n\nHere is an example of use of the strategy context.\n\nThe Secrets Context\n\nThe secrets context access to secrets set in a repository. See Creating and storing encrypted secrets.\n\nTo create a secret:\n\n\n \n On GitHub, navigate to the main page of the repository.\n \n \n Under your repository name, click Settings.\n\n \n \n \n In the left sidebar, click Secrets.\n \n \n Type a name for your secret in the “Name” input box.\n \n \n Type the value for your secret.\n \n \n Click Add secret.\n \n\n\nTo use a secret:\n\n1\n2\n3\n4\n5\n6\nsteps:\n - name: Hello world action\n with: # Set the secret as an input\n super_secret: {{ \"${{ secrets.SuperSecret\" }} }}\n env: # Or as an environment variable\n super_secret: {{ \"${{ secrets.SuperSecret\" }} }}\n\n\nFor example, to write a github action to publish a npm package in the npm registry\nI surely need to give GitHub a token so that it can work on my name and publish \nthe package. Thus, the procedure will be:\n\n\n \n You create a token for npm with read and publish permits:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n [~/.../lexer-generator(master)]$ npm token create\n npm password:\n ┌────────────────┬──────────────────────────────────────┐\n │ token │ blah-blah-blah-blah-blahblahblah │\n ├────────────────┼──────────────────────────────────────┤\n │ cidr_whitelist │ │\n ├────────────────┼──────────────────────────────────────┤\n │ readonly │ false │\n ├────────────────┼──────────────────────────────────────┤\n │ created │ 2020-03-30T15:39:01.799Z │\n │ created │ 2020-03-30T15:39:01.799Z │\n └────────────────┴──────────────────────────────────────┘\n \n \n Set the secret token in the secrets section of your repo with name for example npm_token\n Make the secret accesible to the GitHub Action via the secrets context\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\nname: Node.js Package\non:\n release:\n types: [created]\njobs:\n build:\n ...\n publish-npm:\n needs: build\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n registry-url: https://registry.npmjs.org/\n - run: npm ci\n - run: npm publish --access public\n env:\n NODE_AUTH_TOKEN: ${{ \"{{secrets.npm_token\" }} }}\n\n\nExample printing context information to the log file\n\nTo inspect the information that is accessible in each context, you can use this workflow file example.\n\n1\n[~/.../scapegoat(master)]$ cat .github/workflows/debug.yml\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\nname: Debugging contexts\non: push\n\njobs:\n one:\n runs-on: ubuntu-16.04\n steps:\n - name: Dump GitHub context\n env:\n GITHUB_CONTEXT: ${ { toJson(github) }}\n run: echo \"$GITHUB_CONTEXT\"\n - name: Dump job context\n env:\n JOB_CONTEXT: ${ { toJson(job) }}\n run: echo \"$JOB_CONTEXT\"\n - name: Dump steps context\n env:\n STEPS_CONTEXT: ${ { toJson(steps) }}\n run: echo \"$STEPS_CONTEXT\"\n - name: Dump runner context\n env:\n RUNNER_CONTEXT: ${ { toJson(runner) }}\n run: echo \"$RUNNER_CONTEXT\"\n - name: Dump strategy context\n env:\n STRATEGY_CONTEXT: ${ { toJson(strategy) }}\n run: echo \"$STRATEGY_CONTEXT\"\n - name: Dump matrix context\n env:\n MATRIX_CONTEXT: ${ { toJson(matrix) }}\n run: echo \"$MATRIX_CONTEXT\"\n\n\nHere is an example of output\n\nGITHUB_TOKEN\n\nGitHub automatically creates a GITHUB_TOKEN secret to use in your workflow. You can use the GITHUB_TOKEN to authenticate in a workflow run.\n\nWhen you enable GitHub Actions, GitHub installs a GitHub App on your repository.\n\nThe GITHUB_TOKEN secret is a GitHub App installation access token.\n\nYou can use the installation access token to authenticate on behalf of the GitHub App installed on your repository.\n\nThe token’s permissions are limited to the repository that contains your workflow.\n\nFor more see Authenticating with the GITHUB_TOKEN\n\nFor example, when the repo contains and npm module and \nwe want to write a github action to publish the npm package in the GitHub Package Registry\nit is enough to use the GITHUB_TOKEN.\n\nThus, this is enough to do the job:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\njobs:\n build:\n ...\n publish-npm:\n ...\n publish-gpr:\n needs: build\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2\n - uses: actions/setup-node@v1\n with:\n node-version: 12\n registry-url: https://npm.pkg.github.com/\n scope: @ULL-ESIT-PL1920\n - run: npm ci\n - run: npm publish\n env:\n NODE_AUTH_TOKEN: ${{ \"{{secrets.GITHUB_TOKEN\" }} }}\n\n\nCreating a Packaged JavaScript Action\n\n\n Writing a “Hello World!” JavaScript Action\n\n\nReferences\n\n\n A quick demo showing how to use GitHub Actions to build, package, and publish Node.js modules to the NPM and GitHub package registries\n An Introduction to Github Actions\n Using GitHub Actions Youtube video explainig how to test and publish an npm module to both GH Registry and npm Registry\n About the editor for GitHub Actions\n Install VSCode extension providing Github Actions YAML support\n \n Getting Started with GitHub Actions in Visual Studio\n \n Advanced GitHub Actions: workflows for production grade CI/CD - GitHub Universe 2019\n \n A short primer on advanced features,\n How to deploy to GitHub Packages,\n Auto-merge dependabot pull requests, and\n Deploy a web service\n \n \n\n\nVideos about GitHub Actions\n\n\n A quick demo showing how to use GitHub Actions to build, package, and publish Node.js modules to the NPM and GitHub package registries by Brian Cross\n DevOps CI/CD Explained in 100 Seconds Using GitHub Actions for CI. Youtube Video. Fireship\n BxJS - (Custom) Github Actions for Node.js projects\n GitHub Actions: Open Source Workflow Automation by Bas Peters YoutTube video\n Introduction to GitHub Actions : my website build & deployment\n\n\n", "url": "/tema4-devops/github-actions.html" }, { "title": "Installation", "excerpt": "\n", "content": "Installation\n\nInstalar VirtualBox\n\nVirtualBox is a generic tool for running virtual machines. You can use it to run Ubuntu, Windows, OS X, etc. inside your operating system host.\n\n1\n$ brew cask install virtualbox\n\n\nInstalar minikube\n\nMinikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a Virtual Machine (VM) on your laptop for users looking to try out Kubernetes or develop with it day-to-day.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n$ brew install minikube\nUpdating Homebrew...\n==> Downloading https://homebrew.bintray.com/bottles/minikube-1.5.2.high_sierra.bottle.tar.gz\n==> Downloading from https://akamai.bintray.com/5c/5c5d913c4cd18463ab10384d35fc59624e678874d8219cbc5af3b88a17eb89d8?__gda__=exp=15\n######################################################################## 100.0%\n==> Pouring minikube-1.5.2.high_sierra.bottle.tar.gz\n==> Caveats\nBash completion has been installed to:\n /usr/local/etc/bash_completion.d\n\nzsh completions have been installed to:\n /usr/local/share/zsh/site-functions\n==> Summary\n🍺 /usr/local/Cellar/minikube/1.5.2: 8 files, 51.5MB\n$ minikube start\n😄 minikube v1.5.2 on Darwin 10.13.6\n✨ Automatically selected the '' driver\n💣 Unable to determine a default driver to use. Try specifying --vm-driver, or see https://minikube.sigs.k8s.io/docs/start/\n\n\nminikube help\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n$ minikube help\nMinikube is a CLI tool that provisions and manages single-node Kubernetes clusters optimized for development workflows.\n\nBasic Commands:\n start Starts a local kubernetes cluster\n status Gets the status of a local kubernetes cluster\n stop Stops a running local kubernetes cluster\n delete Deletes a local kubernetes cluster\n dashboard Access the kubernetes dashboard running within the minikube cluster\n\nImages Commands:\n docker-env Sets up docker env variables; similar to '$(docker-machine env)'\n cache Add or delete an image from the local cache.\n\nConfiguration and Management Commands:\n addons Modify minikube's kubernetes addons\n config Modify minikube config\n profile Profile gets or sets the current minikube profile\n update-context Verify the IP address of the running cluster in kubeconfig.\n\nNetworking and Connectivity Commands:\n service Gets the kubernetes URL(s) for the specified service in your local cluster\n tunnel tunnel makes services of type LoadBalancer accessible on localhost\n\nAdvanced Commands:\n mount Mounts the specified directory into minikube\n ssh Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'\n kubectl Run kubectl\n\nTroubleshooting Commands:\n ssh-key Retrieve the ssh identity key path of the specified cluster\n ip Retrieves the IP address of the running cluster\n logs Gets the logs of the running instance, used for debugging minikube, not user code.\n update-check Print current and latest version number\n version Print the version of minikube\n\nOther Commands:\n completion Outputs minikube shell completion for the given shell (bash or zsh)\n\nUse \"minikube <command> --help\" for more information about a given command.\n\n\nConfigurar vm-driver para minikube\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n$ minikube help config\nconfig modifies minikube config files using subcommands like \"minikube config set vm-driver kvm\"\nConfigurable fields: \n\n * vm-driver\n * container-runtime\n * feature-gates\n * v\n * cpus\n * disk-size\n * host-only-cidr\n * memory\n * log_dir\n * kubernetes-version\n * iso-url\n * WantUpdateNotification\n * ReminderWaitPeriodInHours\n * WantReportError\n * WantReportErrorPrompt\n * WantKubectlDownloadMsg\n * WantNoneDriverWarning\n * profile\n * bootstrapper\n * ShowDriverDeprecationNotification\n * ShowBootstrapperDeprecationNotification\n * dashboard\n * addon-manager\n * default-storageclass\n * heapster\n * efk\n * ingress\n * insecure-registry\n * registry\n * registry-creds\n * freshpod\n * storage-provisioner\n * storage-provisioner-gluster\n * metrics-server\n * nvidia-driver-installer\n * nvidia-gpu-device-plugin\n * logviewer\n * gvisor\n * helm-tiller\n * ingress-dns\n * hyperv-virtual-switch\n * disable-driver-mounts\n * cache\n * embed-certs\n * native-ssh\n\nAvailable Commands:\n get Gets the value of PROPERTY_NAME from the minikube config file\n set Sets an individual value in a minikube config file\n unset unsets an individual value in a minikube config file\n view Display values currently set in the minikube config file\n\nUsage:\n minikube config SUBCOMMAND [flags] [options]\n\nUse \"minikube <command> --help\" for more information about a given command.\nUse \"minikube config options\" for a list of global command-line options (applies to all commands).\n\n\n1\n2\n$ minikube config set vm-driver virtualbox\n⚠️ These changes will take effect upon a minikube delete and then a minikube start\n\n", "url": "/tema4-devops/kubernetes-installation.html" }, { "title": "QuickStart", "excerpt": "\n", "content": "QuickStart\n\nStart Minikube and create a cluster\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n$ minikube start\n😄 minikube v1.5.2 on Darwin 10.13.6\n🔥 Creating virtualbox VM (CPUs=2, Memory=2000MB, Disk=20000MB) ...\n🐳 Preparing Kubernetes v1.16.2 on Docker '18.09.9' ...\n💾 Downloading kubeadm v1.16.2\n💾 Downloading kubelet v1.16.2\n🚜 Pulling images ...\n🚀 Launching Kubernetes ... \n⌛ Waiting for: apiserver\n🏄 Done! kubectl is now configured to use \"minikube\"\n\n\nkubectl\n\nkubectl is the command line application that lets you interact with your Minikube Kubernetes cluster. It sends request to the Kubernetes API server running on the cluster to manage your Kubernetes environment.\n\nkubectl is like any other application that runs on your machine: it just makes HTTP requests to the Kubernetes API on the cluster.\n\nKubectl version\n\n1\n2\n$ kubectl version\nClient Version: version.Info{Major:\"1\", Minor:\"16\", GitVersion:\"v1.16.2\", GitCommit:\"c97fe5036ef3df2967d086711e6c0c405941e14b\", GitTreeState:\"clean\", BuildDate:\"2019-10-15T23:43:08Z\", GoVersion:\"go1.12.10\", Compiler:\"gc\", Platform:\"darwin/amd64\"}\n\n\nKubectl help\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n$ kubectl\n\nBasic Commands (Beginner):\n create Create a resource from a file or from stdin.\n expose Take a replication controller, service, deployment or pod and expose it as a new Kubernetes Service\n run Run a particular image on the cluster\n set Set specific features on objects\n\nBasic Commands (Intermediate):\n explain Documentation of resources\n get Display one or many resources\n edit Edit a resource on the server\n delete Delete resources by filenames, stdin, resources and names, or by resources and label selector\n\nDeploy Commands:\n rollout Manage the rollout of a resource\n scale Set a new size for a Deployment, ReplicaSet, Replication Controller, or Job\n autoscale Auto-scale a Deployment, ReplicaSet, or ReplicationController\n\nCluster Management Commands:\n certificate Modify certificate resources.\n cluster-info Display cluster info\n top Display Resource (CPU/Memory/Storage) usage.\n cordon Mark node as unschedulable\n uncordon Mark node as schedulable\n drain Drain node in preparation for maintenance\n taint Update the taints on one or more nodes\n\nTroubleshooting and Debugging Commands:\n describe Show details of a specific resource or group of resources\n logs Print the logs for a container in a pod\n attach Attach to a running container\n exec Execute a command in a container\n port-forward Forward one or more local ports to a pod\n proxy Run a proxy to the Kubernetes API server\n cp Copy files and directories to and from containers.\n auth Inspect authorization\n\nAdvanced Commands:\n diff Diff live version against would-be applied version\n apply Apply a configuration to a resource by filename or stdin\n patch Update field(s) of a resource using strategic merge patch\n replace Replace a resource by filename or stdin\n wait Experimental: Wait for a specific condition on one or many resources.\n convert Convert config files between different API versions\n kustomize Build a kustomization target from a directory or a remote url.\n\nSettings Commands:\n label Update the labels on a resource\n annotate Update the annotations on a resource\n completion Output shell completion code for the specified shell (bash or zsh)\n\nOther Commands:\n api-resources Print the supported API resources on the server\n api-versions Print the supported API versions on the server, in the form of \"group/version\"\n config Modify kubeconfig files\n plugin Provides utilities for interacting with plugins.\n version Print the client and server version information\n\nUsage:\n kubectl [flags] [options]\n\nUse \"kubectl <command> --help\" for more information about a given command.\nUse \"kubectl options\" for a list of global command-line options (applies to all commands).\n\n\nkubectl api-versions\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n$ kubectl help api-versions\nPrint the supported API versions on the server, in the form of \"group/version\"\n\nExamples:\n # Print the supported API versions\n kubectl api-versions\n\nUsage:\n kubectl api-versions [flags] [options]\n\nUse \"kubectl options\" for a list of global command-line options (applies to all commands).\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n$ kubectl api-versions\nadmissionregistration.k8s.io/v1\nadmissionregistration.k8s.io/v1beta1\napiextensions.k8s.io/v1\napiextensions.k8s.io/v1beta1\napiregistration.k8s.io/v1\napiregistration.k8s.io/v1beta1\napps/v1\nauthentication.k8s.io/v1\nauthentication.k8s.io/v1beta1\nauthorization.k8s.io/v1\nauthorization.k8s.io/v1beta1\nautoscaling/v1\nautoscaling/v2beta1\nautoscaling/v2beta2\nbatch/v1\nbatch/v1beta1\ncertificates.k8s.io/v1beta1\ncoordination.k8s.io/v1\ncoordination.k8s.io/v1beta1\nevents.k8s.io/v1beta1\nextensions/v1beta1\nnetworking.k8s.io/v1\nnetworking.k8s.io/v1beta1\nnode.k8s.io/v1beta1\npolicy/v1beta1\nrbac.authorization.k8s.io/v1\nrbac.authorization.k8s.io/v1beta1\nscheduling.k8s.io/v1\nscheduling.k8s.io/v1beta1\nstorage.k8s.io/v1\nstorage.k8s.io/v1beta1\nv1\n\n\nStop the cluster: minikube stop\n\n1\n2\n3\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ minikube stop\n✋ Stopping \"minikube\" in virtualbox ...\n🛑 \"minikube\" stopped.\n\n\nSeen the status: minikube status\n\n1\n2\n3\n4\n5\n$ minikube status\nhost: Running\nkubelet: Running\napiserver: Running\nkubeconfig: Configured\n\n\nkubectl create\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n$ kubectl help create\nCreate a resource from a file or from stdin.\n\n JSON and YAML formats are accepted.\n\nExamples:\n # Create a pod using the data in pod.json.\n kubectl create -f ./pod.json\n \n # Create a pod based on the JSON passed into stdin.\n cat pod.json | kubectl create -f -\n \n # Edit the data in docker-registry.yaml in JSON then create the resource using the edited data.\n kubectl create -f docker-registry.yaml --edit -o json\n\nAvailable Commands:\n clusterrole Create a ClusterRole.\n clusterrolebinding Create a ClusterRoleBinding for a particular ClusterRole\n configmap Create a configmap from a local file, directory or literal value\n cronjob Create a cronjob with the specified name.\n deployment Create a deployment with the specified name.\n job Create a job with the specified name.\n namespace Create a namespace with the specified name\n poddisruptionbudget Create a pod disruption budget with the specified name.\n priorityclass Create a priorityclass with the specified name.\n quota Create a quota with the specified name.\n role Create a role with single rule.\n rolebinding Create a RoleBinding for a particular Role or ClusterRole\n secret Create a secret using specified subcommand\n service Create a service using specified subcommand.\n serviceaccount Create a service account with the specified name\n\nOptions:\n --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in\nthe template. Only applies to golang and jsonpath output formats.\n --dry-run=false: If true, only print the object that would be sent, without sending it.\n --edit=false: Edit the API resource before creating\n -f, --filename=[]: Filename, directory, or URL to files to use to create the resource\n -k, --kustomize='': Process the kustomization directory. This flag can't be used together with -f or -R.\n -o, --output='': Output format. One of:\njson|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file.\n --raw='': Raw URI to POST to the server. Uses the transport specified by the kubeconfig file.\n --record=false: Record current kubectl command in the resource annotation. If set to false, do not record the\ncommand. If set to true, record the command. If not set, default to updating the existing annotation value only if one\nalready exists.\n -R, --recursive=false: Process the directory used in -f, --filename recursively. Useful when you want to manage\nrelated manifests organized within the same directory.\n --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the\nannotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.\n -l, --selector='': Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)\n --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The\ntemplate format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].\n --validate=true: If true, use a schema to validate the input before sending it\n --windows-line-endings=false: Only relevant if --edit=true. Defaults to the line ending native to your platform.\n\nUsage:\n kubectl create -f FILENAME [options]\n\nUse \"kubectl <command> --help\" for more information about a given command.\nUse \"kubectl options\" for a list of global command-line options (applies to all commands).\n\n\nkubectl help create deployment\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n$ kubectl help create deployment\nCreate a deployment with the specified name.\n\nAliases:\ndeployment, deploy\n\nExamples:\n # Create a new deployment named my-dep that runs the busybox image.\n kubectl create deployment my-dep --image=busybox\n\nOptions:\n --allow-missing-template-keys=true: If true, ignore any errors in templates when a field or map key is missing in\nthe template. Only applies to golang and jsonpath output formats.\n --dry-run=false: If true, only print the object that would be sent, without sending it.\n --generator='': The name of the API generator to use.\n --image=[]: Image name to run.\n -o, --output='': Output format. One of:\njson|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file.\n --save-config=false: If true, the configuration of current object will be saved in its annotation. Otherwise, the\nannotation will be unchanged. This flag is useful when you want to perform kubectl apply on this object in the future.\n --template='': Template string or path to template file to use when -o=go-template, -o=go-template-file. The\ntemplate format is golang templates [http://golang.org/pkg/text/template/#pkg-overview].\n --validate=true: If true, use a schema to validate the input before sending it\n\nUsage:\n kubectl create deployment NAME --image=image [--dry-run] [options]\n\nUse \"kubectl options\" for a list of global command-line options (applies to all commands).\n\n\nkubectl create deployment hello-minikube –image=k8s.gcr.io/echoserver:1.10\n\nNow, you can interact with your cluster using kubectl.\n\nFor more information, see Interacting with Your Cluster.\n\nLet’s create a Kubernetes Deployment using an existing image named echoserver, \nwhich is a simple HTTP server and expose it on port 8080 using --port.\n\n1\n2\n$ kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.10\ndeployment.apps/hello-minikube created\n\n\nTo access the hello-minikube Deployment, expose it as a Service:\n\n1\n2\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ kubectl expose deployment hello-minikube --type=NodePort --port=8080\nservice/hello-minikube exposed\n\n\nThe option --type=NodePort specifies the type of the Service.\n\nThe hello-minikube Pod is now launched but you have to wait until the Pod is up before accessing it via the exposed Service.\n\nCheck if the Pod is up and running:\n\n1\n2\n3\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ kubectl get pod\nNAME READY STATUS RESTARTS AGE\nhello-minikube-797f975945-xqfgp 1/1 Running 0 2m22s\n\nIf the output shows the STATUS as ContainerCreating, the Pod is still being created.\nIf the output shows the STATUS as Running, the Pod is now up and running.\n\nGet the URL of the exposed Service to view the Service details:\n\n1\n2\n[~/.../chapter20-nodejs/juanIrache-20_3_public_space(master)]$ minikube service hello-minikube --url\nhttp://192.168.99.100:30861\n\n\nTo view the details of your local cluster, copy and paste the URL you got as the output, on your browser.\n\nThe output is similar to this:\n\n\n\nIf you no longer want the Service and cluster to run, you can delete them.\n\n1\n2\n$ kubectl delete services hello-minikube\nservice \"hello-minikube\" deleted\n\n\nDelete the hello-minikube Deployment:\n\n1\nkubectl delete deployment hello-minikube\n\n\nThe output is similar to this:\n\n1\ndeployment.extensions \"hello-minikube\" deleted\n\n\nStop the local Minikube cluster:\n\n1\n2\n3\n$ minikube stop\n✋ Stopping \"minikube\" in virtualbox ...\n🛑 \"minikube\" stopped.\n\n\nDelete the local Minikube cluster:\n\n1\n2\n3\n4\n$ minikube delete\n🔥 Deleting \"minikube\" in virtualbox ...\n💔 The \"minikube\" cluster has been deleted.\n🔥 Successfully deleted profile \"minikube\"\n\n", "url": "/tema4-devops/kubernetes-quickstart.html" }, { "title": "Installing Kubernetes with Minikube", "excerpt": "\n", "content": "Installing Kubernetes with Minikube\n\nMinikube is a tool that makes it easy to run Kubernetes locally. Minikube runs a single-node Kubernetes cluster inside a Virtual Machine (VM) on your laptop for users looking to try out Kubernetes or develop with it day-to-day.\n\nMinikube Features\n\n\n Minikube Features\n\n\nInstallation\n\n\n Installation\n\n\nQuickstart\n\n\n Quickstart\n\n\nManaging Your Cluster\n\n\n Managing your Cluster\n\n\nInteracting with Your Cluster\n\n\n Interacting with Your Cluster\n\n\nNetworking\n\n\n Networking\n\n\nPersistent Volumnes\n\n\n Persistent Volumes\n\n\nMounted Host Folders\n\n\n Mounted Host Folders\n\n\nPrivate Container Registries\n\n\n Private Container Registries\n\n\nAdd-ons\n\n\n \n Add-ons\n \n \n Using Minikube with an HTTP Proxy\n \n \n Known Issues\n \n \n Design\n \n \n Additional Links\n \n \n Community\n \n\n\nReferencias\n\n\n How to Install Kubernetes on Mac from the Kubernetes for Application Developers Book\n Installing Kubernetes with Minikube\n Instalar y Configurar kubectl\n Interacting with your cluster\n\n", "url": "/tema4-devops/kubernetes.html" }, { "title": "Performance of Web Apps", "excerpt": "\n", "content": "Performance of Web Apps\n\nArticle by Joe Colantonio, Founder, TestTalks: Tools for understanding server-side performance\n\nReade the original here\n\nThe performance of your web application affects your business more than you might think. Top engineering organizations consider performance not as nice-to-have, but as a crucial feature of their products. Unfortunately, most engineering teams do not regularly test the performance and scalability of their infrastructure, and most lack the tools to properly do so. Although you can find plenty of commercial tool options out there, for the right organization, free and open source tools may be a good alternative—or the perfect complement to your commercial tool set.\n\nThe value of performance\n\nBefore talking tools, let’s consider load times and the value of performance. When you understand that performance is key to a great user experience, you need tools that will do one thing very well, and that’s to measure the user’s perceived load time. There are many performance rules out there, but ultimately, that’s the only performance metric that matters.\n\nHow fast is fast enough for a web application? Here’s a quick overview of key performance metrics:\n\n\n Under 100 milliseconds is perceived as instantaneous\n A 100 ms to 300 ms delay is perceptible\n One second is about the limit for the user’s flow of thought to stay uninterrupted\n Users expect a site to load in 2 seconds\n After 3 seconds, 40% of visitors will abandon your site\n 10 seconds is about the limit for keeping the user’s attention\n\n\nEngineering teams should treat performance as a feature.\n\nThe goal of performance testing is to understand how your applications behave under heavy load conditions. To get started, you need to understand the baseline performance of your application and that the performance of each transaction is unique. For example, in an e-commerce application, a home page transaction is likely highly cached and very fast, whereas a checkout transaction is more complicated and must talk to a payment service, shipping service, etc. To ensure that users have a great experience, you must test the most common flows for your users and understand performance both in the browser and on the server.\n\nTo get the job done, you’ll need server-side, client-side, and performance tools, and you can find free and open source options that fall into each of these categories.\n\nTools for understanding server-side performance\n\nApache Bench and Siege are great for quick load tests from a single endpoint. If you just need to get a sense of the requests per second for an endpoint, these are great solutions. A more advanced approach—and my personal preference—is Locust.io, an open source load-testing framework that enables complex transactions and can generate high levels of concurrency with ease. I’ve included it in the list below, along with a few other tools to consider.\n\n\n\nLocust.io\n\n\n Locust.io – This is a great tool for understanding the performance on the server side.\n Bees with Machine Guns – The authors describe it as “a utility for arming (creating) many bees (micro EC2 instances) to attack (load test) targets (web applications).”\n Multi-Mechanize – This is an open source framework for performance and load testing that runs concurrent Python scripts to generate load (synthetic transactions) against a remote site or service. It’s commonly used for web performance and scalability testing, but you can also use Multi-Mechanize to generate a workload against any remote API accessible from Python.\n Siege – This http load-testing and benchmarking utility was designed to let web developers measure code under duress, to see how it will stand up to load on the Internet. Siege supports basic authentication, cookies, and HTTP and HTTPS protocols, and lets the user hit a web server with a configurable number of simulated web browsers. Those browsers place the server “under siege.”\n Apache Bench – Use this tool for benchmarking your Apache HTTP server, to get an idea of how Apache performs.\n Httperf – This tool measures web server performance and provides a flexible facility for generating varied HTTP workloads and measuring server performance. The focus is not on implementing a particular benchmark but on providing a robust, high-performance tool that facilitates the construction of both micro- and macro-level benchmarks. The three distinguishing characteristics of httperf are its robustness, which includes the ability to generate and sustain server overload; support for the HTTP/1.1 and SSL protocols; and its extensibility to new workload generators and performance measurements.\n JMeter – Use Apache JMeter to test performance both on static and dynamic resources (files, servlets, Perl scripts, Java objects, databases and queries, FTP servers, and more). You can also use it to simulate a heavy load on a server, network, or object to test its strength or analyze overall performance under different load types. Finally, consider using it to make a graphical analysis of performance or to test your server/script/object behavior under a heavy concurrent load.\n\n\nTools for understanding client-side performance\n\nModern applications spend more time in the browser than on the server side. The best tool to use to understand client-side performance is …\n\n\n Google PageSpeed Insights, a service that analyzes the content of a web page and generates suggestions to make your pages load faster. Reducing page load times reduces bounce rates and increases conversion rates.\n\n\n\n\nGoogle PageSpeed Insights\n\nTools for understanding real-world performance\n\nSitespeed.io is my favorite tool for evaluating client-side performance from real browsers. This open source tool analyzes your website’s speed and performance based on performance best practices and timing metrics. You can analyze one site, analyze and compare multiple sites, or let your continuous integration server break your build when you have exceeded your performance budget.\n\n\n\nSitespeed.io\n\nIt is not always possible for teams to modify the applications to optimize client-side performance. Fortunately, Google invested in making ngx_pagespeed and mod_pagespeed as web server extensions to automate performance improvements without the need for code changes. Here’s a description of each, as well as one other useful tool:\n\n\n Google ngx_pagespeed speeds up your site and reduces page load time. This open-source nginx server module automatically applies web performance best practices to pages and associated assets (CSS, JavaScript, images) without requiring you to modify your existing content or workflow.\n Google mod_pagespeed speeds up your site and reduces page load time. This open-source Apache HTTP server module automatically applies web performance best practices to pages and associated assets (CSS, JavaScript, images) without requiring that you modify your existing content or workflow.\n WebPagetest.org provides deep insights into the performance of the client side in a variety of real browsers. This utility will test a web page in any browser, from any location, over any network condition—and it’s free.\n\n\n\n\nWebPagetest.org\n\nChoices and tradeoffs\n\nWhile you have a wide choice of open source tools from which to choose for performance management, it’s not always wise to build and manage your own performance testing tools and infrastructure. You may determine that it’s not worth the engineering resources required to load test when you can pay for a proven commercial product or service. Such tools let you more easily build, execute, and analyze performance tests, but you have to be willing to pay for it.\n\nShould you go with open source, or will a commercial tool provide more value? Only you can decide if it makes sense to use open source—and if your organization has the engineering resources required. If you do, many of the tools I’ve discussed above should go right into your toolbox.\n\nTaken together, these free and open source tools offer a path to get started on capacity planning and load testing on the server side, optimizing and performance testing the client side, and monitoring performance from end to end to derive meaningful insights from performance tests. What are your favorite tools? Add your comment below.\n\nImage credit: Flickr\n", "url": "/tema4-devops/performance.html" }, { "title": "pm2", "excerpt": "\n", "content": "pm2\n\nPM2 is a daemon process manager that will help you manage and keep your application online.\n\n\n\n\n Quick Start\n \n Quick Start\n Process Management\n \n \n Documentation\n \n Single Page Doc\n Cluster Mode\n Ecosystem File\n Graceful Start/Shutdown\n Environment Variables\n Logs\n Restart Strategies\n Memory Limit Reload\n Update PM2\n Deployment\n Startup Script\n Custom Metrics\n Process Actions\n Watch & Restart\n Monitoring\n Source map support\n Specifics\n PM2 API\n Module System\n Expose static file over http\n Download as ZIP\n \n \n Integrations\n \n Use PM2 in Cloud Providers\n Docker Integration\n Heroku Integration\n Production Setup with Nginx\n Using transpilers with PM2\n PM2 in ElasticBeanstalk\n Capistrano like deployments\n \n \n\n", "url": "/tema4-devops/pm2.html" }, { "title": "GitHub Releases", "excerpt": "\n", "content": "GitHub Releases\n\nGitHub Releases is a way to create a release to package software, along with release notes and links to binary files, for other people to use.\n\nReleases are based on Git tags, which mark a specific point in your repository’s history. A tag date may be different than a release date since they can be created at different times. For more information about viewing your existing tags, see “Viewing your repository’s releases and tags.\n\nReleases are ordered by a tag’s date in the following way:\n\n\n If it’s an annotated tag, the tag object’s date is used.\n If it’s a lightweight tag, then the commit object’s date is used.\n\n\nThe release Event\n\nA GitHub event with the name release is triggered when a release is\n\n\n published,\n unpublished,\n created,\n edited,\n deleted, or\n prereleased.\n\n\nSee GitHub Webhooks.\n\nCreating Releases Using the GitHub Web App\n\nYou can create releases on GitHub Web:\n\n\n On GitHub, navigate to the main page of the repository.\n \n Under your repository name, click Releases.\n\n \n\n https://help.github.com/assets/images/help/releases/release-link.png\n \n \n Click Draft a new release.\n\n \n \n \n Type a version number for your release. Versions are based on Git tags. We recommend naming tags that fit within semantic versioning.\n\n \n \n \n Use the drop-down menu to select the branch that contains the project you want to release.\n\n \n \n \n Type a title and description for your release.\n\n \n \n \n Optionally, to include binary files such as compiled programs in your release, drag and drop or manually select files in the binaries box.\n\n \n \n \n To notify users that the release is not ready for production and may be unstable, select This is a pre-release.\n\n \n \n \n If you’re ready to publicize your release, click Publish release. To work on the release later, click Save draft.\n\n \n \n\n\nReferences\n\n\n See more at Managing releases in a repository\n See also 1: (Paragraph borrowed from What exactly is a Release in GitHub?)\n See GitHub Webhooks.\n\n", "url": "/tema4-devops/releases.html" }, { "title": "Calendarios, Horarios y Exámenes", "excerpt": "\n", "content": "Calendarios, Horarios y Exámenes\n\nCalendario Académico\n\n\n Calendario Académico\n Calendario Académico 2019/2020\n Calendario Académico 2018/2019\n\n\nHorarios\n\n\n Página de Horarios del Master de II\n\n\nEl máster contempla un 50% de no presencialidad y las clases de teoría (Grupos G2) son siempre presenciales online vía Google Meet. La planificación consiste en la alternancia cíclica de semanas (de tipo A, B o C) con diferentes patrones de distribución de clases de grupos de teoría (Grupos G2) y prácticas (Grupos PE201). El orden de la secuenciación de los diferentes tipos de semanas será C, A, B, C, A, B, …\n\n Semana A: Lunes de 17 a 17:50. Grupo G2 (Teoría). Telemático\n Semana B:\n \n Lunes de 17 a 17:50. Grupo G2. Telemático\n Miércoles\n \n de 16 a 16:50. Grupo G2. Sala 1.3\n de 17 a 17:50. Grupo G2. Sala 1.3\n de 18 a 18:50. Grupo G2. Sala 1.3\n \n \n \n \n Semana C: Lunes de 17 a 17:50. Grupo G2. Telemático\n\n\nNos comunican que las clases comenzarán el Lunes 05/10/2020 de forma telemática.\n\n\n Calendario Google de SYTWS (Por si lo quieres añadir a tu Google Calendar)\n\n\n{% include embeded-calendar-iframe.html %}\n\nHorarios del Master de II\n\n\n Horarios completos del curso 20/21 del Master de II\n Horarios completos del curso 19/20 del Master de II\n\n\nHorarios de Tutorías\n\n\n Primer Cuatrimestre: L, M, X de 8:30 a 10:30\n Reserva de Tutoría (Enlace al calendario de solicitud de citas. Haz clic en una hora disponible. Si no hay ninguna, prueba en un intervalo de tiempo diferente. Para cancelar una hora ya reservada, sal de la página de registro y elimina el evento de tu propio calendario.).\nA la hora acordada inicie un chat usando Google Chat para arrancar la videoconferencia\n Página de Horarios de tutorías del Departamento de Ingeniería Informática y de Sistemas de la ULL (Puede no estar actualizado)\n\n\nExámenes de convocatoria\n\n\n \n Documentos con los Exámenes de la Convocatorias 20/21\n \n \n Documentos con los Exámenes de la Convocatorias 19/20\n \n\n\nNormativa de Evaluación\n\n\n Normativa\n Normativa de Compensación\n\n\nFechas de Cierre de actas\n\n\n 7 de Febrero\n 20 de Marzo\n 18 de Junio\n 15 de Julio\n 18 de Septiembre\n\n\n", "url": "/timetables.html" }, { "title": "Intrucciones para Mac OS Catalina", "excerpt": "\n", "content": "Intrucciones para Mac OS Catalina\n\nLa VPN de la ULL usa el protocolo IPSec Cisco y, como en linux, MacOS tiene soporte nativo.\n\nMac OSX de forma nativa soporta la creación de conexiones VPN y podemos\nutilizar esta característica para realizar la conexión VPN (Paso 1) sin\nnecesidad de descargar, configurar y usar GlobalProtect.\n\nEn el panel de control\nde Red pulse el signo + (destacado en un recuadro rojo en la imagen) para\nañadir una conexión y seleccione las opciones e introduzca los datos tal y como\nse muestra en la siguiente imagen, eligiendo como opción “Tipo de VPN” el tipo\n”Cisco IPSec”.\n\n\n\nPulse el botón “Crear” y a continuación “Ajustes de autenticación”. Introduzca los datos que se muestran a\ncontinuación, utilizando como Secr. compart. “preguntar al profesor”.\n\n\n\nUna vez configurada la conexión de VPN de esta forma puede completar el Paso 2\nsegún se indica en el punto 4 de Preguntas Frecuentes. Importante recordar que\nen el campo Nombre de cuenta, hay que poner su nombre de usuario (No añadir\n@ull.edu.es ni @ull.es)\n\n\n\n\n\n\n See How do I configure the OS X integrated IPSec VPN client?\n\n\n", "url": "/vpn-ull.html" }, { "title": "Temas Hemos conseguido que .nojekyll se copie", "excerpt": "\n", "content": "Temas Hemos conseguido que .nojekyll se copie\n\n{% for tema in site.temas %}\n\n{{tema.title}}\n\n{% endfor %}\n\nClases\n\n{% include clases-impartidas.md %}\n\nPrácticas Publicadas\n\n{% include practicas-publicadas.md %}\n\nHorarios y Calendarios\n\nEvaluación\n\nBibliografía\n\nRecursos\n\n\n", "url": "/" }, { "title": "Introducción a la Asignatura", "excerpt": "\n", "content": "\nIntroducción a la Asignatura\n\nEl contexto de la Pandemia\n\n\n Adaptación a la Docencia y Evaluación No Presencial\n\n\nGuías Docentes del Máster Universitario en Ingeniería Informática\n\n\n Guías Docentes del Máster Universitario en Ingeniería Informática (2020 - 2021)\n Guía Docente de SYTWS\n\n\nEl Master: Módulos y Asignaturas\n\nCompetencias\n\nContenidos\n\nClases Impartidas\n\n\n\nRecursos\n\nCalendarios, Horarios y Fechas de Exámenes\n\nFicha de la Asignatura (Borrador)\n\nPlan de Estudios (Modifica 2019) (Borrador)\n\nReferencias\n\nPrácticas\n\n\n Práctica pb-gh-campus-expert Práctica Bono Opcional\n\n\nEjercicios\n\n\n Preguntas sobre Asincronía\n\n", "url": "/tema0-presentacion/" }, { "title": "Introducción a Sistemas y Tecnologías Web en el Servidor", "excerpt": "\n", "content": "Introducción a Sistemas y Tecnologías Web en el Servidor\n\nUso del iaas.ull.es. Entornos de Trabajo\n\nPrácticas\n\n\n Descripción de la Práctica p01-t1-iaas\n \n Express Web Framework (Node.js/JavaScript) (Mozilla)\n \n \n\n\nEditores. Entornos de Trabajo\n\nPrácticas\n\n\n Descripción de la Práctica p2-t1-vscode\n\n\nNode.JS\n\nPrácticas\n\n\n Descripción de la práctica p2-t1-c3-filesystem\n Descripción de la práctica p3-t1-c3-http\n\n\nControl Version\n\nTypeScript\n\nPruebas, Integración y Calidad\n\nBuild Tools\n\nObject Oriented Programming: OOP\n\nMódulos\n\nFunctional Programming\n\nDiseño, Principios\n\nExtending v8\n\n", "url": "/tema1-introduccion/" }, { "title": "The JS Event Loop", "excerpt": "\n", "content": "The JS Event Loop\n\n\n\n\n\n\n Your JavaScript code runs single threaded. There is just one thing happening at a time.\n \n Pay attention to how you write your code and avoid anything that could block the thread, like synchronous network calls or long loops.\n In most browsers there is an event loop for every browser tab, to avoid a web page with heavy processing to block your entire browser.\n Web Workers run in their own event loop as well\n \n \n Event loop: microtasks and macrotasks en el libro https://javascript.info\n\n\nSplitting CPU Hungry Tasks\n\nFile p2-t1-c3-file-system/event-loop/splitting-cpu-hungry-task.html\n\n\n Ejecución: splitting-cpu-hungry-task.html\n\n\n1\n2\n3\n[~/.../p2-t1-c3-file-system/event-loop(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop\n[~/.../p2-t1-c3-file-system/event-loop(master)]$ cat splitting-cpu-hungry-task.html \n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n<!DOCTYPE html>\n\n<div id=\"progress\"></div>\n\n<script>\n'use strict';\n\nlet start = Date.now();\n\nlet i = 0;\n\nlet chunk = () => {\n // do a piece of the heavy job (*)\n do {\n i++;\n } while (i % 1e5 != 0);\n progress.innerHTML = i;\n};\n\nlet stop = () => (i == 1e7);\n\nfunction count(task, condition) { \n if (condition()) {\n alert(\"Done in \" + (Date.now() - start) + 'ms');\n } else {\n setTimeout(() => count(task, condition)); // schedule the new call (**)\n };\n task();\n}\n\ncount(chunk, stop);\n</script>\n\n\nWeb Workers\n\n/local/src/uai/uai2015/simple-web-worker\n\n\n Repo de ejemplo simple-web-worker\n Repo de ejemplo fibonacci-worker\n MDN Tutorial: Using Web Workers\n\n\nRace Condition\n\n/local/src/uai/uai2015/race-condition/index.html\n\n\n Repo de Ejemplo\n Race Condition in JavaScript YouTube Video\n\n\nPromises\n\nlocal/src/uai/uai2015/promise-ejemplo\n\n\n A Gist with a very Simple Example of How to make and use a Promise\n\n\napuntes/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/promise-ejemplo/promise-job-queue.js\n\nPromises that resolve before the current function ends \nwill be executed right after the current function.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n[~/.../p2-t1-c3-file-system/event-loop/promise-ejemplo/(master)]$ cat promise-job-queue.js \nlet promise = new Promise(function(resolve, reject) {\n resolve(1)\n});\n\npromise.then(function(resolve) {console.log(1)});\n\nconsole.log('a');\n\npromise.then(function(resolve) {console.log(2);});\n\nsetTimeout(function() {console.log('h')}, 0);\n\npromise.then(function(resolve) {console.log(3)});\n\nconsole.log('b');\n\n\nCódigos Ilustrando el Bucle de Eventos\n\ntema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/callstack.js\n\n\n Tutorial Concurrency model and Event Loop at https://developer.mozilla.org\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\nfunction multiply(x,y) {\n // console.trace imprime una traza de la pila\n console.trace(\"-----------At multiply-----------\");\n return x * y;\n}\n\nfunction squared(n) {\n console.trace(\"-----------At squared-----------\");\n return multiply(n,n)\n}\n\nfunction printSquare(n) {\n return squared(n)\n}\n\nlet numberSquared = printSquare(5);\nconsole.log(numberSquared);\n\n\ntema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/settimeout-does-not-run-inmediately.js\n\n\n Tutorial Concurrency model and Event Loop at https://developer.mozilla.org\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\nconst s = new Date().getSeconds();\n\nsetTimeout(function() {\n console.log(\"Ran after \" + (new Date().getSeconds() - s) + \" seconds\");\n}, 500);\n\nwhile(true) {\n if(new Date().getSeconds() - s >= 2) {\n console.log(\"Good, looped for 2 seconds\");\n break;\n }\n}\n\n\ntema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/order.js\n\n\n Tutorial Concurrency model and Event Loop at https://developer.mozilla.org\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n(function() {\n\n console.log('this is the start');\n\n setTimeout(function cb() {\n console.log('Callback 1: this is a msg from call back');\n }); // has a default time value of 0\n\n console.log('this is just a message');\n\n setTimeout(function cb1() {\n console.log('Callback 2: this is a msg from call back');\n }, 0);\n\n console.log('this is the end');\n\n})();\n\n\nReferences\n\n\n Event loop: microtasks and macrotasks en el libro https://javascript.info\n Tutorial Concurrency model and Event Loop at https://developer.mozilla.org\n The JavaScript Event Loop by Flavio\n Concurrency and Parallel Computing in JavaScript Stephan Herhut. Strange Loop 2013.\n Philip Roberts: ¿Que diablos es el “event loop” (bucle de eventos) de todos modos? (JSConf EU)\n loupe a tool in the cloud to see the event loop working\n\n", "url": "/tema1-introduccion/practicas/p2-t1-c3-file-system/event-loop/" }, { "title": "Descripción de la práctica p3-t1-c3-http", "excerpt": "\n", "content": "Descripción de la práctica p3-t1-c3-http\n\n\n Siguiendo el capítulo 20 Node.JS del libro Eloquent JavaScript (EJS) escriba sus propios apuntes con ejemplos y realice los ejercicios que se indican a continuación.\n En este capítulo se introduce Node.js, la librería para el manejo de archivos (fs) y la librería para construir servidores HTTP. Combinando ambas se construye un servicio HTTP que permite el manejo de archivos remoto.\n \n Eloquent JS: Chapter 20 HTTP\n Eloquent JS: Chapter 20 HTTP 2nd Edition\n \n \n Realice el ejercicio Directory Creation\n \n Though the DELETE method is wired up to delete directories (using fs.rmdir), \n the file server currently does not provide any way to create a directory. Add \n support for a method MKCOL, which should create a directory by calling fs.mkdir\n \n \n Realice el ejercicio A public space on the web\n Instale insomia o postman para usarlo como cliente de prueba.\n Genere documentación para su código usando algunas de las herramientas que aparecen en la sección recursos\n \n Escriba un gulpfile con tareas usando curl para probar el comportamiento del servidor con los diferentes requests.\n \n Entregue los enlaces al repositorio en GitHub\n\n\nRecursos\n\nSobre como hacer esta práctica\n\n\n Eloquent JS 2nd Edition: Chapter 20 HTTP\n Vídeo del profesor con sugerencias para la solución de la práctica\n \n \n \n \n Lecture 04/11/2019 in GitHub pages\n See this repo with (modified) solutions of Juan Irache to EJS exercises\n \n Solutions 20_3_a_public_space\n \n \n Node.js docs: Anatomy of an HTTP Transaction\n How to Develop Web Application using pure Node.js (HTTP GET and POST, HTTP Server) Vídeo en Youtube. 2015\n\n\nfs.promises\n\n\n The fs.promises API provides an alternative set of asynchronous file system methods that return Promise objects rather than using callbacks\n\n\nDocumentación de Código\n\n\n documentation.js,\n jsdoc,\n docco\n\n\nGulp\n\nGulp Getting Started\n\n\n Quick Start\n JavaScript and Gulpfiles\n Creating Tasks\n Async Completion\n Working with Files\n Explaining Globs\n Using Plugins\n Watching Files\n\n\nAPI\n\n\n Concepts\n src()\n dest()\n symlink()\n lastRun()\n series()\n parallel()\n watch()\n task()\n registry()\n tree()\n Vinyl\n Vinyl.isVinyl()\n Vinyl.isCustomProp()\n\n\nDiseño\n\n\n Apuntes: Code Smells\n Principios de Diseño\n Patrones de Diseño\n Strategy Pattern\n\n\nPara el profesor\n\n\n /Users/casiano/local/src/javascript/eloquent-javascript/chapter20-node-js/ (recurso para el profesor)\n Repo con las soluciones K. (No disponible ahora)\n Repo con las soluciones C. (No disponible ahora)\n\n\nReto\n\n\n Reto para la práctica\n\n", "url": "/tema1-introduccion/practicas/p3-t1-c3-http/" }, { "title": "TypeScript", "excerpt": "\n", "content": "TypeScript\n\nBuilding and Running TS\n\nReferences\n\n\n TypeScript Documentation\n Cherny, Boris. Programming TypeScript. O’Reilly Media, 2019. Web\n BOGDANmanate/mvp-ts Bogdan Workshop repo with Conway’s Game of Life\n \n Solution\n \n \n\n", "url": "/tema1-introduccion/ts/" }, { "title": "Computación Asíncrona y Distribuida", "excerpt": "\n", "content": "Computación Asíncrona y Distribuida\n\nProgramación Asíncrona en ECMA 6\n\nNode.js EventEmitters\n\nSockets\n\nMessage Queues\n\nRPC\n\nMódulos en ECMA5\n", "url": "/tema2-async-1920/" }, { "title": "Exercises: Exceptions and Promises", "excerpt": "\n", "content": "Exercises: Exceptions and Promises\n\nFirst Exercise: Exception inside the action of a Promise\n\n(Blog view at https://ull-mii-sytws-1920.github.io/tema2-async/exercises/promises/exception-inside-promise/)\n\nRemember that the code of a promise executor and promise handlers has an “invisible try..catch” around it.\n\nIf an exception happens, it gets caught and treated as a rejection.\n\nWill the message \"Everything worked!\" appear? (See exception-inside.html)\n\n1\n2\n3\n let p = new Promise((resolve, reject) => {\n throw (new Error(\"Que fallo!\"));\n }).catch( (e) => console.log(\"Everything worked! \"+e));\n\n\nWhat will be the ouput of this variant of the former code? (See exception-inside-2.html)\n\n1\n2\n3\n4\n5\n6\n7\n let p = new Promise((resolve, reject) => {\n try {\n throw (new Error(\"Que fallo!\"));\n } catch (e) {\n reject( \"tilin!\");\n }\n }).catch( (e) => console.log(\"Everything worked! \"+e));\n\n\nWhat will be the rejection value of the promise?\n\nSecond Exercise: Exception Delayed with setTimeout inside the action of a Promise\n\n(Blog at https://ull-mii-sytws-1920.github.io/tema2-async/exercises/promises/exception-inside-promise/)\n\nWhat do you think? Will the .catch trigger?\n\nSee the code in exception-delayed.html:\n\n1\n2\n3\n4\nnew Promise(function(resolve, reject) {\n setTimeout(() => {\n throw new Error(\"Whoops!\");\n }, 1000);\n\nExplain your answer.\n\nRemember that the code of a promise executor and promise handlers has an “invisible try..catch” around it.\n\nIf an exception happens, it gets caught and treated as a rejection.\n\nThus, the former code is equivalent to this exception-delayed-2.html:\n\n1\n2\n3\n4\n5\n6\n7\n new Promise(function(resolve, reject) {\n try {\n setTimeout(() => {\n throw new Error(\"Whoops!\");\n }, 1000);\n } catch (e) { reject(e); }\n }).catch(alert);\n\nWhat is the sequences of actions taking place when this code executes?\n\nIs the former code equivalent to this one (exception-delayed-3.html)? :\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n new Promise(function(resolve, reject) {\n setTimeout(() => {\n try {\n throw new Error(\"Whoops!\");\n } catch(e) {\n reject('rejected '+e);\n }\n }, 1000);\n }).catch(alert);\n\n\nI have these examples here:\n\n1\n2\n~/.../promises/exception-inside-promise(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/exception-inside-promise\n\n\nThird Exercise: Unhandled Rejection Event\n\nThe “Unhandled rejection” event occurs when a promise error is not handled at the end of the microtask queue.\n\nNormally, if we expect an error, we add .catch to the promise chain to handle it:\n\n1\n2\n3\n4\n5\nlet promise = Promise.reject(new Error(\"Promise Failed!\"));\npromise.catch(err => alert('caught'));\n\n// doesn't run: error handled\nwindow.addEventListener('unhandledrejection', event => alert(event.reason));\n\n\nWhat if we handle the error later? We are going to use Node.js this time.\n\n1\n2\n3\n~/.../promises/exception-inside-promise(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/exception-inside-promise\n~/.../promises/exception-inside-promise(master)]$ cat unhandled-promise-rejection.js \n\n\nExplain the behavior of this program:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n#!/usr/bin/env node\n'use strict';\n\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection:', error.message);\n});\n\nlet p = new Promise((resolve, reject) => reject(new Error('woops')));\n\nsetTimeout( \n () => p.catch(error => console.log('caught', error.message)),\n 1000);\n\n\n1\n2\n3\n4\n[~/.../event-loop/promise-ejemplo(master)]$ ./unhandled-promise-rejection.js \nunhandledRejection: woops\ncaught woops\n(node:107) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)\n\n\nVéase también\nhttps://javascript.info/microtask-queue#unhandled-rejection\npara una versión de este programa en el cliente/browser\n\nSummarizing\n\n\n .catch handles errors in promises of all kinds: be it a reject() call, or an error thrown in a handler.\n We should place .catch exactly in places where we want to handle errors and know how to handle them.\n It’s ok not to use .catch at all, if there’s no way to recover from an error.\n In any case we should have the unhandledrejection event handler to track unhandled errors\n\n\n", "url": "/tema2-async-1920/exercises/promises/exception-inside-promise/" }, { "title": "Building Promise.all", "excerpt": "\n", "content": "Building Promise.all\n\nSee https://eloquentjavascript.net/11_async.html.\n\nThe Github page is here: https://ull-mii-sytws-1920.github.io/tema2-async/exercises/promises/promise-all/.\n\nGiven an array of promises, Promise.all returns a promise that waits for all of the promises in the array to finish. \nIt then succeeds, yielding an array of result values. \nIf a promise in the array fails, the promise returned by all fails too, with the failure reason from the failing promise.\n\nImplement something like this yourself as a regular function called Promise_all.\n\nRemember that after a promise has succeeded or failed, \nit can’t succeed or fail again, and further calls to the functions that resolve it are ignored. \nThis can simplify the way you handle failure of your promise.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promise.all</title>\n</head>\n\n<body>\n <h1>Open the Developer tools</h1>\n <script>\n function Promise_all(promises) {\n // Fill the code\n }\n\n // Test code.\n Promise_all([]).then(array => {\n console.log('This should be []:', array);\n });\n\n function soon(val) {\n return new Promise(resolve => {\n setTimeout(() => resolve(val), Math.random() * 500);\n });\n }\n\n Promise_all([soon(1), soon(2), soon(3)]).then(array => {\n console.log('This should be [1, 2, 3]:', array);\n });\n\n Promise_all([soon(5), soon(2), soon(\"a\")]).then(array => {\n console.log('This should be [5, 2, \"a\"]:', array);\n });\n\n Promise_all([soon(1), Promise.reject('X'), soon(3)])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (error === 'X') {\n console.log('Rejection correctly managed!')\n } else\n console.log('Unexpected failure:', error);\n });\n\n Promise_all([\n soon(1),\n new Promise(() => { throw (new Error('Muerto!')) }),\n soon(3)\n ])\n .then(array => {\n console.log('We should not get here');\n })\n .catch(error => {\n if (/Muerto!/.test(error.message))\n console.log('Exception correctly managed!:');\n }); \n </script>\n</body>\n</html>\n\nHints\n\nThe function passed to the Promise constructor will have to call then on each of the promises in the given array. \nWhen one of them succeeds, two things need to happen. \nThe resulting value needs to be stored in the correct position of a result array, and \nwe must check whether this was the last pending promise and finish our own promise if it was.\n\nThe latter can be done with a counter that is initialized to the length of the input array and from which we subtract 1 every time a promise succeeds. \nWhen it reaches 0, we are done. \nMake sure you take into account the situation where the input array is empty (and thus no promise will ever resolve).\n\nHandling failure requires some thought but turns out to be extremely simple. Just pass the reject function of the wrapping promise to each of the promises in the array as a catch handler or as a second argument to then so that a failure in one of them triggers the rejection of the whole wrapper promise.\n\nSolution\n", "url": "/tema2-async-1920/exercises/promises/promise-all/" }, { "title": "Promises chaining", "excerpt": "\n", "content": "Promises chaining\n\nIn frontend programming promises are often used for network requests.\n\nWe’ll use the fetch method to load the information about the user from the remote server. It has a lot of optional parameters covered in separate chapters, but the basic syntax is quite simple:\n\n1\nlet promise = fetch(url);\n\n\nThis makes a network request to the url and returns a promise. \nThe promise resolves with a response object when the remote server responds with headers, but before the full response is downloaded.\n\nTo read the full response, we should call a method response.text(): it returns a promise that resolves when the full text downloaded from the remote server, with that text as a result.\n\n\n See code deployed: simple-request.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n // .then below runs when the remote server responds\n .then(function(response) {\n // response.text() returns a new promise that resolves with the full response text\n // when it loads\n return response.text();\n })\n .then(function(text) {\n // ...and here's the content of the remote file\n alert(text); // {\"name\": \"iliakan\", isAdmin: true}\n });\n</script>\n\nOnce we got the loaded user, we can make one more request to GitHub, load the user profile and show the avatar:\n\n\n See code deployed: github.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n .then(response => response.json())\n .then(user => fetch(`https://api.github.com/users/${user.name}`))\n .then(response => response.json())\n .then(githubUser => new Promise(function(resolve, reject) { // (*)\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n setTimeout(() => {\n img.remove();\n resolve(githubUser); // (**)\n }, 3000);\n }))\n // triggers after 3 seconds\n .then(githubUser => alert(`Finished showing ${githubUser.name}`));\n</script>\n\n\nHow can we do something after the avatar has finished showing and gets removed?\n\nHINT: To make the chain extendable, we need to return a promise that resolves when the avatar finishes showing.\n\n\n solution\n\n", "url": "/tema2-async-1920/exercises/promises/promise-chaining/" }, { "title": "Promisification", "excerpt": "\n", "content": "Promisification\n\nPromisification it’s the conversion of a function that accepts a callback into a function returning a promise.\nWrite a function promisify(f) that receives a function fthat accepts a callback f( ...args, callback) and \nreturns a function that returns the equivalent Promise object\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promisify</title>\n</head>\n\n<body>\n <script>\n function promisify(f) {\n // Fill the code\n };\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n let loadScriptPromise = promisify(loadScript);\n\n loadScriptPromise(\"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\").then(\n (r) => alert(\"script loaded\")\n ).catch(alert);\n\n </script>\n</body>\n\n</html>\n\n\nSee https://javascript.info/promisify\n", "url": "/tema2-async-1920/exercises/promises/promisify/" }, { "title": "Práctica p4-t2-networking", "excerpt": "\n", "content": "\nPráctica p4-t2-networking\n\n\n Lea el Capítulo 3 “Networking with Sockets” de Node.JS The Right Way y resuelva los problemas en la secciónes Testability y Robustness\n \n BULL PuntoQ\n Safari. Chapter 3 Networking with Sockets\n Book “Node.js 8 the Right Way” 2018 Edition. Google Books\n Capítulo 3 “Networking with Sockets” de Node.JS The Right Way old edition\n \n \n Añadan pruebas y documentación\n Utilice GitHub Actions para añadir Integración Contínua y realizar sus pruebas en GitHub\n Si no la hecho nunca añada también Integración Contínua usando Travis (Haga un badge en su README.md)\n Escriba en su README.mdun tutorial con lo que ha aprendido en este capítulo\n Añada un gulpfile.js para facilitar la ejecución de las tareas\n Testability\n \n Add a unit test for a single message that is split over two or more data events from the stream\n Add a unit test that passes in null to the LDJClient constructor, and asserts that an error is thrown\n Then make the test pass by modifying the constructor to accept null: the semantic being that the created stream behaves as /dev/null in Unix. See npm package dev-null\n \n \n Robustness\n \n The LDJClient already handles the case in which a properly formatted JSON string is split over multiply lines. What happen if the incoming data is not a properly formatted JSON string?\n Write a test case that sends a data event that is not JSON. What do you think on how to manage this case?\n What happens if the last data event completes a a JSON message, but without the trailing new line?\n Write a case where the stream object sends a data event containing JSON but no newline, followed by a close event. How will you manage this case?\n Should LDJClient emit a close event for its listeners?\n \n \n Realice el reto que se indica aquí\n\n\nRecursos\n\n\n Repo con una solución a esta práctica con despliegue usando GitHub Actions\n Vea la clase de SYTWS del Lunes 11/11/2019\n Repo de bibliografía\n BULL PuntoQ\n Safari. Chapter 3 Networking with Sockets\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP:\n \n Video en YouTube. UPM. Node.JS: Programación con Sockets TCP/IP\n \n \n Net module\n \n createServer\n \n \n Gulp\n \n Véase la sección Gulp de los apuntes\n gulp quick start\n gulp getting started\n \n \n Travis\n Documentación:\n \n documentation.js,\n jsdoc,\n docco\n \n \n Pruebas\n \n Mocha\n chai\n \n \n Real-Time Chat With Node.js’ Readline & Socket.io\n\n\nRecursos para el profesor:\n\n\n \n Paths related:\n\n 1\n2\n3\n[~/sol-nodejs-the-right-way/networking-with-sockets-chapter-3(master)]$ pwd -P\n/Users/casiano/local/src/CA/sol-nodejs-the-right-way/networking-with-sockets-chapter-3\n\n \n \n sol-c\n \n See the branch chapter3-exercises\n \n \n Sol -ai\n\n\n", "url": "/tema2-async-1920/practicas/p4-t2-networking/" }, { "title": "Práctica Connecting Robust Microservices (p6-t2-microservices)", "excerpt": "\n", "content": "Práctica Connecting Robust Microservices (p6-t2-microservices)\n\n\n \n Lea el Capítulo 4 “Connecting Robust Microservices” de Node.JS The Right Way ` ` y resuelva los problemas en la secciones\n \n Error Handling,\n Robustness y\n \n Bidirectional Messaging:\n \n Error Handling\n \n The zmq-filer-rep.js program uses fs.readfile() to serve up file contents. However it doesn’t handle error cases.\n \n What should the program do in the case of error?\n How would you change the JSON object structure of messages to support sending an error to the requester?\n \n \n Later in the same program we listen for the Unix signal SIGINT to detect the user’s Ctrl-C in the terminal\n \n What happens if the program ends in some other way , like SIGTERM (the termination signal)?\n What happens if there is an unhandled Node.js exception, and how should we deal with it?\n \n Hint: you can listen for the uncaughtException event on the process object\n \n \n \n \n \n \n Robustness\n \n In Building a Cluster we created a Node.js cluster that spins up a pool of worker processes.\n In the master process we listened for online events and logged a message when the workers came up.\n But we didn’t specify what should happen when a worker ends.\n \n What happens when you kill a worker process from the command line?\n \n Hint: Use kill [pid]from the command line\n \n \n How would you change the zmq-filer-rep-cluster.js program to fork a new worker whenever one dies?\n \n \n \n \n Bidirectional Messaging\n \n For this project you’ll need to use 0MQ PUSH/PULL sockets and the Node.js clustering techniques.\n Your clustered program will spin up a pool of workers and distribute 30 jobs.\n The master process should:\n \n Create a PUSH socket and bind it to an IPC endpoint. This socket will be for sending jobs to the workers\n Create a PULL socket and bind it to a different IPC endpoint. This socket will receive messages from the workers\n Keep a count of ready workers\n Listen for messages on the PULL socket, and\n \n If the message is a ready message, increment the ready counter, or\n If the message is a result message , output it to the console\n \n \n Spin up the worker processes\n When the ready counter reaches 3 send 30 job messages out through the push socket\n \n \n The worker process should:\n \n Create a PULL socket and connect it to the master ‘s PUSH endpoint\n Create a PUSH socket and connect it to the master ‘s PULL endpoint\n Listen for job messages on the PULL socket, and respond by sending a result message out on the PUSH socket\n Send a ready message out on the PUSH socket.\n \n \n Make sure your result messages include at least the process ID of the worker. \n This way you can inspect the console output and confirm that the workload is being balanced among the worker processes.\n See the example in directory ventilator-worker-sink\n See section PUSH-PULL in file Readme.md in the folder connecting-robust-microservices-chapter-4/microservices in our repo ULL-MII-CA-1819/nodejs-the-right-way\n \n \n Añada documentación\n\n\nRecursos\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way.\n \n Mira el directorio connecting-robust-microservices-chapter-4\n El subdirectorio connecting-robust-microservices-chapter-4/microservices contiene los ejemplos del libro\n \n \n YouTube vídeo: Building Distributed Systems with Node.js and 0MQ.\n \n Jim R. Wilson, author of Node.js the Right Way, explains how to build distributed systems using ØMQ at a Node.js in the Wild meetup]\n Slides at ull-mii-ca-1819\n Slides at jimbojw-zmq-talk\n \n \n\n\nNode.js 0MQ API\n\n\n http://zeromq.github.io/zeromq.js/\n\n\nLa Guía de ZeroMQ\n\n\n 0MQ - The Guide. HTML\n 0MQ - The Guide. PDF\n 0MQ -Examples in all languages zguide github ØMQ - The Guide. Written by Pieter Hintjens ph@imatix.com, CEO iMatix Corporation.\n \n 0MQ Examples in Node.js\n \n \n 0MQ community\n zeromq.js examples in the node.js distribution in zeromq GitHub repo\n ZGuide examples in Node.JS\n ZMQ guide: Divide and Conquer\n ZMQ Guide: The Load Balancing Pattern\n\n\nTutoriales\n\n\n ZeroMQ + Node.js (or How to connect your backend) Manuel Pineda @pin3da_ pin3da at github\n Trasparencias ZeroMQ with NodeJS por Fernando D. Alonso\n \n krakatoa/node_zmq_workshop Examples\n zguide.zeromq.org/\n api.zeromq.org/3-2:zmq-socket\n api.zeromq.org/3-2:zmq-setsockopt\n \n \n\n\nParallel Computing\n\n\n ZeroMQ for Massivelly Parallel Codes Anthony Scemama\n ZeroMQ Tutoriasl: Butterfly\n Easy cluster parallelization with ZeroMQ\n\n\nRetos para el Capítulo Connectiong Robust Microservices\n\n\n Retos para el Capítulo Connectiong Robust Microservices\n\n\n\n", "url": "/tema2-async-1920/practicas/p6-t2-microservices/" }, { "title": "Práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) (p7-t2-async-js-edx)", "excerpt": "\n", "content": "Práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) (p7-t2-async-js-edx)\n\n\n \n Realice los módulos 1 y 2 del curso EdX Asynchronous Programming with Javascript\n \n Módulo 1 Asynchronous Fundamentals\n Módulo 2 Promises\n\n\ny resuelva los problemas planteados en dichos módulos\n\nRecursos\n\n\n Curso EdX Asynchronous Programming with Javascript\n GitHub repoULL-MII-CA-1819/async-js\n Cómo funciona Async/Await en menos de 15 minutos YouTube Vídeo por Appdelante\n Javascript Async Await, Promesas y Callbacks por Fatz\n Curso JavaScript Promises en Udacity\n Book The Modern Javascript Tutorial. Chapter Promises, async/await\n Promises Workshop for JavaScript! Learn to wield promises like a master to write clean asynchronous code GitHub Repo. A Workshopper module that teaches you to use promises in javascript\n\n\nThe Coding Train\n\n\n 16.11: Promises Part 1 - Topics of JavaScript/ES6\n GitHub repo for The Coding Train website\n\n\nRecursos para el profesor\n\n\n Iván\n MarreA\n /Users/casiano/formacion/edx/async-js\n\n\n", "url": "/tema2-async-1920/practicas/p7-t2-async-js-edx/" }, { "title": "{{site.temas[2].title}}", "excerpt": "\n", "content": "{{site.temas[2].title}}\n\nEvent Loop, Race Conditions y Web Workers\n\nThe Async module\n\nPromises\n\nGenerators and Iterators\n\nHandling Events\n\nNode.js EventEmitters\n\nSockets\n\nMessage Queues\n\nRPC\n\nMódulos en ECMA5\n\nReferencias\n\n\n Vídeo Cómo funciona Async/Await en menos de 15 minutos YouTube Vídeo por Appdelante\n Book Exploring ES6: 24. Asynchronous programming (background) \n Book Understanding ECMAScript 6: Iterators and Generators\n Book You Don’t Know JS: Chapter Async & Performance\n Book ASYNC JavaScript: Build More Responsive Apps with Less Code\n Async examples in JS in GitHub\n Writing Asynchronous Tasks In Modern JavaScript Smashing Magazine\n\n\n", "url": "/tema2-async/" }, { "title": "The JS Event Loop", "excerpt": "\n", "content": "The JS Event Loop\n\n{% include event-loop.md %}\n", "url": "/tema2-async/event-loop/" }, { "title": "Exercises: Exceptions and Promises", "excerpt": "\n", "content": "Exercises: Exceptions and Promises\n\nFirst Exercise: Exception inside the action of a Promise\n\n(Blog view at https://ull-mii-sytws-1920.github.io/tema2-async/exercises/promises/exception-inside-promise/)\n\nRemember that the code of a promise executor and promise handlers has an “invisible try..catch” around it.\n\nIf an exception happens, it gets caught and treated as a rejection.\n\nWill the message \"Everything worked!\" appear? (See exception-inside.html)\n\n1\n2\n3\n let p = new Promise((resolve, reject) => {\n throw (new Error(\"Que fallo!\"));\n }).catch( (e) => console.log(\"Everything worked! \"+e));\n\n\nWhat will be the ouput of this variant of the former code? (See exception-inside-2.html)\n\n1\n2\n3\n4\n5\n6\n7\n let p = new Promise((resolve, reject) => {\n try {\n throw (new Error(\"Que fallo!\"));\n } catch (e) {\n reject( \"tilin!\");\n }\n }).catch( (e) => console.log(\"Everything worked! \"+e));\n\n\nWhat will be the rejection value of the promise?\n\nSecond Exercise: Exception Delayed with setTimeout inside the action of a Promise\n\n(Blog at https://ull-mii-sytws-1920.github.io/tema2-async/exercises/promises/exception-inside-promise/)\n\nWhat do you think? Will the .catch trigger?\n\nSee the code in exception-delayed.html:\n\n1\n2\n3\n4\nnew Promise(function(resolve, reject) {\n setTimeout(() => {\n throw new Error(\"Whoops!\");\n }, 1000);\n\nExplain your answer.\n\nRemember that the code of a promise executor and promise handlers has an “invisible try..catch” around it.\n\nIf an exception happens, it gets caught and treated as a rejection.\n\nThus, the former code is equivalent to this exception-delayed-2.html:\n\n1\n2\n3\n4\n5\n6\n7\n new Promise(function(resolve, reject) {\n try {\n setTimeout(() => {\n throw new Error(\"Whoops!\");\n }, 1000);\n } catch (e) { reject(e); }\n }).catch(alert);\n\nWhat is the sequences of actions taking place when this code executes?\n\nIs the former code equivalent to this one (exception-delayed-3.html)? :\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n new Promise(function(resolve, reject) {\n setTimeout(() => {\n try {\n throw new Error(\"Whoops!\");\n } catch(e) {\n reject('rejected '+e);\n }\n }, 1000);\n }).catch(alert);\n\n\nI have these examples here:\n\n1\n2\n~/.../promises/exception-inside-promise(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/exception-inside-promise\n\n\nThird Exercise: Unhandled Rejection Event\n\nThe “Unhandled rejection” event occurs when a promise error is not handled at the end of the microtask queue.\n\nNormally, if we expect an error, we add .catch to the promise chain to handle it:\n\n1\n2\n3\n4\n5\nlet promise = Promise.reject(new Error(\"Promise Failed!\"));\npromise.catch(err => alert('caught'));\n\n// doesn't run: error handled\nwindow.addEventListener('unhandledrejection', event => alert(event.reason));\n\n\nWhat if we handle the error later? We are going to use Node.js this time.\n\n1\n2\n3\n~/.../promises/exception-inside-promise(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/sytws1920/apuntes/tema2-async/exercises/promises/exception-inside-promise\n~/.../promises/exception-inside-promise(master)]$ cat unhandled-promise-rejection.js \n\n\nExplain the behavior of this program:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n#!/usr/bin/env node\n'use strict';\n\nprocess.on('unhandledRejection', error => {\n console.log('unhandledRejection:', error.message);\n});\n\nlet p = new Promise((resolve, reject) => reject(new Error('woops')));\n\nsetTimeout( \n () => p.catch(error => console.log('caught', error.message)),\n 1000);\n\n\n1\n2\n3\n4\n[~/.../event-loop/promise-ejemplo(master)]$ ./unhandled-promise-rejection.js \nunhandledRejection: woops\ncaught woops\n(node:107) PromiseRejectionHandledWarning: Promise rejection was handled asynchronously (rejection id: 1)\n\n\nVéase también\nhttps://javascript.info/microtask-queue#unhandled-rejection\npara una versión de este programa en el cliente/browser\n\nSummarizing\n\n\n .catch handles errors in promises of all kinds: be it a reject() call, or an error thrown in a handler.\n We should place .catch exactly in places where we want to handle errors and know how to handle them.\n It’s ok not to use .catch at all, if there’s no way to recover from an error.\n In any case we should have the unhandledrejection event handler to track unhandled errors\n\n\n", "url": "/tema2-async/event-loop/exercises/promises/exception-inside-promise/" }, { "title": "Microtasks", "excerpt": "\n", "content": "Microtasks\n\nIntroduction\n\nAs with callbacks, promise handlers in .then/.catch/.finally are always asynchronous.\n\nEven when a Promise is immediately resolved, the code on the lines below the .then/.catch/.finally will execute before these handlers.\n\nAsynchronous tasks need proper management:\n\nFor that, the ECMA standard specifies an internal queue PromiseJobs, more often referred to as the “microtask queue” (ES8 term).\n\nAs stated in the specification:\n\n\n The queue is first-in-first-out: tasks enqueued first are run first.\n Execution of a task is initiated only when nothing else is running.\n\n\nOr, to say more simply,\n\n\n when a promise is ready, its .then/catch/finally handlers are put into the queue; they are not executed yet.\n When the JavaScript engine becomes free from the current code, it takes a task from the queue and executes it.\n\n\nIf there’s a chain with multiple .then/catch/finally, then every one of them is executed asynchronously. That is,\n\n\n It first gets queued when is ready, then executed only when\n \n the current code is complete and\n previously queued handlers are finished.\n \n \n\n\nFor example:\n\n1\n2\n3\n4\nPromise.resolve()\n .then(() => console.log(\"1\"))\n .then(() => console.log(\"2\"));\nconsole.log(0);\n\n\nWill produce as output: \"0\\n1\\n2\\n\"\n\nMicrotasks are used under the cover of await as well, as it’s another form of promise handling.\n\nQuestion 1\n\nWhat is the output of this program?\n\n1\n{% include_relative promise-job-queue.js %}\n\n\nSolution 1\n\n\n Solution 1\n\n\nExplanations\n\nThere is a special function queueMicrotask(func) that queues func for execution in the microtask queue.\n\nThe engine executes all tasks from microtask queue, prior to running any other macrotasks or rendering or anything else.\n\nThe richer event loop picture may look like this figure taken from the blog ddcode.net\n\n\n\nAlmost quoting this blog The JavaScript event loop: micro-tasks and macro-tasks by Siddharth Jain (2019):\n\n\n One macro-task is completed from the macro-task (Task) queue inside message queue. On completion of that task, the event loop goes to the micro-task (Job) queue. The event loop does not look into the next action until the completion of the entire micro-task (Job) queue. It finishes the entire micro-task queue and then moves back to render (if needed) and then to the macro-task queue.\n\n\n\n Task Queue → Micro-task → Render → Macro-task\n\n\nObserve that DOM modification (dynamic changes in the DOM, for example, added or removed elements or changes in attributes values) go to the microtask queue, so that these tasks can be executed before the browser re-renders.\n\nAll microtasks are completed before any other event handling or rendering or any other macrotask takes place.\n\nThat’s important, as it guarantees that the application environment is basically the same (no mouse coordinate changes, no new network data, etc) between microtasks.\n\nQuestion 2\n\nWhat is the output of this program?\n\n1\n{% include_relative promise-job-queue-2.js %}\n\nSolution 2\n\n\n Solution 2\n\n\nReferencias (Read also)\n\n\n Stack Overflow: macrotask queue and microtask queue priority\n The JavaScript event loop: micro-tasks and macro-tasks by Siddharth Jain (2019)\n The blog ddcode.net: Analysis of Microtask and Macrotask in JS event cycle. 2019\n Chapter Event loop: microtasks and macrotasks from the javascript.info book\n\n", "url": "/tema2-async/event-loop/exercises/promises/microtask-queue/" }, { "title": "Promises chaining", "excerpt": "\n", "content": "Promises chaining\n\nIn frontend programming promises are often used for network requests.\n\nWe’ll use the fetch method to load the information about the user from the remote server. It has a lot of optional parameters covered here, but the basic syntax is quite simple:\n\n1\nlet promise = fetch(url);\n\n\nThis makes a network request to the url and returns a promise. \nThe promise resolves with a response object when the remote server responds with headers, but before the full response is downloaded.\n\nTo read the full response, we should call a method response.text(): it returns a promise that resolves when the full text downloaded from the remote server, with that text as a result.\n\n\n See code deployed: simple-request.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n // .then below runs when the remote server responds\n .then(function(response) {\n // response.text() returns a new promise that resolves with the full response text\n // when it loads\n return response.text();\n })\n .then(function(text) {\n // ...and here's the content of the remote file\n alert(text); // {\"name\": \"iliakan\", isAdmin: true}\n });\n</script>\n\nOnce we got the loaded user, we can make one more request to GitHub, load the user profile and show the avatar:\n\n\n See code deployed: github.html\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n<!DOCTYPE html><script>\n'use strict';\nfetch('https://javascript.info/article/promise-chaining/user.json')\n .then(response => response.json())\n .then(user => fetch(`https://api.github.com/users/${user.name}`))\n .then(response => response.json())\n .then(githubUser => new Promise(function(resolve, reject) { // (*)\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n setTimeout(() => {\n img.remove();\n resolve(githubUser); // (**)\n }, 3000);\n }))\n // triggers after 3 seconds\n .then(githubUser => alert(`Finished showing ${githubUser.name}`));\n</script>\n\n\nFinally, we can split the code into reusable functions:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n<!DOCTYPE html><script>\n 'use strict';\n function loadJson(url) {\n return fetch(url)\n .then(response => response.json());\n }\n \n function loadGithubUser(name) {\n return fetch(`https://api.github.com/users/${name}`)\n .then(response => response.json());\n }\n \n function showAvatar(githubUser) {\n return new Promise(function(resolve, reject) {\n let img = document.createElement('img');\n img.src = githubUser.avatar_url;\n img.className = \"promise-avatar-example\";\n document.body.append(img);\n \n setTimeout(() => {\n img.remove();\n resolve(githubUser);\n }, 3000);\n });\n }\n \n // Use them:\n loadJson('/article/promise-chaining/user.json')\n .then(user => loadGithubUser(user.name))\n .then(showAvatar)\n .then(githubUser => alert(`Finished showing ${githubUser.name}`));\n // ...\n </script>\n\n\nSee the file:\n\n\n solution\n\n", "url": "/tema2-async/event-loop/exercises/promises/promise-chaining/" }, { "title": "Promisification", "excerpt": "\n", "content": "Promisification\n\nPromisification it’s the conversion of a function that accepts a callback into a function returning a promise.\nWrite a function promisify(f) that receives a function fthat accepts a callback f( ...args, callback) and \nreturns a function that returns the equivalent Promise object\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"ie=edge\">\n <title>Promisify</title>\n</head>\n\n<body>\n <script>\n function promisify(f) {\n // Fill the code\n };\n\n function loadScript(src, callback) {\n let script = document.createElement('script');\n script.src = src;\n\n script.onload = () => callback(null, script);\n script.onerror = () => callback(new Error(`Script load error for ${src}`));\n\n document.head.append(script);\n }\n\n let loadScriptPromise = promisify(loadScript);\n\n loadScriptPromise(\"https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js\").then(\n (r) => alert(\"script loaded\")\n ).catch(alert);\n\n </script>\n</body>\n\n</html>\n\n\nSee https://javascript.info/promisify\n", "url": "/tema2-async/event-loop/exercises/promises/promisify/" }, { "title": "Splitting CPU Hungry Tasks", "excerpt": "\n", "content": "Splitting CPU Hungry Tasks\n\nSee https://javascript.info/event-loop#use-case-1-splitting-cpu-hungry-tasks\n\nTo demonstrate the approach, for the sake of simplicity, let’s take a function that counts from 1 to a big number.\n\nIf you run the code below with a very large number, the engine will hang for some time.\n\nWhen running it in-browser, try to click other buttons on the page – you’ll see that no other events get handled until the counting finishes.\n\n1\n{% include_relative hang.js %}\n\n\nWe can evade problems by splitting the big task into pieces. Do the first piece, then schedule setTimeout (with zero-delay) to do the next piece, and so on.\n\n1\n2\n3\n[~/.../tema2-async/event-loop(master)]$ pwd -P\n/Users/casiano/campus-virtual/1920/dsi1920/ull-esit-dsi-1920.github.io/tema2-async/event-loop\n[~/.../tema2-async/event-loop(master)]$ cat splitting-cpu-hungry-task.html\n\n\n1\n{% include_relative splitting-cpu-hungry-task.html %}\n\n\nRUN IT!!!!\n", "url": "/tema2-async/event-loop/exercises/splitting-cpu-hungry-tasks/" }, { "title": "Práctica Connecting Robust Microservices (p6-t2-microservices)", "excerpt": "\n", "content": "Práctica Connecting Robust Microservices (p6-t2-microservices)\n\n\n \n Lea el Capítulo 4 “Connecting Robust Microservices” de Node.JS The Right Way ` ` y resuelva los problemas en la secciones\n \n Error Handling,\n Robustness y\n \n Bidirectional Messaging:\n \n Error Handling\n \n The zmq-filer-rep.js program uses fs.readfile() to serve up file contents. However it doesn’t handle error cases.\n \n What should the program do in the case of error?\n How would you change the JSON object structure of messages to support sending an error to the requester?\n \n \n Later in the same program we listen for the Unix signal SIGINT to detect the user’s Ctrl-C in the terminal\n \n What happens if the program ends in some other way , like SIGTERM (the termination signal)?\n What happens if there is an unhandled Node.js exception, and how should we deal with it?\n \n Hint: you can listen for the uncaughtException event on the process object\n \n \n \n \n \n \n Robustness\n \n In Building a Cluster we created a Node.js cluster that spins up a pool of worker processes.\n In the master process we listened for online events and logged a message when the workers came up.\n But we didn’t specify what should happen when a worker ends.\n \n What happens when you kill a worker process from the command line?\n \n Hint: Use kill [pid]from the command line\n \n \n How would you change the zmq-filer-rep-cluster.js program to fork a new worker whenever one dies?\n \n \n \n \n Bidirectional Messaging\n \n For this project you’ll need to use 0MQ PUSH/PULL sockets and the Node.js clustering techniques.\n Your clustered program will spin up a pool of workers and distribute 30 jobs.\n The master process should:\n \n Create a PUSH socket and bind it to an IPC endpoint. This socket will be for sending jobs to the workers\n Create a PULL socket and bind it to a different IPC endpoint. This socket will receive messages from the workers\n Keep a count of ready workers\n Listen for messages on the PULL socket, and\n \n If the message is a ready message, increment the ready counter, or\n If the message is a result message , output it to the console\n \n \n Spin up the worker processes\n When the ready counter reaches 3 send 30 job messages out through the push socket\n \n \n The worker process should:\n \n Create a PULL socket and connect it to the master ‘s PUSH endpoint\n Create a PUSH socket and connect it to the master ‘s PULL endpoint\n Listen for job messages on the PULL socket, and respond by sending a result message out on the PUSH socket\n Send a ready message out on the PUSH socket.\n \n \n Make sure your result messages include at least the process ID of the worker. \n This way you can inspect the console output and confirm that the workload is being balanced among the worker processes.\n See the example in directory ventilator-worker-sink\n See section PUSH-PULL in file Readme.md in the folder connecting-robust-microservices-chapter-4/microservices in our repo ULL-MII-CA-1819/nodejs-the-right-way\n \n \n Añada documentación\n\n\nRecursos\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way.\n \n Mira el directorio connecting-robust-microservices-chapter-4\n El subdirectorio connecting-robust-microservices-chapter-4/microservices contiene los ejemplos del libro\n \n \n YouTube vídeo: Building Distributed Systems with Node.js and 0MQ.\n \n Jim R. Wilson, author of Node.js the Right Way, explains how to build distributed systems using ØMQ at a Node.js in the Wild meetup]\n Slides at ull-mii-ca-1819\n Slides at jimbojw-zmq-talk\n \n \n\n\nNode.js 0MQ API\n\n\n http://zeromq.github.io/zeromq.js/\n\n\nLa Guía de ZeroMQ\n\n\n 0MQ - The Guide. HTML\n 0MQ - The Guide. PDF\n 0MQ -Examples in all languages zguide github ØMQ - The Guide. Written by Pieter Hintjens ph@imatix.com, CEO iMatix Corporation.\n \n 0MQ Examples in Node.js\n \n \n 0MQ community\n zeromq.js examples in the node.js distribution in zeromq GitHub repo\n ZGuide examples in Node.JS\n ZMQ guide: Divide and Conquer\n ZMQ Guide: The Load Balancing Pattern\n\n\nTutoriales\n\n\n ZeroMQ + Node.js (or How to connect your backend) Manuel Pineda @pin3da_ pin3da at github\n Trasparencias ZeroMQ with NodeJS por Fernando D. Alonso\n \n krakatoa/node_zmq_workshop Examples\n zguide.zeromq.org/\n api.zeromq.org/3-2:zmq-socket\n api.zeromq.org/3-2:zmq-setsockopt\n \n \n\n\nParallel Computing\n\n\n ZeroMQ for Massivelly Parallel Codes Anthony Scemama\n ZeroMQ Tutoriasl: Butterfly\n Easy cluster parallelization with ZeroMQ\n\n\nRetos para el Capítulo Connectiong Robust Microservices\n\n\n Retos para el Capítulo Connectiong Robust Microservices\n\n\n\n", "url": "/tema2-async/practicas/p6-t2-microservices/" }, { "title": "Práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) (p7-t2-async-js-edx)", "excerpt": "\n", "content": "Práctica Asynchronous Programming with Javascript EdX Course: Modules 1 (Asynchronous Fundamentals) and 2 (Promises) (p7-t2-async-js-edx)\n\n\n \n Realice los módulos 1 y 2 del curso EdX Asynchronous Programming with Javascript\n \n Módulo 1 Asynchronous Fundamentals\n Módulo 2 Promises\n\n\ny resuelva los problemas planteados en dichos módulos\n\nRecursos\n\n\n Curso EdX Asynchronous Programming with Javascript\n GitHub repoULL-MII-CA-1819/async-js\n Cómo funciona Async/Await en menos de 15 minutos YouTube Vídeo por Appdelante\n Javascript Async Await, Promesas y Callbacks por Fatz\n Curso JavaScript Promises en Udacity\n Book The Modern Javascript Tutorial. Chapter Promises, async/await\n Promises Workshop for JavaScript! Learn to wield promises like a master to write clean asynchronous code GitHub Repo. A Workshopper module that teaches you to use promises in javascript\n\n\nThe Coding Train\n\n\n 16.11: Promises Part 1 - Topics of JavaScript/ES6\n GitHub repo for The Coding Train website\n\n\nRecursos para el profesor\n\n\n Iván\n MarreA\n /Users/casiano/formacion/edx/async-js\n\n\n", "url": "/tema2-async/practicas/p7-t2-async-js-edx/" }, { "title": "git pull all", "excerpt": "\n", "content": "git pull all\n\nPlan de Trabajo\n\n\n See git-pull-all\n Make a fork\n Solve the issue Add more than just ‘git pull’ #3 but writing a git-all-fetch npm module\n Write tests to check the validity of your work\n Write a GitHub Action to add CI\n Publish your module at GitHub Registry inside this subject organization\n\n\ngit all\n\nLo ideal sería tener una serie de comandos all:\n\n1\n2\n3\n4\n5\ngit-all-pull\ngit-all-fetch\ngit-all-status\ngit-all-remote\n...\n\n\nacepting exactly the options than their corresponding one-repo commands.\n\nA real-life example is git-remove-token a script I had to write to manage the downloads\nof students lab with GH Classroom:\n\n1\n2\n3\n[~/.../PLgrado/eloquentjsegg(inicial)]$ cat /usr/local/bin/git-remove-token\n#!/usr/local/bin/bash\ngit remote set-url origin $(git remote -v | head -n 1 | grep -o 'github\\.com.*git' | awk '{print \"https://\"$1}')\n\n\nPlan\n\nThis is a different task per student. A group will make git-all-pull and another \ngit-all-remote, etc.\n\ngit-assignment-clone\n\ngit assignment clone ORGANIZATION/assignment-prefix\n\ncrea un repo con submodulos los repos de esa asignación\n\nlist of github students to download in a file\n\ngit-all-submodule\n\nCrearía un repo con submódulos los repos que están en el directorio\n\nSee\n\n\n https://www.npmjs.com/package/git-submodule-tool\n\n", "url": "/tema2-async/practicas/p8-t2-pull-all/" }, { "title": "Servicios y Aplicaciones Web", "excerpt": "\n", "content": "Servicios y Aplicaciones Web\n\nThe Browser, The DOM, Events, Form Fields\n\nPráctica del DOM p4-t3-dom\n\n\n Descripción de la práctica p4-t3-dom\n\n\nEjercicios del DOM\n\n\n Ejercicios del DOM\n\n\nHTTP\n\nWebSockets\n\nPrácticas\n\n\n Descripción de la práctica p5-t3-websockets\n\n\nWeb Application Bundlers: Webpack, Parcel\n\nWeb Workers\n\nCORS\n\nREST\n\nAuthentication\n\n\n\nWeb Scrapping\n\nBases de Datos y Motores de Búsqueda\n\nJekyll\n\nHugo\n\nGastby\n\nReact\n\nGraphQL\n\nThe JAM Stack\n\nServerless\n\nDesktop Apps using Web Technologies\n\nExtending Visual Studio Code\n\nWebAssembly\n\nTools for Static Blogs\n\nProcess-managers\n\n", "url": "/tema3-web/" }, { "title": "Práctica: Commanding Databases (p10-t3-commanding-databases)", "excerpt": "\n", "content": "Práctica: Commanding Databases (p10-t3-commanding-databases)\n\nLea el capítulo 6 Commanding Databases\ndel libro\nNode.js 8 the Right Way\ny resuelva los problemas en la secciónes \nDeleting and Index y \nadding a Single Document\n\nVariantes: yargs, node-fetch, @elastic/elasticsearch\n\nEn vez de seguir el capítulo del libro al pie de la letra, puede realizar cualquiera de las variantes que se mencionan a continuación o intentar combinaciones de ellas.\n\nPor ejemplo, puede usar yargs en vez de commander y usar el cliente de Elasticsearch @elastic/elasticsearch para Node en vez de request\n\n\n Descripción de las variantes\n\n\nReto\n\n\n Retos\n\n\nRecursos\n\nLibro\n\n\n BULL PuntoQ\n Node.js 8 the Right Way. Jim Wilson. 2018 (Debes estar autenticado via PuntoQ BULL)\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way con las soluciones (privado)\n Capítulo 6 “Commanding DataBases* Primera Edición\n\n\nCommander\n\n\n Commander examples\n\n\njq\n\n\n jq manual\n JSON on the command line with jq\n jq simplified grammar extracted from the files parser.y and lexer.l in the jq sources\n\n\nElasticsearch\n\n\n A Practical Introduction to Elasticsearch By Ismael Hasan Romero\n Node Js Elastic Search Tutorial Example\n Chrome Plugin ElasticSearch Head es una herramienta mas simple que Kibana para acceder desde Chrome a ElasticSearch\n \n \n \n \n \n\n\n", "url": "/tema3-web/practicas/p10-t3-commanding-databases/" }, { "title": "Práctica p10-t3-jekyll-search", "excerpt": "\n", "content": "Práctica p10-t3-jekyll-search\n\n{% include jekyll-simple-search.md %}\n", "url": "/tema3-web/practicas/p10-t3-jekyll-search/" }, { "title": "Práctica p11-t3-react-tic: Tutorial “Intro to React”. Tic-Tac-Toe", "excerpt": "\n", "content": "Práctica p11-t3-react-tic: Tutorial “Intro to React”. Tic-Tac-Toe\n\nRealice el tutorial: Intro to React y, usando Jekyll, elabore el correspondiente informe en el repo asignado a esta práctica\n\n\n Before We Start the Tutorial\n \n What Are We Building?\n Prerequisites\n \n \n Setup for the Tutorial\n \n Option 1: Write Code in the Browser\n Option 2: Local Development Environment\n Help, I’m Stuck!\n \n \n Overview\n \n What Is React?\n Inspecting the Starter Code\n Passing Data Through Props\n Making an Interactive Component\n Developer Tools\n \n \n Completing the Game\n \n Lifting State Up\n Why Immutability Is Important\n Function Components\n Taking Turns\n Declaring a Winner\n \n \n Adding Time Travel\n \n Storing a History of Moves\n Lifting State Up, Again\n Showing the Past Moves\n Picking a Key\n Implementing Time Travel\n Wrapping Up\n \n \n\n", "url": "/tema3-web/practicas/p11-t3-react-tic/" }, { "title": "Práctica: Developing RESTful Web Services (p11-t3-restful)", "excerpt": "\n", "content": "Práctica: Developing RESTful Web Services (p11-t3-restful)\n\nLea el Chapter 7. Developing RESTful Web Services del libro de Jim Wilson. 2018 (Debes estar autenticado via PuntoQ BULL) y\nlea también las notas del profesor sobre este capítulo.\n\nEn este capítulo se crea - utilizando Express.js - un servicio Web que permite crear y administrar colecciones de libros que en el libro denominan bundles.\n\nLea el capítulo y resuelva los problemas planteados en la secciones:\n\nDeleting a Bundle Entirely\n\nLa tarea es añadir una entrada al fichero web-services/b4/lib/bundle.js para suprimir un bundle o colección:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n app.delete(\"/api/bundle/:id\", async (req, res) => {\n /**\n * Delete a bundle entirely.\n * curl -X DELETE http://<host>:<port>/api/bundle/<id>\n */\n const options = {\n ...\n };\n try {\n ...\n } catch(esResErr) {\n ...\n }\n });\n\n\nInside the Express route handler callback function, you should do the following:\n\n\n Determine the bundle’s URL based on the es config object and the request parameters.\n Use await with a call to rp() to suspend until the deletion is completed.\n Wrap your await call in a try/catch block to handle any errors.\n\n\nNota: Usa el método rp.delete() para enviar un request HTTP DELETEa Elasticsearch.\n\nRemoving a Book from a Bundle\n\nLa tarea consiste en añadir en el fichero web-services/b4/lib/bundle.js una entrada para suprimir un libro de una determinada colección/bundle.\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n app.delete(\"/api/bundle/:id/book/:pgid\", async (req, res) => {\n /**\n * Remove a book from a bundle.\n * curl -X DELETE http://<host>:<port>/api/bundle/<id>/book/<pgid>\n */\n const bundleUrl = `${url}/${req.params.id}`;\n try {\n ...\n } catch (esResErr) {\n res.status(esResErr.statusCode || 502).json(esResErr.error);\n }\n });\n\n\nInside the try{} block you’ll need to do a few things:\n\n\n Use await with rp() to retrieve the bundle object from Elasticsearch.\n Find the index of the book within the bundle.books list.\n Remove the book from the list. Hint: use Array.splice().\n PUT the updated bundle object back into the Elasticsearch index, again\nwith await and rp().\n\n\nNote that if the bundle doesn’t contain the book whose removal is being requested, your handler should return a 409 Conflict HTTP status code. You can make this happen by throwing an object with a statusCode property set to 409 and an error object that contains information about what went wrong. This will be caught by the catch block and used to finish the Express response.\nIf you get stuck, check out the code with the solutions.\n\nReto\n\n\n Descripción del Reto\n\n\nRecursos\n\n\n Notas del profesor sobre el capítulo\n BULL PuntoQ\n Repo con los recursos de referencia\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n http://nodejs.org/api/http.html\n http://expressjs.com/\n https://www.npmjs.com/package/nconf\n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-request-body.html \n https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-suggesters.html\n https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols\n\n\n", "url": "/tema3-web/practicas/p11-t3-restful/" }, { "title": "Gatsby", "excerpt": "\n", "content": "Gatsby\n\n\n Lea la sección Gatsby\n Lea el tutorial A Step-by-Step Guide: Gatsby on Netlify y despliegue las páginas en Netlify. También en GitHub pages\n\n", "url": "/tema3-web/practicas/p12-t3-gatsby/" }, { "title": "TFA: Creating a Beautiful User Experience (p12-tfa-user-experience)", "excerpt": "\n", "content": "TFA: Creating a Beautiful User Experience (p12-tfa-user-experience)\n\n\n \n Lea el Chapter 8. Creating a Beautiful User Experience del libro de Jim Wilson. 2018 (Debes estar autenticado via PuntoQ BULL).\nEn este capítulo se construye una aplicación Web que actúa como cliente del servicio web creado en el capítulo anterior. Se aplican las siguientes tecnologías:\n \n Webpack, para procesar nuestro código para el front-end y sus dependencias para encarpetarlos en un pequeño número de ficheros\n Bootstrap para las hojas de estilo\n TypeScript, un superconjunto de JavaScript que permite la especificación e inferencia de tipos\n Promesas y Await/Async\n Handlebars (para los Templates)\n\n\ny resuelva los problemas en las secciones\n\nExtracting Text\n\nEl proyecto tal y como está en el capítulo pone todo el CSS en una etiqueta <style> \nal comienzo del fichero index.html. Se pide poner el CSS en un fichero apartey cargarlo con una etiqueta <link>.\n\nEl paquete npm mini-css-extract-plugin puede ser de ayuda.\n\nDeleting Bundles\n\nSe trata de añadir a la aplicación botones para suprimir Colecciones/bundles y el código para manejar la eliminación de los mismos\n\nReto Opcional: Añadir autenticación\n\n\n Intente usar el módulo passport para la autenticación\n Sería interesante que intentara hacer su autenticación usando una estrategia passport OAuth, autenticando por ejemplo con Twitter o GitHub\n Si tiene problemas a la hora de implantar autenticación con las estrategias passport OAuth (problemas con el proveedor, etc.) \no si se encuentra con ánimos y ganas de aprender, puede experimentar como alternativa con la estrategia passport-local\n Para hacer esta tarea le será muy útil estudiar también el capítulo 9 Fortifying Your Application\n Algunos proveedores OAuth quieren que proveas el dominio de tu aplicación. Hay varias soluciones que pueden funcionar o no\n Desplegar tu app en Heroku o similar\n Crear un falso dominio en el fichero /etc/hosts apuntando a localhost:\n\n\n1\n2\n3\n4\n$ cat /etc/hosts\n...\n127.0.0.1\tlocalhost b4.example.com www.example.com test.example.com app.test local.foobar3000.com\n...\n\n\n\n Otra posibilidad es usar lvh.me que apunta a 127.0.0.1. Y puedes testear subdominios usando xxx.lvh.me sin que tengas que tocar DNS o /etc/hosts.\nMira en:\n \n Testing subdomains in Ruby on Rails, with and without lvh.me por Fionna Voss 2018\n How does lvh.me (localtest.me, vcap.me) works?\n Why does the registered domain name “localtest.me” resolve to 127.0.0.1?\n \n \n How to set up local subdomains for Node.js app Stackoverflow\n\n\nRecursos\n\n\n Chapter 8. Creating a Beautiful User Experience\n Repo con los recursos de referencia\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n GitHub repo ULL-MII-CA-1819/tutorial-hello-node-typescript\n\n\n", "url": "/tema3-web/practicas/p12-tfa-user-experience/" }, { "title": "Descripción de la práctica p14-t3-react-components", "excerpt": "\n", "content": "Descripción de la práctica p14-t3-react-components\n\n\n Use create-react-appto create the initial structure of your app.\n Create TWO new components: UserInput and UserOutput\n UserInput should hold an input element, UserOutput two paragraphs\n Output multiple UserOutput components in the App component (any paragraph texts of your choice)\n Pass a username (of your choice) to UserOutput via props and display it there\n Add state to the App component (=> the username) and pass the username to the UserOutput component\n Add a method to manipulate the state (=> an event-handler method)\n Pass the event-handler method reference to the UserInput component and bind it to the input-change event\n Ensure that the new input entered by the user overwrites the old username passed to UserOutput\n Add two-way-binding to your input (in UserInput) to also display the starting username\n Add styling of your choice to your components/ elements in the components - both with inline styles and stylesheets\n\n\nHere is a solution to the problem:\n\n\n p14-t3-react-components-solution\n The solution deployed at GitHub pages\n\n", "url": "/tema3-web/practicas/p14-t3-react-components/" }, { "title": "Descripción de la práctica p15-t3-react-lists-and-conditionals", "excerpt": "\n", "content": "Descripción de la práctica p15-t3-react-lists-and-conditionals\n\n\n Introduce an input field inside the App component with a change listener which ouputs in a paragraph the entered text\n Introduce a ValidationComponent which receives the lengthof the entered text as a prop.\n The ValidationComponent should conditionally output Text too short or Text long enough in a paragraph dpeneding whether the text length is less than or greater than some number, let us say 5.\n Create another component CharComponent with a div and style it as a inline box. Here is a suggestion:\n 1\n2\n3\n4\n5\n6\n7\n{\n display: inline-box;\n padding: 16px;\n text-align: center;\n margin: 16px;\n border: 1px solid black;\n}\n \n \n Inside the Appcomponent render a list of CharComponent, where each CharComponent receives - as a prop - a different letter of the entered text from the initial input field\n When you click a CharCompomentit should be removed\n\n\nReferences\n\n\n Repo con una solucion a la práctica\n Solución desplegada en Github Pages\n Udemy course: React the Complete Guide. Assignment 2: Time to Practice. Lists and Conditionals\n Udemy course: React the Complete Guide. Assignment 2: Solution. Practice. Lists and Conditionals\n React: Lists and Keys\n React: Conditional Rendering\n\n", "url": "/tema3-web/practicas/p15-t3-react-lists-and-conditionals/" }, { "title": "Descripción de la Práctica DOM p4-t3-dom", "excerpt": "\n", "content": "Descripción de la Práctica DOM p4-t3-dom\n\nLea los capítulos\n\n\n Chapter Document of JavaScript.info book\n Chapter 14 of Eloquent JS: The Document Object Model\n\n\ny haga los correspondientes ejercicios.\n\nElabore un informe en el repo asignado al efecto.\n", "url": "/tema3-web/practicas/p4-t3-dom/" }, { "title": "Práctica p8-t3-jekyll-netlify", "excerpt": "\n", "content": "Práctica p8-t3-jekyll-netlify\n\nJekyll\n\nIntroducción\n\n\n Instale Jekyll en su máquina o en la máquina del servicio iaas.ull.es si no dispone de máquina. Instrucciones en Jekyll Installation\n Si no se acuerda de como funciona Ruby le pueden venir las instrucciones en Ruby 101\n Realice el Step by Step Tutorial\n \n Setup\n Liquid\n Front Matter\n Layouts\n Includes\n Data Files\n Assets\n Blogging\n Collections\n \n \n\n\nAlgunos tips si trabaja en la máquina del iaas.ull.es\n\n\n Creating a personal access token for the command line para trabajar con git y GitHub vía https\n \n Para que las instrucciones anteriores funcionen:\n\n 1\n2\n3\n4\n5\nusuario@ubuntu$ git config --global credential.helper store\nusuario@ubuntu$ ls -ltr ~/.git-credentials \n-rw------- 1 usuario usuario 68 nov 27 13:27 /home/usuario/.git-credentials\nusuario@ubuntu$ cat ~/.git-credentials \nhttps://crguezl:este-no-es-el-token@github.com\n \n \n \n Ejecutando en una máquina del iaas.ull.es:\n\n 1\n usuario@ubuntu:~/src/ull-mii-sytws-1920.github.io$ bundle exec jekyll serve -H 10.6.128.216 -P 8080\n \n \n\n\nDespliegue en GitHub Pages\n\n\n Section Deployment of the Step by Step Tutorial\n Despliegue el proyecto en GitHub Pages. Puede usar la rama master, la carpeta docs en mastero bien\n \n Puede hacerlo usando la rama gh-pages con la gema github-pages o el paquete npm gh-pages\n \n \n\n\nNavigation\n\n\n Lea de el tutorial Navigation los escenarios Basic List y Sorted List e implementelos en su site\n\n\n404\n\n\n Lea el tutorial Custom 404 Page y añada una página 404 personalizada\n\n\nTienes un ejemplo de 404.md en estos apuntes 404.md que se verá así \n{{site.baseurl}}/noexiste.\n\nLa página hace un request a The Cat API para mostrar una imagen de gatitos obtenida al azar.\nExiste una API similar para los amantes de los perros Dog API.\n\nPersonaliza tu página de 404.\n\nThemes\n\n\n Jekyll Themes\n\n\nTest the Deployment with html-profer and Travis\n\n\n Se puede probar el buen funcionamiento del Blog haciendo pruebas en Travis como se indica en este tutorial\n\n\n\n When testing Jekyll output, there is no better tool than html-proofer.\nThis tool checks your resulting site to ensure all links and images exist.\nUtilize it either with the convenient htmlproofer command-line executable,\nor write a Ruby script which utilizes the gem\n\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\nusuario@ubuntu:~/src/ull-mii-sytws-1920.github.io$ bundle exec htmlproofer ./_site --disable-external\nRunning [\"ImageCheck\", \"ScriptCheck\", \"LinkCheck\"] on [\"./_site\"] on *.html... \n\n\nRan on 158 files!\n\n\n- ./_site/2019/09/30/leccion.html\n * internally linking to /practicas, which does not exist (line 31)\n <a href=\"/practicas\" title=\"Prácticas\">✍</a>\n * internally linking to /practicas, which does not exist (line 129)\n <a href=\"/practicas\" title=\"Prácticas\">✍</a>\n- ./_site/404.html\n * internally linking to /practicas, which does not exist (line 31)\n <a href=\"/practicas\" title=\"Prácticas\">✍</a>\n ... many more entries\n\n\nLet us see if its true. Instead of running with jekyll serve, I use a static server to see if the build \nis really consistent:\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\nusuario@ubuntu:~/src/ull-mii-sytws-1920.github.io/_site$ static-server -p 8080\noptions.index is now deprecated please use options.templates.index instead.\n* Static server successfully started.\n* Serving files at: http://localhost:8080\n* Press Ctrl+C to shutdown.\n<-- [GET] /2019/09/30/leccion.html\n--> 200 OK /2019/09/30/leccion.html 5.63 KiB (15.964ms)\n...\n<-- [GET] /practicas/\n--> 403 /practicas/ (2.199ms)\n<-- [GET] /favicon.ico\n\n\nSee the 403 /practicas/ (2.199ms) warning.\n\nIt seems htmlproofer is right in spite that it works in github.io\n\nCI with Travis\n\n\n Using HTMLProofer From Ruby and Travis\n\n\nDisponga la ejecución de HTMLProofer en Travis\n\n\n\nDespliegues de Jekyll en Netlify\n\n\n \n Lea el tutorial A Step-by-Step Guide: Jekyll 3.0 on Netlify y despliegue el correspondiente Jekyll blog en Netlify\n \n \n Jekyll + NetlifyCMS 14 Youtube videos Thomas Bradley\n \n\n", "url": "/tema3-web/practicas/p8-t3-jekyll-netlify/" }, { "title": "Práctica: Cookies, Sesiones, Autenticación y Módulos npm (p8-t3-sessions-and-modules)", "excerpt": "\n", "content": "Práctica: Cookies, Sesiones, Autenticación y Módulos npm (p8-t3-sessions-and-modules)\n\nCree y publique un módulo npm que provea un middleware express que provee autenticación para acceder a los ficheros en una determinada ruta.\n\nEn npm puede encontrar este ejemplo:\n\n\n @ull-esit-pl/auth\n \n https://github.com/ULL-ESIT-PL-1819/crguezl-authmodule (Repo Privado en GitHub)\n \n \n Use un fichero JSON para guardar las parejas usuario-clave encriptadas:\n\n Fichero src/server/users.json\n\n 1\n2\n3\n4\n{\n \"juana\":\"$2a$10$BGEs97PfAygEp7CA6dgkvO.wkqtNmBkZhDUHJRKISw90vBL7bIrUS\",\n \"casiano\":\"$2a$10$C0dosn7LffKfM3WEt9O7X.waDkY0WQFHh7PF76.YkQDOG9aBa3nIC\"\n}\n \n \n El módulo encripta los passwords en el fichero de claves usando por ejemplo bcrypt-nodejs\n Este sería un ejemplo de un servidor que usa nuestro módulo como middleware:\n\n\nsrc/server/server.js\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n const express = require('express');\n const session = require('express-session');\n const auth = require('@ull-esit-pl/auth');\n\n ...\n\n const app = express();\n\n ...\n\n app.use(session({\n secret: 'verySecureSecret',\n resave: true,\n saveUninitialized: true,\n }));\n\n app.use('/', auth({\n passwordFile: path.join(__dirname, 'users.json'),\n pathToProtect: path.join(__dirname, '../../', 'dist'),\n registerView: 'register',\n successRegisterView: 'registerSuccess',\n errorRegisterView: 'registerError',\n loginView: 'login',\n successLoginView: 'loginSuccess',\n errorLoginView: 'loginError',\n logoutView: 'logout',\n unauthorizedView: 'unauthorizedView',\n }));\n\n ...\n\n\n\n \n El ejemplo de uso anterior muestra la interfaz de nuestro módulo. Esta es la cabecera de la función authentication exportada \npor @ull-esit-pl/auth:\n\n auth.js)\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\nfunction authentication(options) {\n const {\n passwordFile,\n pathToProtect,\n registerView,\n successRegisterView,\n errorRegisterView,\n loginView,\n successLoginView,\n errorLoginView,\n logoutView,\n unauthorizedView,\n } = options;\n ...\n}\n \n\n The function authentication returns a router to use as middleware. \nIt defines the routes\n \n /login, /register via GET and POST methods,\n /logout via the GET method only. And\n /content\n \n via the GET method and this is the route that will be protected.\n Users must be logged in before accessing this route, otherwise a 401 message will be sent with an unauthorized view.\n \n \n It receives an Object as first parameter. This object describes the configuration needed for the authentication.\n The properties are the following:\n \n passwordFile: location of the file to store the users credentials.\n pathToProtect: the files that will be accessible only when users are logged in.\n registerView: view containing the form to register. It will be served at /register via the HTTP GET method.\n successRegisterView: view with the message to render when the user registers successfully.\n errorRegisterView: view to render when there is an error in the registration.\n loginView: view containing the form to log in. It will be served at /login via the HTTP GET method.\n successLoginView: view with the message to render when the user logs in successfully.\n errorLoginView: view to render when there is an error in the login.\n logoutView: view to render when the user logs out (visits /logout).\n unauthorizedView: view to render when a user tries to access /content without being logged in\n \n \n \n \n Aunque el módulo de autorización soporta cualquier view engine, la aplicación de ejemplo que use nuestro módulo provee las vistas en ejs\n \n La siguiente figura muestra la estructura de vistas del ejemplo que estamos usando:\n\n 1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\nsrc/server/views/\n├── components\n│   ├── errorMessage.ejs\n│   ├── foot.ejs\n│   ├── form.ejs\n│   ├── head.ejs\n│   └── successMessage.ejs\n├── index.ejs\n├── login.ejs\n├── loginError.ejs\n├── loginSuccess.ejs\n├── logout.ejs\n├── register.ejs\n├── registerError.ejs\n├── registerSuccess.ejs\n└── unauthorizedView.ejs\n \n \n \n El módulo provee rutas y manejadores para el login, el registro y el logout así como para acceder al contenido protegido\n\n auth.js\n\n function authentication(options) {\n ...\n\n router.use('/content', auth, express.static(pathToProtect));\n\n router.get('/login', (req, res) => {\n ...\n });\n\n router.post('/login', (req, res) => {\n ...\n });\n\n router.get('/register', (req, res) => {\n ...\n });\n\n router.post('/register', (req, res) => {\n ...\n });\n\n // Route to logout\n router.get('/logout', (req, res) => {\n ...\n });\n\n return router;\n}\n\nmodule.exports = authentication;\n\n \n Escriba también un programa servidor en express que use su módulo. Deberá proteger una ruta conteniendo un tutorial que describe lo aprendido en esta práctica\n Despliegue su aplicación en la máquina virtual del iaas y en Heroku\n Escriba un tutorial con lo que ha aprendido en esta práctica\n Cuando acepte la asignación en Github Classroom se le creará el repo p8-t3-sessions-and-modules-aluXXXXcorrespondiente. Proceda de esta forma:\n \n Cree dentro de la organización un repo ULL-ESIT-DSI-1819/auth-aluXXXX con el código del módulo de autorización que publicará en npm en su ámbito @aluXXXX\n Cree dentro de la organización un repo ULL-ESIT-DSI-1819/server-auth-aluXXXX que contiene el código del server que usa el módulo y que contiene el tutorial\n Añada al repo ULL-ESIT-DSI-1819/p8-t3-sessions-and-modules-aluXXXX como submódulos git los dos módulos anteriores. Incluya un README.md en este repo\n \n \n\n\nRecursos\n\nProgramación Web\n\n\n EJS\n \n ejs Official page\n Using EJS with Express GitHub Wiki\n blog Use EJS to Template Your Node Application\n \n \n Cookies, Sessions, Authentication\n \n \n https://github.com/ULL-ESIT-DSI-1819/hello-cookies-and-sessions\n\n 1\n2\n [~/campus-virtual/1819/dsi1819/dsi-1819/tema3-web/practicas/p8-t3-sessions-and-modules/cookies(master)]$ pwd\n /Users/casiano/campus-virtual/1819/dsi1819/dsi-1819/tema3-web/practicas/p8-t3-sessions-and-modules/cookies\n \n \n Ejemplo de server con cookies y sessions: ULL-ESIT-PL-1617/evaluar-manejo-de-cookies-y-sessions-en-expressjs.\n Cookies y Sessiones (apuntes gitbook 16/17)\n Sessions y Authentication (apuntes 16/17)\n Descripción de una Práctica: Sessions y Autenticación en ExpressJS de 2016/2017\n En el módulo npm @ull-esit-pl/auth encontrará una solución al problema\n \n \n Express\n \n Apuntes de Express 1617\n Repo crguezl/express-start\n \n \n Despliegues\n \n Como Desplegar una Aplicación Web en iaas.ull.es\n Apuntes de Heroku\n \n \n Webpack\n \n Webpack guide: “getting started”\n Youtube video Webpack 4 por Fatz\n \n \n\n\nCreación de Módulos\n\n\n Véase la sección\n \n Creación de Paquetes y Módulos en NodeJS GitHub\n Creación de Paquetes y Módulos en NodeJS GitBook\n \n \n Ejemplo de módulo npm: ULL-ESIT-DSI-1617/scapegoat\n prueba-scapegoat. Ejemplo de programa cliente\n Repo combinado librería + cliente de prueba\n \n Video que explica como hacer un repo combinado\n \n \n Solución: repo ULL-ESIT-GRADOII-PL/modulos\n Como funciona require Video del profesor\n Best practice: Specify global dependencies in your gulpfile\n Node.js — How to test your new NPM module without publishing it every 5 minutes\n Best practice: Better local require() paths for Node.js:\n \n When the directory structure of your Node.js application (not library!) has some depth, you end up with a lot of annoying relative paths in your require calls like:\n 1\nvar Article = require('../../../models/article');\n \n Those suck for maintenance and they’re ugly.\n \n \n \n\n\nGit submodulos\n\n\n Libro de Git. Chapter 7.11 Git Tools - Submodules\n git help submodule\n Stackoverflow: How do I remove a submodule?\n Chris Jean blog in WordPress: Git Submodules: Adding, Using, Removing, Updating\n Vídeo uso de sub modulos en git: practica “modulos en npm”. Se refiere a otra práctica pero puede que les sea útil para esta práctica\n\n\nNotas para el Profesor\n\n\n sol-cas\n \n sol-cas\n \n \n sol-ai\n \n sol-ai auth\n sol-ai\n \n \n sol-ca\n \n sol-ca-auth\n sol-ca\n \n \n sol-da\n \n sol-da-auth\n sol-da\n \n \n sol-cri\n \n sol-cri\n sol-cri-auth\n ULL-ESIT-PL-1617/evaluar-manejo-de-cookies-y-sessions-en-expressjs-alu0100825510\n \n \n\n\n", "url": "/tema3-web/practicas/p8-t3-sessions-and-modules/" }, { "title": "Práctica Transforming Data and Testing Continuously (p9-t3-transfoming-data)", "excerpt": "\n", "content": "Práctica Transforming Data and Testing Continuously (p9-t3-transfoming-data)\n\n\n Lea el \nCapítulo 5 “Transforming Data and Testing Continuously” de Node.JS The Right Way\ny resuelva los problemas en la secciónes \nExtracting Classification Codes y Extracting Sources\n\n\nExtracting Classification Codes\n\n\n When extracting fields from the Project Gutenberg RDF (XML) files,\nin Traversing the Document, we specifically selected the Library\nof Congress Subject Headings (LCSH) and stored them in an array\ncalled subjects.\n At that time, we carefully avoided the Library of\nCongress Classification (LCC) single-letter codes. Recall that the\nLCC portion of an RDF file looks like this:\n\n\ndata/cache/epub/132/pg132.rdf\n\n1\n2\n3\n4\n5\n6\n<dcterms:subject>\n <rdf:Description rdf:nodeID=\"Nfb797557d91f44c9b0cb80a0d207eaa5\">\n <dcam:memberOf rdf:resource=\"http://purl.org/dc/terms/LCC\"/>\n <rdf:value>U</rdf:value>\n </rdf:Description>\n</dcterms:subject>\n\n\nUsing your BDD infrastructure built on Mocha and Chai, implement the following:\n\n\n Add a new assertion to parse-rdf-test.js that checks for book.lcc.\n It should be of type string and it should be at least one character long.\n It should start with an uppercase letter of the English alphabet, but not I, O, W, X, or Y.\n\n\n\n Run the tests to see that they fail.\n Add code to your exported module function in parse-rdf.js to make the tests pass.\n\n\n\n\nAyuda\n\n\nBusca por un elemento con un atributo rdf:resource que termine en /LCC\nLuego vete al padre de este elemento\nEncuentra el texto del primer descendiente rdf:value\n\n\n\nExtracting Sources\n\nMost of the metadata in the Project Gutenberg RDF files describes\nwhere each book can be downloaded in various formats.\n\nFor example,\nhere’s the part that shows where to download the plain text of The\nArt of War:\n\ndata/cache/epub/132/pg132.rdf\n\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n<dcterms:hasFormat>\n <pgterms:file rdf:about=\"http://www.gutenberg.org/ebooks/132.txt.utf-8\">\n <dcterms:isFormatOf rdf:resource=\"ebooks/132\"/>\n <dcterms:modified rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">\n 2016-09-01T01:20:00.437616</dcterms:modified>\n <dcterms:format>\n <rdf:Description rdf:nodeID=\"N2293d0caa918475e922a48041b06a3bd\">\n <dcam:memberOf rdf:resource=\"http://purl.org/dc/terms/IMT\"/>\n <rdf:value\n rdf:datatype=\"http://purl.org/dc/terms/IMT\">text/plain</rdf:value>\n </rdf:Description>\n </dcterms:format>\n <dcterms:extent rdf:datatype=\"http://www.w3.org/2001/XMLSchema#integer\">\n 343691</dcterms:extent>\n </pgterms:file>\n</dcterms:hasFormat>\n\n ...\n\n<dcterms:hasFormat>\n <pgterms:file rdf:about=\"http://www.gutenberg.org/ebooks/132.kindle.noimages\">\n <dcterms:isFormatOf rdf:resource=\"ebooks/132\"/>\n <dcterms:modified rdf:datatype=\"http://www.w3.org/2001/XMLSchema#dateTime\">2015-08-01T01:24:38.440052</dcterms:modified>\n <dcterms:extent rdf:datatype=\"http://www.w3.org/2001/XMLSchema#integer\">598678</dcterms:extent>\n <dcterms:format>\n <rdf:Description rdf:nodeID=\"N90d807c6b2a042078ac4e05e8e265dd7\">\n <rdf:value rdf:datatype=\"http://purl.org/dc/terms/IMT\">application/x-mobipocket-ebook</rdf:value>\n <dcam:memberOf rdf:resource=\"http://purl.org/dc/terms/IMT\"/>\n </rdf:Description>\n </dcterms:format>\n </pgterms:file>\n</dcterms:hasFormat>\n\n\nSuppose we wanted to include a list of download sources in each\nJSON object we create from an RDF file.\n\nTo get an idea of what data\nyou might want, take a look at the Project Gutenberg page for The\nArt of War.\n\nConsider these questions:\n\n\n Which fields in the raw data would we want to capture, and which could we discard?\n What structure would make the most sense for this data?\n What information would you need to be able to produce a table that looked like the one on the Project Gutenberg site?\n\n\nOnce you have an idea of what data you’ll want to extract, try\ncreating a JSON object by hand for this one download source. When\nyou’re happy with your data representation, use your existing\ncontinuous testing infrastructure and add a test that checks for\nthis new information.\n\nFinally, extend the book object produced in parse-rdf.js to include\nthis data to make the test pass.\n\nDescripción del Reto\n\nRecursos\n\n\n GitHub repo ULL-MII-CA-1819/nodejs-the-right-way\n BULL PuntoQ\n Safari. Chapter 5\nTransforming Data and Testing Continuously\n Sección Pruebas en los Apuntes del curso 16/17\n \n Mocha\n Should\n Travis\n Chai\n Sinon\n Karma\n Covering\n Blanket\n Istanbul\n BrowserSync\n \n \n Pruebas en el Navegador/Browser\n \n Learning JavaScript Test-Driven Development by Example SitePoint Tutorial\n Mocha y Chai en el navegador. Apuntes del curso 15/16\n Testing your frontend JavaScript code using mocha, chai, and sinon. Nicolas Perriault\n Covering\n \n Blanket\n Istanbul\n BrowserSync\n \n \n \n \n\n\n", "url": "/tema3-web/practicas/p9-t3-transforming-data/" }, { "title": "DevOps", "excerpt": "\n", "content": "DevOps\n\nSoftware Development Cycle: Git Submodules, WorkFlows, Registry\n\nGitHub Actions\n\nPerformance\n\nProcess Managers\n\nDocker\n\npm2\n\nKubernetes\n\nServerless Computing\n", "url": "/tema4-devops/" } ]