{"context":{"domain":"natura"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"645b823726c1280637133f0e","name":"Natura","domain":"natura","visibility":"public","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-08-14T07:14:01.319Z","createdAt":"2023-05-10T11:38:31.612Z"}]}},{"reference":"ComponentsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5f52a278a575399a45d239b4","component":"data2-core-types@Component","params":{"package":"data2-core-primitives","component":"Router","interactions":{"component":"data2-core-types@FieldSet","params":{"fields":{"goBack":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.goBack","args":[]}}}},"icon":{"component":"data2-core-primitives@String","params":{"content":"arrow-left"}},"visibility":"public"}},"goTo":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"component":"data2-core-types@Reference","params":{"reference":"url"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}}}]}},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"url"}},{"component":"data2-core-primitives@String","params":{"content":"preserveQuery"}}]},"break":true},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Path to route"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Path to redirect user"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Boolean"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Preserve Query"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Preserve query string parameters  preserve query parameters on navigating."}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"}]}},"open":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"component":"data2-core-types@This","params":{}},"prop":"history.push","args":[{"pathname":{"component":"data2-core-types@Reference","params":{"reference":"value"}}}]}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"share"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}]}},"close":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-types@Function"}},"definition":{"component":"data2-core-functions@Function","params":{"body":{"preventEvaluation":true,"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":"close"}},"parameters":["value"]}},"icon":{"component":"data2-core-primitives@String","params":{"content":"times"}},"visibility":"public","arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Link to open"}},"description":{"component":"data2-core-primitives@String","params":{"content":""}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2-core-types@ComponentParameter"},{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Target"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Where to open the link"}},"visibility":"public","required":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"oneOf":[{"params":{"content":"_blank"},"component":"data2-core-primitives@String"},{"params":{"content":"_self"},"component":"data2-core-primitives@String"},{"params":{"content":"_parent"},"component":"data2-core-primitives@String"},{"params":{"content":"_top"},"component":"data2-core-primitives@String"}]},"component":"data2-core-types@ComponentParameter"}],"description":{"component":"data2-core-primitives@String","params":{"content":"Closes a window that was opened via router.open."}}}}}}}}},{"_id":"620d28658271aa4129919d89","component":"data2-core-types@Component","params":{"package":"data2-interface-services","component":"DeviceController","interactions":{"params":{"fields":{"postMessage":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@String","title":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}]},"component":"data2-core-types@ComponentParameter"},"print":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"zoom":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Number"}},"title":{"component":"data2-core-primitives@String","params":{"content":"zoom"}},"visibility":"public"}}},"visibility":"public"},"component":"data2-core-types@ComponentParameter"}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"share":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}}},"component":"data2-core-types@ComponentParameter"},"clipboard.copy":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"clipboard.paste":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}}}}]},"component":"data2-core-types@ComponentParameter"},"download":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}]},"component":"data2-core-types@ComponentParameter"},"downloadUrl":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Url"}}}}]},"component":"data2-core-types@ComponentParameter"},"promptFiles":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"parameters":{"params":{"fields":{"multiple":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Multiple"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Whether or not to allow selecting multiple files"}},"component":"data2-core-primitives@Boolean"}},"acceptedFormats":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Accepted Formats"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Accepted file formats"}},"component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},"timeout":{"component":"data2-core-types@ComponentParameter","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Timeout"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Max milliseconds to wait for file upload"}},"component":"data2-core-primitives@Number"}}}},"component":"data2-core-types@FieldSet"}}}],"visibility":"public"},"component":"data2-core-types@ComponentParameter"},"meetingRecord":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","definition":{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"meeting"}},"script":{"component":"data2-core-primitives@String","params":{"content":"(function() {\n  let mediaRecorder;\n  let audioChunks = [];\n  let combinedStream;\n  let audioContext;\n  \n  window.meetingCapture = async function() {\n    try {\n      // Solicitar acesso ao áudio da guia (e vídeo, que será ignorado depois)\n      const tabStream = await navigator.mediaDevices.getDisplayMedia({ \n        video: true, // Necessário para alguns navegadores\n        audio: true\n      });\n      \n      // Remover a trilha de vídeo\n      const tabAudioTrack = tabStream.getAudioTracks()[0];\n      \n      // Solicitar acesso ao microfone\n      const micStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      const micAudioTrack = micStream.getAudioTracks()[0];\n      \n      // Criar um novo MediaStream com ambas as trilhas de áudio\n      combinedStream = new MediaStream([tabAudioTrack, micAudioTrack]);\n      \n      // Criar um contexto de áudio para misturar os streams\n      audioContext = new AudioContext();\n      const destination = audioContext.createMediaStreamDestination();\n      \n      // Conectar a trilha de áudio da guia\n      const tabSource = audioContext.createMediaStreamSource(new MediaStream([tabAudioTrack]));\n      tabSource.connect(destination);\n      \n      // Conectar a trilha de áudio do microfone\n      const micSource = audioContext.createMediaStreamSource(new MediaStream([micAudioTrack]));\n      micSource.connect(destination);\n      \n      // Iniciar gravação com o stream misturado\n      mediaRecorder = new MediaRecorder(destination.stream);\n      audioChunks = [];\n      mediaRecorder.ondataavailable = (e) => audioChunks.push(e.data);\n      mediaRecorder.start();\n      \n      console.log('Gravação iniciada. Chame meetingCaptureStop() para finalizar.');\n    } catch (error) {\n      console.error('Erro ao iniciar a captura:', error);\n    }\n  };\n  \n  window.meetingCaptureStop = function() {\n    return new Promise((resolve, reject) => {\n      if (!mediaRecorder) {\n        reject('Nenhuma gravação em andamento.');\n        return;\n      }\n      \n      mediaRecorder.onstop = () => {\n        const audioBlob = new Blob(audioChunks, { type: 'audio/webm' });\n        combinedStream.getTracks().forEach(track => track.stop());\n        audioContext.close();\n        \n        resolve(audioBlob);\n        console.log('Gravação finalizada. O arquivo de áudio está pronto para upload.');\n      };\n      \n      mediaRecorder.stop();\n    });\n  };\n})();"}}},"component":"data2-core-web@Script"},{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCapture"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"meetingRecordStop":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"public","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Filename"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Content"}}}},{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Object"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Options"}},"parameters":{"params":{"fields":{"type":{"component":"data2-core-types@ComponentParameter","params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@String"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Mimetype"}}}}}},"component":"data2-core-types@FieldSet"}}}],"definition":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"params":{},"component":"data2-core-web@Window"},"prop":{"component":"data2-core-primitives@String","params":{"content":"meetingCaptureStop"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-types@ComponentParameter"},"notify":{"params":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core-primitives@Function"}},"visibility":"private","arguments":[{"component":"data2-core-types@ComponentParameter","params":{"component":"data2-core-primitives@Object","parameters":{"title":{"params":{"component":"data2-core-primitives@String","index":{"component":"data2-core-primitives@Number","params":{"content":0}},"title":{"component":"data2-core-primitives@String","params":{"content":"title"}}},"component":"data2-core-types@ComponentParameter"},"sound":{"params":{"component":"data2-core-types@FileComponentUrlReference","index":{"component":"data2-core-primitives@Number","params":{"content":1}},"title":{"component":"data2-core-primitives@String","params":{"content":"sound"}}},"component":"data2-core-types@ComponentParameter"}},"flat":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}]},"component":"data2-core-types@ComponentParameter"}}},"component":"data2-core-types@FieldSet"}}},{"_id":"6a8c89ebecaed5dc9a96ac21","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"FaqOperadorV2","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// FaqOperadorV2 — NASVI operator FAQ copilot, one code component.\n// Real path: d2.data('faqs').filter({busca,country,ecommerce}) + refresh -> the\n// CustomHTTPDataSource runs semanticSearch server-side; then the Nasvi assistant\n// answers with the hits injected as context (same contract as triggerCopilotFlow).\n// demo:true      -> embedded mock data, no backend, no AI cost.\n// telemetry:false -> every write is inert (default).\n\nconst MOCK_USER = { name: 'Ana Gomez', email: 'ana.gomez@natura.net', countries: ['AR', 'MX'], user_type: ['Standard'], role: 'agent' }\nconst MOCK_REGIONS = ['AR', 'MX', 'CO', 'PE', 'CL', 'EC']\nconst MOCK_FAQS = [\n  { _id: 'm1', title: 'Puntos de la consultora no actualizados', article: '10231', d2_search_score: 0.87, category: 'MODELO_COMERCIAL', content: 'Si la consultora tiene apenas 1 punto, debe actualizar su registro. Esto ocurre por alguna inconsistencia en su dirección; después de actualizar sus datos sus puntos deberían restablecerse en hasta 24 horas.' },\n  { _id: 'm2', title: 'Pedido retenido por límite de crédito', article: '10884', d2_search_score: 0.74, category: 'PEDIDOS', content: 'Si el pedido queda retenido por exceder el límite de crédito, la consultora deberá ajustar el puntaje del pedido según el crédito disponible o pagar pedidos pendientes para liberar crédito.' },\n  { _id: 'm3', title: 'Unificación ELO Natura y Avon', article: '11002', d2_search_score: 0.66, category: 'MODELO_COMERCIAL', content: 'Con el ELO México, Natura y Avon se unificaron. Los ciclos, el catálogo y la tabla de puntos pasan a ser únicos. Ante conflicto de información, siempre prevalece el contenido que habla específicamente del ELO.' },\n  { _id: 'm4', title: 'Dejar de vender / baja de consultora', article: '10077', d2_search_score: 0.52, category: 'MODELO_COMERCIAL', content: 'Para darse de baja como Consultora de Belleza Natura debe enviar un correo a atencion_consultor@natura.net adjuntando identificación oficial vigente por ambos lados y una carta con el motivo.' },\n  { _id: 'm5', title: 'Plazos de entrega por región', article: '10455', d2_search_score: 0.41, category: 'PEDIDOS', content: 'Los plazos de entrega varían por región. Capital y GBA: 3 a 5 días hábiles. Interior: 5 a 8 días hábiles contados desde la facturación del pedido.' }\n]\nconst MOCK_HISTORY = [\n  { _id: 'h1', pergunta: '¿Cómo actualizo la dirección de una consultora?', resposta: 'Querido Asesor, para actualizar la dirección ingresá en el panel de registro, sección *Datos personales*, y editá el campo Domicilio. El cambio impacta el próximo ciclo.', createdAt: Date.now() - 1080000 },\n  { _id: 'h2', pergunta: '¿Cuántos días demora un reembolso?', resposta: 'Estimado asesor, el reembolso se procesa en hasta **10 días hábiles** después de aprobada la solicitud.', createdAt: Date.now() - 5700000 },\n  { _id: 'h3', pergunta: '¿Qué pasa si el pedido llega incompleto?', resposta: 'Querido Asesor, se debe abrir un reclamo de falta de producto adjuntando el número de pedido y la foto del remito.', createdAt: Date.now() - 93600000 }\n]\nconst MOCK_ANSWER = 'Querido Asesor,\\n\\nSi la consultora visualiza **apenas 1 punto**, casi siempre se debe a una **inconsistencia en su dirección**.\\n\\nPasos a seguir:\\n\\n1. Pedíle que ingrese a *Mi registro* y revise el domicilio completo.\\n2. Que corrija calle, número y código postal.\\n3. Guardar los cambios.\\n\\nDespués de actualizar los datos, **sus puntos deberían restablecerse** automáticamente.\\n\\n> Si pasadas 24 horas el puntaje sigue igual, abrí un ticket para el área comercial.'\n\nconst HELP_MD = 'Soy **NASVI**\\n\\nTu nuevo **copiloto virtual**, listo para acompañarte en cada contacto con nuestras consultoras.\\n\\nEstoy aquí para hacer tu trabajo **más ágil, más seguro y más claro**.\\n\\n¿Cómo lo hago? Muy fácil:\\n\\n- Estoy entrenado con los procesos, protocolos y wikis actualizados de Natura y Avon.\\n- Cuando tengas una duda, yo te doy la respuesta en segundos, sin detener tu atención.\\n- Además, te llevo directo a la fuente oficial en Beedoo, para que siempre tengas información validada.\\n\\nMi misión es que puedas resolver más consultas en el primer contacto, sin errores, y con total confianza.'\n\nconst VOTE = {\n  1: ['No encontré nada útil', 'Sin respuesta o sin relevancia para la consulta'],\n  2: ['Encontré muy poca información', 'Respuesta incompleta o poco relevante'],\n  3: ['Encontré parte de la información', 'Resolvió parcialmente, se requiere buscar más'],\n  4: ['Encontré casi todo lo que buscaba', 'Útil en gran parte, pero con pequeños vacíos'],\n  5: ['Encontré exactamente lo que necesitaba', 'Respuesta clara, completa y satisfactoria']\n}\nconst ORIGENES = [['chat', 'Chat'], ['voz', 'Voz'], ['video', 'Video']]\nconst BEEDOO = { MX: 'https://naturamexico.beedoo.io/wiki/' }\nconst BEEDOO_DEFAULT = 'https://naturalatam.beedoo.io/wiki/'\nconst PROMPT = 'Operador Pergunta :  \\n\\n\"{q}\"\\n\\nContesta en espanol'\n\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\n// Spanish relative time. d2.fmt.relative follows the browser locale, which in the\n// builder preview is English — the asesor must always read Spanish.\nfunction rel(ts) {\n  const t = typeof ts === 'number' ? ts : Date.parse(ts)\n  if (!t) return ''\n  const m = Math.round((Date.now() - t) / 60000)\n  if (m < 1) return 'recién'\n  if (m < 60) return 'hace ' + m + (m === 1 ? ' minuto' : ' minutos')\n  const h = Math.round(m / 60)\n  if (h < 24) return 'hace ' + h + (h === 1 ? ' hora' : ' horas')\n  const d = Math.round(h / 24)\n  if (d === 1) return 'ayer'\n  if (d < 30) return 'hace ' + d + ' días'\n  return new Date(t).toLocaleDateString('es')\n}\n\nfunction authOf(d2) { try { return d2.auth(d2.params.autenticacion) } catch (e) { return null } }\n// \"known\" = we resolved a real operator record with markets. The builder preview is\n// authenticated but is NOT an operator, so isAuthed alone would strand the market picker.\nfunction known(d2) { if (isDemo(d2)) return true; const u = user(d2); return (u.countries || []).length > 0 }\nfunction user(d2) {\n  if (isDemo(d2)) return MOCK_USER\n  const a = authOf(d2)\n  const em = (a && a.user && a.user.email) || ''\n  if (!em) return {}\n  const ds = d2.data('usuarios')\n  const rows = ds ? ds.records() : []\n  const f = rows.filter(function (r) { return r.email === em })[0]\n  return f || { email: em }\n}\nfunction isEcom(u) { return [].concat(u.user_type || []).indexOf('E-commerce') >= 0 }\nfunction solo(u) { return (u.countries || []).length === 1 }\nfunction regionCodes(d2) {\n  if (isDemo(d2)) return MOCK_REGIONS\n  const ds = d2.data('regiones')\n  return ds ? ds.records().map(function (r) { return r.country_code }).filter(Boolean).sort() : []\n}\nfunction marketOptions(d2, u) {\n  if (!known(d2)) return regionCodes(d2)\n  return isEcom(u) ? regionCodes(d2) : (u.countries || [])\n}\nfunction showSelector(d2, u) { return !known(d2) || isEcom(u) || !solo(u) }\nfunction market(d2, u) {\n  if (known(d2) && !isEcom(u) && solo(u)) return u.countries[0]\n  return d2.state.region || marketOptions(d2, u)[0] || ''\n}\nfunction hits(d2) {\n  if (isDemo(d2)) return d2.state.hits || []\n  const ds = d2.data('faqs')\n  return ds ? ds.records() : []\n}\nfunction bot(d2) { try { return d2.assistant(d2.params.assistant) } catch (e) { return null } }\nfunction answerText(d2) { if (isDemo(d2)) return d2.state.answer || ''; const a = bot(d2); return (a && a.answer) || '' }\nfunction busy(d2) { if (isDemo(d2)) return !!d2.state.busy; const a = bot(d2); return !!(a && a.busy) }\nfunction history(d2) {\n  if (isDemo(d2)) return MOCK_HISTORY\n  const ds = d2.data('historial')\n  return ds ? ds.records() : []\n}\nfunction beedooUrl(mk, article) { return (BEEDOO[mk] || BEEDOO_DEFAULT) + String(article || '') + '/lll' }\n\nfunction card(d2, r, i, mk) {\n  const sc = typeof r.d2_search_score === 'number' ? (r.d2_search_score * 10).toFixed(1) : ''\n  return '<article class=\"src\" data-key=\"' + attr(r._id || i) + '\">'\n    + '<header class=\"src-h\"><h3 class=\"src-t\">' + esc(r.title) + '</h3>'\n    + (sc ? '<span class=\"src-s\">' + esc(sc) + '</span>' : '') + '</header>'\n    + (r.category ? '<span class=\"src-c\">' + esc(r.category) + '</span>' : '')\n    + '<p class=\"src-b\">' + esc(r.content) + '</p>'\n    + (r.article ? '<a class=\"src-l\" href=\"' + attr(beedooUrl(mk, r.article)) + '\" target=\"_blank\" rel=\"noopener\" data-article=\"' + attr(r.article) + '\">contenido en Beedoo</a>' : '')\n    + '</article>'\n}\n\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '.app{--cream:rgb(254,251,244);--ink:#162b37;--ink2:rgba(22,43,55,.62);--line:#e3ddd2;--olive:rgb(230,238,189);--ok:rgb(125,230,28);--off:rgb(200,46,0);--accent:var(--acc,#FF6C0E);display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.55 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;position:relative;overflow:hidden}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:18px;padding:14px 22px;border-bottom:1px solid var(--line);background:#fff}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}'\n    + '.brand b{font-size:22px;font-weight:700;letter-spacing:.5px}'\n    + '.brand span{font-size:12px;color:var(--ink2)}'\n    + '.chips{display:flex;gap:6px;flex:none}'\n    + '.chip{flex:none;border:0;border-radius:16px;padding:6px 14px;font:600 12px/1 inherit;color:#fff;background:var(--off);cursor:pointer;opacity:.5}'\n    + '.chip[aria-pressed=\"true\"]{background:var(--ok);color:var(--ink);opacity:1}'\n    + '.spacer{flex:1 1 auto;min-width:8px}'\n    + '.mk{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--ink2);flex:none}'\n    + '.mk select{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}'\n    + '.lock{flex:none;border:1px solid var(--line);border-radius:7px;padding:5px 10px;font-weight:700;background:#faf6ef}'\n    + '.who{font-size:12px;color:var(--ink2);text-align:right;line-height:1.3;flex:none}'\n    + '.who b{display:block;color:var(--ink);font-size:13px}'\n    + '.ico{flex:none;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;font:700 15px/1 inherit;display:grid;place-items:center}'\n    + '.ico:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.pv{flex:none;background:#fff6e6;border-bottom:1px solid #f0dcb4;color:#7a5a12;font-size:12px;padding:7px 22px}'\n    + '.main{flex:1 1 auto;display:grid;grid-template-columns:minmax(0,1fr) clamp(300px,32%,372px);min-height:0}'\n    + '.left{display:flex;flex-direction:column;min-height:0;padding:20px 22px;gap:14px}'\n    + '.ask label{display:block;font-weight:600;margin-bottom:6px}'\n    + '.q{width:100%;height:96px;resize:none;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);font:inherit}'\n    + '.q:focus{outline:2px solid var(--accent);outline-offset:-1px}'\n    + '.ask-r{display:flex;align-items:center;gap:12px;margin-top:8px}'\n    + '.hint{font-size:12px;color:var(--ink2)}'\n    + '.send{flex:none;margin-left:auto;border:0;border-radius:8px;padding:10px 22px;background:var(--ink);color:#fff;font:600 14px/1 inherit;cursor:pointer}'\n    + '.send:disabled{opacity:.4;cursor:default}'\n    + '.log{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px}'\n    + '.you{align-self:flex-end;max-width:82%;background:#fff;border:1px solid var(--line);border-radius:12px 12px 2px 12px;padding:10px 14px}'\n    + '.bot{display:flex;gap:10px;max-width:94%}'\n    + '.av{width:34px;height:34px;flex:none;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center;font:700 13px/1 inherit}'\n    + '.bub{background:var(--olive);border-radius:2px 16px 16px 16px;padding:12px 16px;min-width:0}'\n    + '.bub p{margin:0 0 8px}.bub p:last-child{margin:0}.bub ul,.bub ol{margin:6px 0;padding-left:20px}'\n    + '.bub h1,.bub h2,.bub h3{font-size:15px;margin:8px 0 4px}.bub code{background:rgba(0,0,0,.07);padding:1px 5px;border-radius:4px}'\n    + '.bub blockquote{margin:8px 0;padding-left:10px;border-left:3px solid rgba(22,43,55,.25);color:var(--ink2)}'\n    + '.cur{display:inline-block;width:7px;height:15px;background:var(--ink);vertical-align:-2px;animation:bl .9s steps(2) infinite}'\n    + '@keyframes bl{50%{opacity:0}}'\n    + '.acts{display:flex;gap:8px;margin-top:10px}'\n    + '.act{border:1px solid rgba(22,43,55,.22);background:rgba(255,255,255,.6);border-radius:7px;padding:5px 11px;font:600 12px/1.4 inherit;color:var(--ink);cursor:pointer}'\n    + '.act:hover{border-color:var(--ink)}'\n    + '.empty{margin:auto;text-align:center;color:var(--ink2);max-width:300px;font-size:13px}'\n    + '.empty b{display:block;margin-bottom:8px;opacity:.3}.empty svg{width:34px;height:34px;stroke:currentColor;fill:none;stroke-width:1.6}'\n    + '.err{background:#fff0ef;border:1px solid rgba(255,60,51,.45);color:#b3261e;border-radius:9px;padding:9px 12px;font-size:13px}'\n    + '.right{border-left:1px solid var(--line);background:#fffdf9;display:flex;flex-direction:column;min-height:0}'\n    + '.right h2{margin:0;padding:16px 18px 10px;font-size:11px;letter-spacing:1.3px;text-transform:uppercase;color:var(--ink2)}'\n    + '.srcs{flex:1;min-height:0;overflow:auto;padding:0 16px 16px;display:flex;flex-direction:column;gap:10px}'\n    + '.src{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px}'\n    + '.src-h{display:flex;gap:10px;align-items:flex-start}'\n    + '.src-t{flex:1;margin:0;font-size:13.5px;font-weight:700;line-height:1.35}'\n    + '.src-s{font-size:19px;font-weight:700;color:var(--accent);line-height:1;flex:none}'\n    + '.src-c{display:inline-block;margin-top:6px;font-size:10px;letter-spacing:.6px;background:#f2ede4;border-radius:5px;padding:2px 7px;color:var(--ink2)}'\n    + '.src-b{margin:8px 0 0;font-size:12.5px;color:var(--ink2);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}'\n    + '.src-l{display:inline-block;margin-top:9px;font-size:12px;font-weight:600;color:var(--accent);text-decoration:underline}'\n    + '.ft{flex:none;display:flex;align-items:center;gap:16px;padding:10px 22px;border-top:1px solid var(--line);background:#fff;font-size:12px;color:var(--ink2)}'\n    + '.hist{flex:none;margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 14px;font:600 12px/1 inherit;color:var(--ink);cursor:pointer}'\n    + '.hist:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.scrim{position:absolute;inset:0;background:rgba(0,0,0,.44);backdrop-filter:blur(2px);display:grid;place-items:center;z-index:9}'\n    + '.dlg{background:var(--cream);border-radius:20px;box-shadow:0 18px 50px rgba(0,0,0,.28);position:relative;max-width:92%;max-height:88%;display:flex;flex-direction:column}'\n    + '.dlg-h{display:flex;align-items:center;padding:22px 24px 12px}'\n    + '.dlg-h h2{margin:0;font-size:21px;font-weight:700}'\n    + '.x{margin-left:auto;border:0;background:transparent;font:700 20px/1 inherit;color:var(--ink);cursor:pointer;padding:2px 6px}'\n    + '.dlg-b{padding:0 24px 24px;overflow:auto;min-height:0}'\n    + '.w-help{width:660px}'\n    + '.w-hist{width:1000px;height:78%;display:grid;grid-template-columns:290px 1fr;grid-template-rows:auto minmax(0,1fr);gap:14px 18px;padding:0 24px 24px;overflow:hidden}'\n    + '.hlist{overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px}'\n    + '.hitem{display:block;width:100%;text-align:left;border:0;border-bottom:1px solid var(--line);background:transparent;padding:11px 13px;cursor:pointer;font:inherit;color:var(--ink)}'\n    + '.hitem:hover{background:#faf6ef}'\n    + '.hitem[aria-selected=\"true\"]{background:var(--olive)}'\n    + '.hitem b{display:block;font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.hitem span{font-size:11px;color:var(--ink2)}'\n    + '.hdet{overflow:auto;padding-right:6px;display:flex;flex-direction:column;gap:12px}'\n    + '.w-vote{width:700px}'\n    + '.scale{display:flex;gap:11px;margin:4px 0 12px}'\n    + '.dot{flex:none;width:42px;height:42px;padding:0;border-radius:50%;border:1px solid rgba(22,43,55,.35);background:#fff;color:var(--ink);font:700 17px/1 inherit;cursor:pointer}'\n    + '.dot[aria-pressed=\"true\"]{background:var(--ink);color:#fff}'\n    + '.vdesc{min-height:38px;font-size:13px;color:var(--ink2);white-space:pre-line}'\n    + '.vin{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;font:inherit;background:#fff;color:var(--ink)}'\n    + '.vrow{display:flex;align-items:center;gap:12px;margin-top:14px}'\n    + '.tag{font-size:11px;border:1px dashed rgba(22,43,55,.35);border-radius:6px;padding:2px 7px;color:var(--ink2)}'\n    // The app is embedded in an iframe inside the agent desktop, so the usable width\n    // is not the monitor width. Below ~900px the sources column stacks under the chat.\n    + '@media (max-width:900px){'\n    + '.hd{gap:12px;padding:12px 16px}.who{display:none}.brand b{font-size:19px}'\n    + '.left{padding:16px}'\n    + '.main{display:flex;flex-direction:column}'\n    + '.left{flex:1 1 auto;min-height:0}'\n    + '.right{flex:0 0 auto;border-left:0;border-top:1px solid var(--line);max-height:42%}'\n    + '.right h2{padding:10px 16px 6px}'\n    + '.w-hist{width:96vw;grid-template-columns:1fr;grid-template-rows:auto auto minmax(0,1fr)}'\n    + '.w-help,.w-vote{width:94vw}'\n    + '.ft{gap:10px;padding:8px 16px}'\n    + '}',\n\n  render(d2) {\n    const u = user(d2)\n    const mk = market(d2, u)\n    const opts = marketOptions(d2, u)\n    const hs = hits(d2)\n    const ans = answerText(d2)\n    const bz = busy(d2)\n    const ok = known(d2)\n    const marked = d2.lib('marked@12.0.0')\n    const md = function (t) {\n      if (!t) return ''\n      if (!marked) return '<p>' + esc(t).replace(/\\n/g, '<br>') + '</p>'\n      try { return marked.parse(t) } catch (e) { return '<p>' + esc(t) + '</p>' }\n    }\n\n    const selector = showSelector(d2, u)\n      ? '<select class=\"sel\">' + opts.map(function (c) { return '<option value=\"' + attr(c) + '\"' + (c === mk ? ' selected' : '') + '>' + esc(c) + '</option>' }).join('') + '</select>'\n      : '<span class=\"lock\" title=\"Tu usuario está asignado a un solo mercado\">' + esc(mk || '--') + '</span>'\n\n    const conversa = (!d2.state.pregunta && !ans)\n      ? '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\"><path d=\"M21 12a8 8 0 0 1-8 8H7l-4 3v-5a8 8 0 0 1 8-11h2a8 8 0 0 1 8 5z\" stroke-linejoin=\"round\"/></svg></b>Escribí la duda del cliente y NASVI busca en las wikis por vos.</div>'\n      : (d2.state.pregunta ? '<div class=\"you\">' + esc(d2.state.pregunta) + '</div>' : '')\n        + ((ans || bz)\n          ? '<div class=\"bot\"><div class=\"av\">N</div><div><div class=\"bub\">' + md(ans) + (bz ? '<span class=\"cur\"></span>' : '') + '</div>'\n            + (!bz && ans ? '<div class=\"acts\"><button class=\"act copy\">Copiar</button><button class=\"act vote\">Votar</button></div>' : '')\n            + '</div></div>'\n          : '')\n\n    const fuentes = hs.length\n      ? hs.map(function (r, i) { return card(d2, r, i, mk) }).join('')\n      : '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\"><path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" stroke-linejoin=\"round\"/><path d=\"M14 3v5h5M9 13h6M9 17h4\" stroke-linecap=\"round\"/></svg></b>Realizá tu consulta para ver las wikis relacionadas aquí.</div>'\n\n    let overlay = ''\n    if (d2.state.panel === 'help') {\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-help\"><div class=\"dlg-h\"><h2>NASVI: El Agente del Agente</h2><button class=\"x\">&#215;</button></div><div class=\"dlg-b bub\" style=\"background:transparent\">' + md(HELP_MD) + '</div></div></div>'\n    } else if (d2.state.panel === 'hist') {\n      const rows = history(d2)\n      const sel = d2.state.hsel || (rows[0] && String(rows[0]._id || 0))\n      const cur = rows.filter(function (r, i) { return String(r._id || i) === String(sel) })[0] || rows[0]\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-hist\"><div class=\"dlg-h\" style=\"grid-column:1/-1;padding:20px 0 0\"><h2>Historial</h2><button class=\"x\">&#215;</button></div>'\n        + '<div class=\"hlist\">' + (rows.length ? rows.map(function (r, i) {\n          const id = String(r._id || i)\n          return '<button class=\"hitem\" data-key=\"' + attr(id) + '\" data-h=\"' + attr(id) + '\" aria-selected=\"' + (id === String(sel) ? 'true' : 'false') + '\"><b>' + esc(r.pergunta) + '</b><span>' + esc(rel(r.createdAt)) + '</span></button>'\n        }).join('') : '<div class=\"empty\" style=\"padding:20px\">Sin consultas todavía.</div>') + '</div>'\n        + '<div class=\"hdet\">' + (cur ? '<div class=\"you\" style=\"align-self:flex-start;max-width:100%\">' + esc(cur.pergunta) + '</div><div class=\"bot\"><div class=\"av\">N</div><div class=\"bub\">' + md(cur.resposta) + '</div></div>' : '') + '</div>'\n        + '</div></div>'\n    } else if (d2.state.panel === 'vote') {\n      const g = d2.state.grade || 0\n      const lab = VOTE[g]\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-vote\"><div class=\"dlg-h\"><h2>¿Qué tan útil fue la respuesta?</h2><button class=\"x\">&#215;</button></div><div class=\"dlg-b\">'\n        + '<div class=\"scale\">' + [1, 2, 3, 4, 5].map(function (n) { return '<button class=\"dot\" data-key=\"' + n + '\" data-g=\"' + n + '\" aria-pressed=\"' + (n === g ? 'true' : 'false') + '\">' + n + '</button>' }).join('') + '</div>'\n        + '<div class=\"vdesc\">' + (lab ? esc(lab[0]) + '\\n' + esc(lab[1]) : '') + '</div>'\n        + '<input class=\"vin\" placeholder=\"Comentarios (opcional)\" value=\"' + attr(d2.state.vcomment || '') + '\"/>'\n        + '<div class=\"vrow\">' + (d2.param('telemetry') ? '' : '<span class=\"tag\">telemetría desactivada — no se guarda</span>') + '<button class=\"send vsend\"' + (g ? '' : ' disabled') + '>Enviar</button></div>'\n        + '</div></div></div>'\n    }\n\n    return '<div class=\"app\" data-ready style=\"--acc:' + attr(d2.param('accent', '#FF6C0E')) + '\">'\n      + '<header class=\"hd\">'\n      + '<div class=\"brand\"><b>NASVI</b><span>Copiloto activo</span></div>'\n      + '<div class=\"chips\">' + ORIGENES.map(function (o) { return '<button class=\"chip\" data-o=\"' + o[0] + '\" aria-pressed=\"' + ((d2.state.origen || 'chat') === o[0] ? 'true' : 'false') + '\">' + o[1] + '</button>' }).join('') + '</div>'\n      + '<div class=\"spacer\"></div>'\n      + '<div class=\"mk\"><span>Mercado</span>' + selector + '</div>'\n      + '<div class=\"who\"><b>' + esc(ok ? (u.name || 'Asesor') : 'Vista previa') + '</b>' + esc(ok ? (u.email || '') : 'operador no identificado') + '</div>'\n      + '<button class=\"ico help\" title=\"Ayuda\">?</button>'\n      + '</header>'\n      + (ok ? '' : '<div class=\"pv\">Vista previa: la sesión actual no corresponde a un operador de Agents Tools, así que el mercado se elige a mano. En el app publicado el mercado sale de <b>countries</b> del usuario.</div>')\n      + '<div class=\"main\">'\n      + '<section class=\"left\">'\n      + '<div class=\"ask\"><label for=\"q\">¿Cuál es la pregunta del cliente?</label>'\n      + '<textarea class=\"q\" id=\"q\" placeholder=\"Escribí la duda tal como te la hizo la consultora…\"' + (bz ? ' disabled' : '') + '></textarea>'\n      + '<div class=\"ask-r\"><span class=\"hint\">Enter envía &middot; Shift+Enter salta línea</span>'\n      + ((ok && !isDemo(d2)) ? '' : '<button class=\"act try\">Probar con una consulta de ejemplo</button>')\n      + '<button class=\"send go\"' + (bz ? ' disabled' : '') + '>' + (bz ? 'Buscando…' : 'Enviar pregunta') + '</button></div></div>'\n      + (d2.state.err ? '<div class=\"err\">' + esc(d2.state.err) + '</div>' : '')\n      + '<div class=\"log\">' + conversa + '</div>'\n      + '</section>'\n      + '<aside class=\"right\"><h2>Fuentes</h2><div class=\"srcs\">' + fuentes + '</div></aside>'\n      + '</div>'\n      + '<footer class=\"ft\">'\n      + '<span>' + (d2.state.duracion ? (d2.state.duracion / 1000).toFixed(1) + ' s' : '--') + '</span>'\n      + '<span>' + hs.length + ' fuentes</span>'\n      + '<span>Mercado ' + esc(mk || '--') + '</span>'\n      + (isDemo(d2) ? '<span class=\"tag\">demo</span>' : '')\n      + (d2.param('telemetry') ? '' : '<span class=\"tag\">telemetría off</span>')\n      + '<button class=\"hist\">Historial</button>'\n      + '</footer>'\n      + overlay\n      + '</div>'\n  },\n\n  mounted(d2) {\n    const r = d2.data('regiones'); if (r) r.refresh()\n    const h = d2.data('historial'); if (h) h.refresh()\n\n    const demo = async function (q, t0) {\n      d2.setState({ busy: true, answer: '', hits: [] })\n      await new Promise(function (res) { setTimeout(res, 450) })\n      d2.setState({ hits: MOCK_FAQS })\n      let i = 0\n      await new Promise(function (done) {\n        const id = setInterval(function () {\n          i += 4\n          d2.state.answer = MOCK_ANSWER.slice(0, i)\n          if (i >= MOCK_ANSWER.length) { clearInterval(id); done() }\n        }, 16)\n        d2.onUnmount(function () { clearInterval(id) })\n      })\n      d2.setState({ busy: false, duracion: Date.now() - t0 })\n    }\n\n    const persist = async function (q) {\n      const u = user(d2)\n      const mk = market(d2, u)\n      const mon = d2.data('historial')\n      if (mon) await mon.create({\n        email: u.email, name: u.name, pergunta: q, resposta: answerText(d2),\n        country: mk, origen: d2.state.origen || 'chat',\n        duracion: d2.state.duracion, user_type: isEcom(u) ? 'ecommerce' : undefined\n      })\n      const ev = d2.data('eventos')\n      if (ev) await ev.create({ event: 'assistant_ask', email: u.email, nome: u.name, country: mk, payload: { article: (hits(d2)[0] || {}).article } })\n    }\n\n    const ask = async function () {\n      const el = d2.$('.q')\n      if (!el) return\n      const q = (el.value || '').trim()\n      if (!q) return\n      const t0 = Date.now()\n      el.value = ''\n      d2.setState({ pregunta: q, err: '', duracion: 0, grade: 0, vcomment: '' })\n      if (isDemo(d2)) { await demo(q, t0); return }\n      try {\n        const u = user(d2)\n        const ds = d2.data('faqs')\n        if (!ds) throw new Error('El parámetro \"faqs\" no está conectado a un dataset.')\n        const mk = market(d2, u)\n        if (!mk) throw new Error('No hay mercado seleccionado.')\n        ds.filter({ ecommerce: isEcom(u) ? true : { nin: [true] }, busca: q, country: mk })\n        await ds.refresh()\n        const rows = ds.records()\n        d2.setState({ hits: rows })\n        const a = bot(d2)\n        if (!a) throw new Error('El parámetro \"assistant\" no está conectado.')\n        await a.ask(PROMPT.replace('{q}', q), { context: JSON.stringify(rows) })\n        d2.state.duracion = Date.now() - t0\n        if (d2.param('telemetry')) await persist(q)\n      } catch (e) {\n        d2.state.err = 'No se pudo completar la búsqueda: ' + String((e && e.message) || e)\n      }\n    }\n\n    // Preview affordance: the builder preview has no operator session and no way to type,\n      // so this seeds a real query to exercise the live search end to end.\n      d2.on('.try', 'click', function () {\n      const el = d2.$('.q')\n      if (el) el.value = 'La consultora tiene apenas un punto y no se actualiza, ¿qué hago?'\n      ask()\n    })\n    d2.on('.go', 'click', ask)\n    d2.on('.q', 'keydown', function (e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); ask() } })\n    d2.on('.chip', 'click', function (e, el) { d2.state.origen = el.dataset.o })\n    d2.on('.sel', 'change', function (e, el) { d2.state.region = el.value })\n    d2.on('.help', 'click', function () { d2.state.panel = 'help' })\n    d2.on('.hist', 'click', function () { d2.state.panel = 'hist' })\n    d2.on('.vote', 'click', function () { d2.setState({ panel: 'vote', grade: 0, vcomment: '' }) })\n    d2.on('.x', 'click', function () { d2.state.panel = null })\n    d2.on('.scrim', 'click', function (e, el) { if (e.target === el) d2.state.panel = null })\n    d2.on('.hitem', 'click', function (e, el) { d2.state.hsel = el.dataset.h })\n    d2.on('.dot', 'click', function (e, el) { d2.state.grade = Number(el.dataset.g) })\n    d2.on('.vin', 'input', function (e, el) { d2.state.vcomment = el.value })\n    d2.on('.src-l', 'click', function (e, el) {\n      if (!d2.param('telemetry')) return\n      const ev = d2.data('eventos'); const u = user(d2)\n      if (ev) ev.create({ event: 'wiki_view', email: u.email, nome: u.name, country: market(d2, u), payload: { article: el.dataset.article } })\n    })\n    d2.on('.vsend', 'click', async function () {\n      const g = d2.state.grade\n      if (!g) return\n      if (d2.param('telemetry')) {\n        const u = user(d2); const mk = market(d2, u)\n        const payload = { message: d2.state.pregunta, answer: answerText(d2), grade: g, comment: d2.state.vcomment || '' }\n        const ev = d2.data('eventos')\n        if (ev) {\n          await ev.create({ event: 'voting', email: u.email, nome: u.name, country: mk, payload: payload })\n          if (g === 1) await ev.create({ event: 'answer_not_found', email: u.email, nome: u.name, country: mk, payload: payload })\n        }\n        const enc = d2.data('encuestas')\n        if (enc) await enc.create({ country: mk, email: u.email, reaction: g >= 4 ? 'like' : 'dislike', comments: d2.state.vcomment || '' })\n      }\n      d2.setState({ panel: null })\n    })\n    d2.on('.copy', 'click', function (e, el) {\n      const t = answerText(d2)\n      if (!t) return\n      try { navigator.clipboard.writeText(t) } catch (err) { }\n      el.textContent = 'Copiado'\n      setTimeout(function () { try { el.textContent = 'Copiar' } catch (e2) { } }, 1400)\n    })\n    d2.on(document, 'keydown', function (e) { if (e.key === 'Escape' && d2.state.panel) d2.state.panel = null })\n\n    // In demo mode the screen self-populates, so a fresh preview already shows the\n    // answered state (and the Votar action) without anyone having to type.\n    if (isDemo(d2) && !d2.state.pregunta) {\n      setTimeout(function () {\n        const el = d2.$('.q')\n        if (el && !d2.state.pregunta) {\n          el.value = 'La consultora tiene apenas un punto y no se actualiza, ¿qué hago?'\n          ask()\n        }\n      }, 250)\n    }\n  },\n\n  updated(d2) {\n    const log = d2.$('.log')\n    if (log) log.scrollTop = log.scrollHeight\n  }\n}\n"}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"telemetry":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"telemetry"}}}},"assistant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant"}}}},"faqs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"faqs"}}}},"usuarios":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"usuarios"}}}},"regiones":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"regiones"}}}},"historial":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"historial"}}}},"eventos":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eventos"}}}},"encuestas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"encuestas"}}}},"autenticacion":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autenticacion"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}}}}}}}},{"_id":"6a8c98562073c0d5a8cf739f","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"FaqOperadorV3","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// FaqOperadorV3 — NASVI copilot, hybrid retrieval over three corpora.\n//\n// Measured 24/08/2026, same session, same call shape:\n//   mx-beedoo-faqs   (373 rows) — vector index WORKS   (scores .73-.77, relevant)\n//   beedoo-faqs      (671 rows) — vector index BROKEN  (0 hits, sometimes 2 stale ones)\n//   faqs (curated) (1620 rows)  — vector index WORKS   (scores .75-.78, relevant)\n// All three have d2_embedding on 100% of rows (verified with an $exists control), so the\n// embeddings are fine and only the beedoo INDEX was never provisioned. Keyword search over\n// beedoo reaches all 671, so we run it alongside and let the ranking sort it out.\n//\n// beedoo-faqs is 100% country=AR, so PE/CO/CL/EC operators get nothing from it — the curated\n// `faqs` table is what carries their markets (PE 271, CO 259, CL 19, EC 8).\n//\n// MX runs on its own wiki corpus today. When the bases merge, turn `mxBaseSeparada` off and\n// MX falls back to the shared corpus with no code change.\n\nconst MOCK_USER = { name: 'Ana Gomez', email: 'ana.gomez@natura.net', countries: ['AR', 'MX'], user_type: ['Standard'], role: 'agent' }\nconst MOCK_REGIONS = ['AR', 'CL', 'CO', 'EC', 'MX', 'PE']\nconst MOCK_ROWS = [\n  { _id: 'm1', title: 'Reglas de crédito ELO', article: '10231', category: 'MODELO_COMERCIAL', origen: 'wiki', sv: 0, sk: 0.82, sf: 0, content: 'El límite de crédito se asigna según el historial de pagos de la consultora. Si el pedido excede el límite disponible, queda retenido hasta que se ajuste el puntaje o se regularicen pagos pendientes.' },\n  { _id: 'm2', title: 'PLAZOS DE ENTREGA DE PEDIDOS ELO', category: 'PEDIDOS', origen: 'faq', sv: 0, sk: 0, sf: 0.76, content: 'Los plazos de entrega se cuentan desde la facturación del pedido y varían por región y por tipo de ciclo.' },\n  { _id: 'm3', title: '2. Asignación de Límites', article: '10884', category: 'PEDIDOS', origen: 'wiki', sv: 0, sk: 0.71, sf: 0, content: 'La asignación de límites se revisa cada ciclo. Consultoras con historial positivo pueden solicitar ampliación a través de su Gerente de Negocio.' },\n  { _id: 'm4', title: '33. Crédito y Pagos', article: '11002', category: 'PEDIDOS', origen: 'wiki', sv: 0.61, sk: 0.55, sf: 0, content: 'Los pagos aplicados restablecen el límite de crédito en hasta 48 horas hábiles después de acreditados.' }\n]\nconst MOCK_HISTORY = [\n  { _id: 'h1', pergunta: '¿Cómo actualizo la dirección de una consultora?', resposta: 'Querido Asesor, ingresá en el panel de registro, sección *Datos personales*, y editá el campo Domicilio.', createdAt: Date.now() - 1080000 },\n  { _id: 'h2', pergunta: '¿Cuántos días demora un reembolso?', resposta: 'Estimado asesor, hasta **10 días hábiles** después de aprobada la solicitud.', createdAt: Date.now() - 5700000 }\n]\nconst MOCK_ANSWER = 'Querido Asesor,\\n\\nEl **límite de crédito** se asigna según el historial de pagos de la consultora.\\n\\nSi el pedido quedó retenido:\\n\\n1. Verificá el crédito disponible en el panel.\\n2. Ajustá el puntaje del pedido, **o** regularizá pagos pendientes.\\n3. El límite se restablece en hasta **48 horas hábiles** tras acreditarse el pago.\\n\\n> Para ampliación de límite, la consultora debe hablar con su Gerente de Negocio.'\n\nconst HELP_MD = 'Soy **NASVI**\\n\\nTu nuevo **copiloto virtual**, listo para acompañarte en cada contacto con nuestras consultoras.\\n\\nEstoy aquí para hacer tu trabajo **más ágil, más seguro y más claro**.\\n\\n¿Cómo lo hago? Muy fácil:\\n\\n- Estoy entrenado con los procesos, protocolos y wikis actualizados de Natura y Avon.\\n- Cuando tengas una duda, yo te doy la respuesta en segundos, sin detener tu atención.\\n- Además, te llevo directo a la fuente oficial en Beedoo, para que siempre tengas información validada.\\n\\nMi misión es que puedas resolver más consultas en el primer contacto, sin errores, y con total confianza.'\n\nconst VOTE = {\n  1: ['No encontré nada útil', 'Sin respuesta o sin relevancia para la consulta'],\n  2: ['Encontré muy poca información', 'Respuesta incompleta o poco relevante'],\n  3: ['Encontré parte de la información', 'Resolvió parcialmente, se requiere buscar más'],\n  4: ['Encontré casi todo lo que buscaba', 'Útil en gran parte, pero con pequeños vacíos'],\n  5: ['Encontré exactamente lo que necesitaba', 'Respuesta clara, completa y satisfactoria']\n}\nconst ORIGENES = [['chat', 'Chat'], ['voz', 'Voz'], ['video', 'Video']]\nconst BEEDOO = { MX: 'https://naturamexico.beedoo.io/wiki/' }\nconst BEEDOO_DEFAULT = 'https://naturalatam.beedoo.io/wiki/'\nconst PROMPT = 'Operador Pergunta :  \\n\\n\"{q}\"\\n\\nContesta en espanol'\nconst STOP = ['para', 'como', 'pero', 'este', 'esta', 'esto', 'esos', 'esas', 'tiene', 'tienen', 'hacer', 'puede', 'puedo', 'donde', 'cuando', 'cual', 'cuales', 'sobre', 'todos', 'todas', 'desde', 'hasta', 'entre', 'porque', 'tambien', 'solo', 'tener', 'hace', 'hago', 'debe', 'deben', 'sera', 'seran', 'consultora', 'consultor', 'asesor', 'natura', 'avon', 'favor', 'quiero', 'necesito', 'pregunta', 'cliente']\n\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\nfunction norm(s) { return String(s == null ? '' : s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '') }\nfunction settle(ms) { return new Promise(function (r) { setTimeout(r, ms) }) }\n\nconst FOLD = { a: '[aáàâä]', e: '[eéèêë]', i: '[iíìîï]', o: '[oóòôö]', u: '[uúùûü]', n: '[nñ]', c: '[cç]' }\nfunction rxOf(t) { let o = ''; for (let i = 0; i < t.length; i++) { o += FOLD[t[i]] || t[i] } return o }\n\nfunction termsOf(q) {\n  const raw = norm(q).replace(/[^a-z0-9\\s]/g, ' ').split(/\\s+/)\n  const seen = {}, out = []\n  for (let i = 0; i < raw.length; i++) {\n    const w = raw[i]\n    if (w.length < 4 || STOP.indexOf(w) >= 0 || seen[w]) continue\n    seen[w] = 1; out.push(w)\n    if (out.length >= 8) break\n  }\n  return out\n}\n\n// context is specific (30+ values) -> strong signal. category has only 7 values, one covering\n// 199 docs, so a hit there must stay cheap or it drowns the canonical document.\nfunction kwScore(doc, ts) {\n  if (!ts.length) return 0\n  const t = norm(doc.title), c = norm(doc.content)\n  const xc = norm(doc.context), xg = norm(doc.category)\n  let ht = 0, hc = 0, hxc = 0, hxg = 0\n  for (let i = 0; i < ts.length; i++) {\n    if (t.indexOf(ts[i]) >= 0) ht++\n    if (xc.indexOf(ts[i]) >= 0) hxc++\n    if (xg.indexOf(ts[i]) >= 0) hxg++\n    if (c.indexOf(ts[i]) >= 0) hc++\n  }\n  return Math.min(1, (ht * 3 + hxc * 3 + hxg + hc) / (ts.length * 6))\n}\n\nfunction excerptOf(content, ts, max) {\n  const c = String(content || '')\n  if (c.length <= max) return c\n  const n = norm(c)\n  let pos = -1\n  for (let i = 0; i < ts.length; i++) { const p = n.indexOf(ts[i]); if (p >= 0 && (pos < 0 || p < pos)) pos = p }\n  if (pos < 0) return c.slice(0, max) + '…'\n  const start = Math.max(0, pos - Math.floor(max * 0.3))\n  const end = Math.min(c.length, start + max)\n  return (start > 0 ? '…' : '') + c.slice(start, end) + (end < c.length ? '…' : '')\n}\n\nfunction authOf(d2) { try { return d2.auth(d2.params.autenticacion) } catch (e) { return null } }\nfunction user(d2) {\n  if (isDemo(d2)) return MOCK_USER\n  const a = authOf(d2)\n  const em = (a && a.user && a.user.email) || ''\n  if (!em) return {}\n  const ds = d2.data('usuarios')\n  const rows = ds ? ds.records() : []\n  return rows.filter(function (r) { return r.email === em })[0] || { email: em }\n}\nfunction known(d2) { if (isDemo(d2)) return true; return (user(d2).countries || []).length > 0 }\nfunction isEcom(u) { return [].concat(u.user_type || []).indexOf('E-commerce') >= 0 }\nfunction solo(u) { return (u.countries || []).length === 1 }\nfunction regionRows(d2) { const ds = d2.data('regiones'); return ds ? ds.records() : [] }\nfunction regionCodes(d2) {\n  if (isDemo(d2)) return MOCK_REGIONS\n  return regionRows(d2).map(function (r) { return r.country_code }).filter(Boolean).sort()\n}\nfunction regionIdOf(d2, code) {\n  const r = regionRows(d2).filter(function (x) { return x.country_code === code })[0]\n  return r ? r._id : null\n}\nfunction marketOptions(d2, u) { if (!known(d2)) return regionCodes(d2); return isEcom(u) ? regionCodes(d2) : (u.countries || []) }\nfunction showSelector(d2, u) { return !known(d2) || isEcom(u) || !solo(u) }\nfunction market(d2, u) {\n  if (known(d2) && !isEcom(u) && solo(u)) return u.countries[0]\n  return d2.state.region || marketOptions(d2, u)[0] || ''\n}\nfunction bot(d2) { try { return d2.assistant(d2.params.assistant) } catch (e) { return null } }\nfunction answerText(d2) { if (isDemo(d2)) return d2.state.answer || ''; const a = bot(d2); return (a && a.answer) || '' }\nfunction busy(d2) { if (isDemo(d2)) return !!d2.state.busy; const a = bot(d2); return !!(a && a.busy) }\nfunction history(d2) { if (isDemo(d2)) return MOCK_HISTORY; const ds = d2.data('historial'); return ds ? ds.records() : [] }\nfunction beedooUrl(mk, article) { return (BEEDOO[mk] || BEEDOO_DEFAULT) + String(article || '') + '/lll' }\n\n// MX still runs on its own wiki corpus. Flip `mxBaseSeparada` off when the bases merge.\nfunction usaBaseMx(d2, mk) {\n  return mk === 'MX' && d2.param('mxBaseSeparada', true) !== false && !!d2.data('faqsMx')\n}\n\nfunction curadaToRow(r) {\n  const cat = (r.categoria_lookup && r.categoria_lookup.es_title) ? r.categoria_lookup.es_title\n    : (Array.isArray(r.categoria) ? r.categoria.join(', ') : (r.categoria || ''))\n  return {\n    _id: r._id, origen: 'faq',\n    title: r.title || r.label || '(sin título)',\n    content: r.answer || r.description || '',\n    context: r.context || '', category: cat, article: null,\n    sv: 0, sk: 0, sf: typeof r.d2_search_score === 'number' ? r.d2_search_score : 0.5\n  }\n}\n\nasync function retrieve(d2, q, mk, ecom) {\n  const ts = termsOf(q)\n  const mxMode = usaBaseMx(d2, mk)\n  const diag = { terms: ts, corpus: mxMode ? 'MX' : 'compartido', wikiVec: 0, wikiTxt: 0, faqVec: 0, chars: 0 }\n  const byId = {}\n\n  const wikiH = mxMode ? d2.data('faqsMx') : d2.data('faqs')\n  const w = wikiH && wikiH.raw\n\n  // ---- wiki corpus ----------------------------------------------------------\n  if (w) {\n    // the MX table has no country/ecommerce/context/category columns\n    const baseVec = mxMode ? {} : (function () { const b = { ecommerce: ecom ? true : { nin: [true] } }; if (mk) b.country = mk; return b })()\n    const scopeKw = mxMode ? {} : (function () { const b = { ecommerce: ecom ? true : { $nin: [true] } }; if (mk) b.country = mk; return b })()\n\n    try {\n      w.filter(baseVec)\n      await settle(350)\n      const vres = await w.semanticSearch({ query: q, options: { score: true, limit: 15 } })\n      const vrows = (vres && vres.data) || []\n      diag.wikiVec = vrows.length\n      for (let i = 0; i < vrows.length; i++) {\n        const r = vrows[i]\n        byId[r._id] = { _id: r._id, origen: 'wiki', title: r.title, content: r.content, article: r.article, category: r.category || '', context: r.context || '', sv: typeof r.d2_search_score === 'number' ? r.d2_search_score : 0.5, sk: 0, sf: 0 }\n      }\n    } catch (e) { diag.wikiVecError = String((e && e.message) || e) }\n\n    if (ts.length) {\n      // `find` has NO relevance ordering, so one $or capped at N buries the canonical title\n      // match behind hundreds of incidental content matches. Two passes, separate budgets.\n      const orsHi = [], orsLo = []\n      for (let i = 0; i < ts.length; i++) {\n        const rx = rxOf(ts[i])\n        orsHi.push({ title: { $regex: rx, $options: 'i' } })\n        if (!mxMode) orsHi.push({ context: { $regex: rx, $options: 'i' } })\n        orsLo.push({ content: { $regex: rx, $options: 'i' } })\n        if (!mxMode) orsLo.push({ category: { $regex: rx, $options: 'i' } })\n      }\n      try {\n        w.filter({})\n        await settle(200)\n        const qHi = Object.assign({ $or: orsHi, $limit: 60 }, scopeKw)\n        const qLo = Object.assign({ $or: orsLo, $limit: 60 }, scopeKw)\n        const pair = await Promise.all([w.find(qHi), w.find(qLo)])\n        const hi = (pair[0] && (pair[0].data || pair[0])) || []\n        const lo = (pair[1] && (pair[1].data || pair[1])) || []\n        diag.wikiTxt = ((pair[0] && pair[0].total) || hi.length) + ((pair[1] && pair[1].total) || lo.length)\n        const rows = hi.concat(lo)\n        for (let i = 0; i < rows.length; i++) {\n          const r = rows[i]\n          const s = kwScore(r, ts)\n          if (byId[r._id]) byId[r._id].sk = s\n          else byId[r._id] = { _id: r._id, origen: 'wiki', title: r.title, content: r.content, article: r.article, category: r.category || '', context: r.context || '', sv: 0, sk: s, sf: 0 }\n        }\n      } catch (e) { diag.wikiTxtError = String((e && e.message) || e) }\n    }\n  } else { diag.wikiError = 'corpus de wikis no conectado' }\n\n  // ---- curated FAQ corpus (working vector index, covers every market) --------\n  const curH = d2.data('faqsCuradas')\n  const c = curH && curH.raw\n  if (c) {\n    try {\n      const rid = regionIdOf(d2, mk)\n      c.filter(rid ? { region: rid } : {})\n      await settle(350)\n      const fres = await c.semanticSearch({ query: q, options: { score: true, limit: 10 } })\n      const frows = (fres && fres.data) || []\n      diag.faqVec = frows.length\n      for (let i = 0; i < frows.length; i++) {\n        const row = curadaToRow(frows[i])\n        if (byId[row._id]) byId[row._id].sf = row.sf\n        else byId[row._id] = row\n      }\n    } catch (e) { diag.faqError = String((e && e.message) || e) }\n  }\n\n  // A degraded index must not dominate. A healthy vector leg fills its limit; when it returns\n  // almost nothing its few hits are stale residue, so down-weight them instead of letting\n  // their high cosine scores outrank good keyword matches. Goes back to 1 once reindexed.\n  const trusted = diag.wikiVec >= 5\n  diag.wikiVecTrusted = trusted\n  const W = trusted ? 1 : 0.35\n  const all = Object.keys(byId).map(function (k) {\n    const r = byId[k]\n    r.score = Math.max(r.sv * W, r.sk, r.sf)\n    return r\n  })\n  all.sort(function (a, b) { return b.score - a.score })\n  const top = all.slice(0, Math.max(1, d2.param('maxFuentes', 6)))\n  return { rows: top, all: all.length, diag: diag, ts: ts }\n}\n\nfunction metodo(r) {\n  if (r.sf > 0) return ['faq', 'FAQ semántica']\n  if (r.sv > 0 && r.sk > 0) return ['b', 'Wiki · ambas']\n  if (r.sv > 0) return ['v', 'Wiki · semántica']\n  return ['t', 'Wiki · texto']\n}\n\nfunction card(r, i, mk) {\n  const sc = ((typeof r.score === 'number' ? r.score : Math.max(r.sv, r.sk, r.sf)) * 10).toFixed(1)\n  const m = metodo(r)\n  return '<article class=\"src\" data-key=\"' + attr(r._id || i) + '\">'\n    + '<header class=\"src-h\"><h3 class=\"src-t\">' + esc(r.title) + '</h3><span class=\"src-s\">' + esc(sc) + '</span></header>'\n    + '<div class=\"src-m\"><span class=\"src-p src-p-' + m[0] + '\">' + esc(m[1]) + '</span>'\n    + (r.category ? '<span class=\"src-c\">' + esc(r.category) + '</span>' : '') + '</div>'\n    + '<p class=\"src-b\">' + esc(r.content) + '</p>'\n    + (r.article ? '<a class=\"src-l\" href=\"' + attr(beedooUrl(mk, r.article)) + '\" target=\"_blank\" rel=\"noopener\" data-article=\"' + attr(r.article) + '\">contenido en Beedoo</a>' : '')\n    + '</article>'\n}\n\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '.app{--cream:rgb(254,251,244);--ink:#162b37;--ink2:rgba(22,43,55,.62);--line:#e3ddd2;--olive:rgb(230,238,189);--ok:rgb(125,230,28);--off:rgb(200,46,0);--accent:var(--acc,#FF6C0E);display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.55 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;position:relative;overflow:hidden}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:18px;padding:14px 22px;border-bottom:1px solid var(--line);background:#fff}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}'\n    + '.brand b{font-size:22px;font-weight:700;letter-spacing:.5px}'\n    + '.brand span{font-size:12px;color:var(--ink2)}'\n    + '.chips{display:flex;gap:6px;flex:none}'\n    + '.chip{flex:none;border:0;border-radius:16px;padding:6px 14px;font:600 12px/1 inherit;color:#fff;background:var(--off);cursor:pointer;opacity:.5}'\n    + '.chip[aria-pressed=\"true\"]{background:var(--ok);color:var(--ink);opacity:1}'\n    + '.spacer{flex:1 1 auto;min-width:8px}'\n    + '.mk{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--ink2);flex:none}'\n    + '.mk select{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}'\n    + '.lock{flex:none;border:1px solid var(--line);border-radius:7px;padding:5px 10px;font-weight:700;background:#faf6ef}'\n    + '.who{font-size:12px;color:var(--ink2);text-align:right;line-height:1.3;flex:none}'\n    + '.who b{display:block;color:var(--ink);font-size:13px}'\n    + '.ico{flex:none;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;font:700 15px/1 inherit;display:grid;place-items:center}'\n    + '.ico:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.pv{flex:none;background:#fff6e6;border-bottom:1px solid #f0dcb4;color:#7a5a12;font-size:12px;padding:7px 22px}'\n    + '.warn{flex:none;background:#fdf0f0;border-bottom:1px solid #f3cccc;color:#8c2f2f;font-size:12px;padding:7px 22px;display:flex;gap:8px;align-items:baseline}'\n    + '.warn b{font-weight:700}'\n    + '.main{flex:1 1 auto;display:grid;grid-template-columns:minmax(0,1fr) clamp(300px,32%,392px);min-height:0}'\n    + '.left{display:flex;flex-direction:column;min-height:0;padding:20px 22px;gap:14px}'\n    + '.ask label{display:block;font-weight:600;margin-bottom:6px}'\n    + '.q{width:100%;height:96px;resize:none;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);font:inherit}'\n    + '.q:focus{outline:2px solid var(--accent);outline-offset:-1px}'\n    + '.ask-r{display:flex;align-items:center;gap:12px;margin-top:8px}'\n    + '.hint{font-size:12px;color:var(--ink2)}'\n    + '.send{flex:none;margin-left:auto;border:0;border-radius:8px;padding:10px 22px;background:var(--ink);color:#fff;font:600 14px/1 inherit;cursor:pointer}'\n    + '.send:disabled{opacity:.4;cursor:default}'\n    + '.log{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px}'\n    + '.you{align-self:flex-end;max-width:82%;background:#fff;border:1px solid var(--line);border-radius:12px 12px 2px 12px;padding:10px 14px}'\n    + '.bot{display:flex;gap:10px;max-width:94%}'\n    + '.av{width:34px;height:34px;flex:none;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center;font:700 13px/1 inherit}'\n    + '.bub{background:var(--olive);border-radius:2px 16px 16px 16px;padding:12px 16px;min-width:0}'\n    + '.bub p{margin:0 0 8px}.bub p:last-child{margin:0}.bub ul,.bub ol{margin:6px 0;padding-left:20px}'\n    + '.bub h1,.bub h2,.bub h3{font-size:15px;margin:8px 0 4px}.bub code{background:rgba(0,0,0,.07);padding:1px 5px;border-radius:4px}'\n    + '.bub blockquote{margin:8px 0;padding-left:10px;border-left:3px solid rgba(22,43,55,.25);color:var(--ink2)}'\n    + '.cur{display:inline-block;width:7px;height:15px;background:var(--ink);vertical-align:-2px;animation:bl .9s steps(2) infinite}'\n    + '@keyframes bl{50%{opacity:0}}'\n    + '.acts{display:flex;gap:8px;margin-top:10px}'\n    + '.act{border:1px solid rgba(22,43,55,.22);background:rgba(255,255,255,.6);border-radius:7px;padding:5px 11px;font:600 12px/1.4 inherit;color:var(--ink);cursor:pointer}'\n    + '.act:hover{border-color:var(--ink)}'\n    + '.empty{margin:auto;text-align:center;color:var(--ink2);max-width:320px;font-size:13px}'\n    + '.empty b{display:block;margin-bottom:8px;opacity:.3}.empty svg{width:34px;height:34px;stroke:currentColor;fill:none;stroke-width:1.6}'\n    + '.err{background:#fff0ef;border:1px solid rgba(255,60,51,.45);color:#b3261e;border-radius:9px;padding:9px 12px;font-size:13px}'\n    + '.right{border-left:1px solid var(--line);background:#fffdf9;display:flex;flex-direction:column;min-height:0}'\n    + '.rh{display:flex;align-items:baseline;gap:8px;padding:16px 18px 8px}'\n    + '.rh h2{margin:0;font-size:11px;letter-spacing:1.3px;text-transform:uppercase;color:var(--ink2)}'\n    + '.rh span{font-size:11px;color:var(--ink2);margin-left:auto}'\n    + '.srcs{flex:1;min-height:0;overflow:auto;padding:0 16px 16px;display:flex;flex-direction:column;gap:10px}'\n    + '.src{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px}'\n    + '.src-h{display:flex;gap:10px;align-items:flex-start}'\n    + '.src-t{flex:1;margin:0;font-size:13.5px;font-weight:700;line-height:1.35}'\n    + '.src-s{font-size:19px;font-weight:700;color:var(--accent);line-height:1;flex:none}'\n    + '.src-m{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap}'\n    + '.src-p{font-size:10px;letter-spacing:.5px;border-radius:5px;padding:2px 7px;font-weight:700}'\n    + '.src-p-v{background:#e6eebd;color:#4a5a17}.src-p-t{background:#dde9f5;color:#1e4a70}.src-p-b{background:#f6e2cd;color:#8a4a10}.src-p-faq{background:#e7dcf5;color:#4b2a78}'\n    + '.src-c{font-size:10px;letter-spacing:.6px;background:#f2ede4;border-radius:5px;padding:2px 7px;color:var(--ink2)}'\n    + '.src-b{margin:8px 0 0;font-size:12.5px;color:var(--ink2);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}'\n    + '.src-l{display:inline-block;margin-top:9px;font-size:12px;font-weight:600;color:var(--accent);text-decoration:underline}'\n    + '.ft{flex:none;display:flex;align-items:center;gap:16px;padding:10px 22px;border-top:1px solid var(--line);background:#fff;font-size:12px;color:var(--ink2)}'\n    + '.hist{flex:none;margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 14px;font:600 12px/1 inherit;color:var(--ink);cursor:pointer}'\n    + '.hist:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.scrim{position:absolute;inset:0;background:rgba(0,0,0,.44);backdrop-filter:blur(2px);display:grid;place-items:center;z-index:9}'\n    + '.dlg{background:var(--cream);border-radius:20px;box-shadow:0 18px 50px rgba(0,0,0,.28);position:relative;max-width:92%;max-height:88%;display:flex;flex-direction:column}'\n    + '.dlg-h{display:flex;align-items:center;padding:22px 24px 12px}'\n    + '.dlg-h h2{margin:0;font-size:21px;font-weight:700}'\n    + '.x{margin-left:auto;border:0;background:transparent;font:700 20px/1 inherit;color:var(--ink);cursor:pointer;padding:2px 6px}'\n    + '.dlg-b{padding:0 24px 24px;overflow:auto;min-height:0}'\n    + '.w-help{width:660px}'\n    + '.w-hist{width:1000px;height:78%;display:grid;grid-template-columns:290px 1fr;grid-template-rows:auto minmax(0,1fr);gap:14px 18px;padding:0 24px 24px;overflow:hidden}'\n    + '.hlist{overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px}'\n    + '.hitem{display:block;width:100%;text-align:left;border:0;border-bottom:1px solid var(--line);background:transparent;padding:11px 13px;cursor:pointer;font:inherit;color:var(--ink)}'\n    + '.hitem:hover{background:#faf6ef}.hitem[aria-selected=\"true\"]{background:var(--olive)}'\n    + '.hitem b{display:block;font-size:12.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.hitem span{font-size:11px;color:var(--ink2)}'\n    + '.hdet{overflow:auto;padding-right:6px;display:flex;flex-direction:column;gap:12px}'\n    + '.w-vote{width:700px}'\n    + '.scale{display:flex;gap:11px;margin:4px 0 12px}'\n    + '.dot{flex:none;width:42px;height:42px;padding:0;border-radius:50%;border:1px solid rgba(22,43,55,.35);background:#fff;color:var(--ink);font:700 17px/1 inherit;cursor:pointer}'\n    + '.dot[aria-pressed=\"true\"]{background:var(--ink);color:#fff}'\n    + '.vdesc{min-height:38px;font-size:13px;color:var(--ink2);white-space:pre-line}'\n    + '.vin{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;font:inherit;background:#fff;color:var(--ink)}'\n    + '.vrow{display:flex;align-items:center;gap:12px;margin-top:14px}'\n    + '.tag{font-size:11px;border:1px dashed rgba(22,43,55,.35);border-radius:6px;padding:2px 7px;color:var(--ink2)}'\n    + '@media (max-width:900px){'\n    + '.hd{gap:12px;padding:12px 16px}.who{display:none}.brand b{font-size:19px}'\n    + '.left{padding:16px;flex:1 1 auto;min-height:0}'\n    + '.main{display:flex;flex-direction:column}'\n    + '.right{flex:0 0 auto;border-left:0;border-top:1px solid var(--line);max-height:42%}'\n    + '.w-hist{width:96vw;grid-template-columns:1fr;grid-template-rows:auto auto minmax(0,1fr)}'\n    + '.w-help,.w-vote{width:94vw}.ft{gap:10px;padding:8px 16px}'\n    + '}',\n\n  render(d2) {\n    const u = user(d2)\n    const mk = market(d2, u)\n    const opts = marketOptions(d2, u)\n    const rows = d2.state.rows || []\n    const dg = d2.state.diag || null\n    const ans = answerText(d2)\n    const bz = busy(d2)\n    const ok = known(d2)\n    const marked = d2.lib('marked@12.0.0')\n    const md = function (t) {\n      if (!t) return ''\n      if (!marked) return '<p>' + esc(t).replace(/\\n/g, '<br>') + '</p>'\n      try { return marked.parse(t) } catch (e) { return '<p>' + esc(t) + '</p>' }\n    }\n\n    const selector = showSelector(d2, u)\n      ? '<select class=\"sel\">' + opts.map(function (c) { return '<option value=\"' + attr(c) + '\"' + (c === mk ? ' selected' : '') + '>' + esc(c) + '</option>' }).join('') + '</select>'\n      : '<span class=\"lock\" title=\"Tu usuario está asignado a un solo mercado\">' + esc(mk || '--') + '</span>'\n\n    const conversa = (!d2.state.pregunta && !ans)\n      ? '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\"><path d=\"M21 12a8 8 0 0 1-8 8H7l-4 3v-5a8 8 0 0 1 8-11h2a8 8 0 0 1 8 5z\" stroke-linejoin=\"round\"/></svg></b>Escribí la duda del cliente y NASVI busca en las wikis por vos.</div>'\n      : (d2.state.pregunta ? '<div class=\"you\">' + esc(d2.state.pregunta) + '</div>' : '')\n        + ((ans || bz)\n          ? '<div class=\"bot\"><div class=\"av\">N</div><div><div class=\"bub\">' + md(ans) + (bz ? '<span class=\"cur\"></span>' : '') + '</div>'\n            + (!bz && ans ? '<div class=\"acts\"><button class=\"act copy\">Copiar</button><button class=\"act vote\">Votar</button></div>' : '')\n            + '</div></div>'\n          : '')\n\n    const fuentes = rows.length\n      ? rows.map(function (r, i) { return card(r, i, mk) }).join('')\n      : '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\"><path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" stroke-linejoin=\"round\"/><path d=\"M14 3v5h5M9 13h6M9 17h4\" stroke-linecap=\"round\"/></svg></b>Realizá tu consulta para ver las wikis relacionadas aquí.</div>'\n\n    // Surface the broken index instead of hiding it behind a plausible answer.\n    const degraded = dg && dg.wikiVec <= 2 && (dg.wikiTxt || 0) > dg.wikiVec\n    const warn = degraded\n      ? '<div class=\"warn\"><b>Índice semántico de wikis degradado.</b><span>La búsqueda vectorial devolvió ' + dg.wikiVec + ' documento(s) y la de texto encontró ' + dg.wikiTxt + '. Se responde con el resultado combinado' + (dg.faqVec ? ' más ' + dg.faqVec + ' FAQ curadas' : '') + '.</span></div>'\n      : ''\n\n    let overlay = ''\n    if (d2.state.panel === 'help') {\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-help\"><div class=\"dlg-h\"><h2>NASVI: El Agente del Agente</h2><button class=\"x\">&#215;</button></div><div class=\"dlg-b bub\" style=\"background:transparent\">' + md(HELP_MD) + '</div></div></div>'\n    } else if (d2.state.panel === 'hist') {\n      const hs = history(d2)\n      const sel = d2.state.hsel || (hs[0] && String(hs[0]._id || 0))\n      const cur = hs.filter(function (r, i) { return String(r._id || i) === String(sel) })[0] || hs[0]\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-hist\"><div class=\"dlg-h\" style=\"grid-column:1/-1;padding:20px 0 0\"><h2>Historial</h2><button class=\"x\">&#215;</button></div>'\n        + '<div class=\"hlist\">' + (hs.length ? hs.map(function (r, i) {\n          const id = String(r._id || i)\n          return '<button class=\"hitem\" data-key=\"' + attr(id) + '\" data-h=\"' + attr(id) + '\" aria-selected=\"' + (id === String(sel) ? 'true' : 'false') + '\"><b>' + esc(r.pergunta) + '</b><span>' + esc(rel(r.createdAt)) + '</span></button>'\n        }).join('') : '<div class=\"empty\" style=\"padding:20px\">Sin consultas todavía.</div>') + '</div>'\n        + '<div class=\"hdet\">' + (cur ? '<div class=\"you\" style=\"align-self:flex-start;max-width:100%\">' + esc(cur.pergunta) + '</div><div class=\"bot\"><div class=\"av\">N</div><div class=\"bub\">' + md(cur.resposta) + '</div></div>' : '') + '</div></div></div>'\n    } else if (d2.state.panel === 'vote') {\n      const g = d2.state.grade || 0\n      const lab = VOTE[g]\n      overlay = '<div class=\"scrim\" data-close><div class=\"dlg w-vote\"><div class=\"dlg-h\"><h2>¿Qué tan útil fue la respuesta?</h2><button class=\"x\">&#215;</button></div><div class=\"dlg-b\">'\n        + '<div class=\"scale\">' + [1, 2, 3, 4, 5].map(function (n) { return '<button class=\"dot\" data-key=\"' + n + '\" data-g=\"' + n + '\" aria-pressed=\"' + (n === g ? 'true' : 'false') + '\">' + n + '</button>' }).join('') + '</div>'\n        + '<div class=\"vdesc\">' + (lab ? esc(lab[0]) + '\\n' + esc(lab[1]) : '') + '</div>'\n        + '<input class=\"vin\" placeholder=\"Comentarios (opcional)\" value=\"' + attr(d2.state.vcomment || '') + '\"/>'\n        + '<div class=\"vrow\">' + (d2.param('telemetry') ? '' : '<span class=\"tag\">telemetría desactivada — no se guarda</span>') + '<button class=\"send vsend\"' + (g ? '' : ' disabled') + '>Enviar</button></div>'\n        + '</div></div></div>'\n    }\n\n    return '<div class=\"app\" data-ready style=\"--acc:' + attr(d2.param('accent', '#FF6C0E')) + '\">'\n      + '<header class=\"hd\">'\n      + '<div class=\"brand\"><b>NASVI</b><span>Copiloto activo</span></div>'\n      + '<div class=\"chips\">' + ORIGENES.map(function (o) { return '<button class=\"chip\" data-o=\"' + o[0] + '\" aria-pressed=\"' + ((d2.state.origen || 'chat') === o[0] ? 'true' : 'false') + '\">' + o[1] + '</button>' }).join('') + '</div>'\n      + '<div class=\"spacer\"></div>'\n      + '<div class=\"mk\"><span>Mercado</span>' + selector + '</div>'\n      + '<div class=\"who\"><b>' + esc(ok ? (u.name || 'Asesor') : 'Vista previa') + '</b>' + esc(ok ? (u.email || '') : 'operador no identificado') + '</div>'\n      + '<button class=\"ico help\" title=\"Ayuda\">?</button>'\n      + '</header>'\n      + (ok ? '' : '<div class=\"pv\">Vista previa: la sesión actual no corresponde a un operador de Agents Tools, así que el mercado se elige a mano.</div>')\n      + warn\n      + '<div class=\"main\">'\n      + '<section class=\"left\">'\n      + '<div class=\"ask\"><label for=\"q\">¿Cuál es la pregunta del cliente?</label>'\n      + '<textarea class=\"q\" id=\"q\" placeholder=\"Escribí la duda tal como te la hizo la consultora…\"' + (bz ? ' disabled' : '') + '></textarea>'\n      + '<div class=\"ask-r\"><span class=\"hint\">Enter envía &middot; Shift+Enter salta línea</span>'\n      + ((ok && !isDemo(d2)) ? '' : '<button class=\"act try\">Probar con una consulta de ejemplo</button>')\n      + '<button class=\"send go\"' + (bz ? ' disabled' : '') + '>' + (bz ? 'Buscando…' : 'Enviar pregunta') + '</button></div></div>'\n      + (d2.state.err ? '<div class=\"err\">' + esc(d2.state.err) + '</div>' : '')\n      + '<div class=\"log\">' + conversa + '</div>'\n      + '</section>'\n      + '<aside class=\"right\"><div class=\"rh\"><h2>Fuentes</h2>' + (dg ? '<span>corpus ' + esc(dg.corpus) + '</span>' : '') + '</div><div class=\"srcs\">' + fuentes + '</div></aside>'\n      + '</div>'\n      + '<footer class=\"ft\">'\n      + '<span>' + (d2.state.duracion ? (d2.state.duracion / 1000).toFixed(1) + ' s' : '--') + '</span>'\n      + '<span>' + rows.length + ' fuentes' + (dg ? ' de ' + (d2.state.total || rows.length) : '') + '</span>'\n      + (dg ? '<span>wiki ' + dg.wikiVec + '/' + dg.wikiTxt + ' · faq ' + dg.faqVec + '</span>' : '')\n      + (dg && dg.chars ? '<span>' + Math.round(dg.chars / 1000) + 'k car. al prompt</span>' : '')\n      + '<span>Mercado ' + esc(mk || '--') + '</span>'\n      + (isDemo(d2) ? '<span class=\"tag\">demo</span>' : '')\n      + (d2.param('telemetry') ? '' : '<span class=\"tag\">telemetría off</span>')\n      + '<button class=\"hist\">Historial</button>'\n      + '</footer>'\n      + overlay\n      + '</div>'\n  },\n\n  mounted(d2) {\n    const r0 = d2.data('regiones'); if (r0) r0.refresh()\n    const h0 = d2.data('historial'); if (h0) h0.refresh()\n\n    const demo = async function (q, t0) {\n      d2.setState({ busy: true, answer: '', rows: [], diag: null })\n      await settle(400)\n      d2.setState({ rows: MOCK_ROWS.map(function (r) { r.score = Math.max(r.sv, r.sk, r.sf); return r }), total: MOCK_ROWS.length, diag: { terms: termsOf(q), corpus: 'compartido', wikiVec: 1, wikiTxt: 23, faqVec: 4, chars: 4200 } })\n      let i = 0\n      await new Promise(function (done) {\n        const id = setInterval(function () {\n          i += 4\n          d2.state.answer = MOCK_ANSWER.slice(0, i)\n          if (i >= MOCK_ANSWER.length) { clearInterval(id); done() }\n        }, 16)\n        d2.onUnmount(function () { clearInterval(id) })\n      })\n      d2.setState({ busy: false, duracion: Date.now() - t0 })\n    }\n\n    const persist = async function (q) {\n      const u = user(d2), mk = market(d2, u)\n      const mon = d2.data('historial')\n      if (mon) await mon.create({ email: u.email, name: u.name, pergunta: q, resposta: answerText(d2), country: mk, origen: d2.state.origen || 'chat', duracion: d2.state.duracion, user_type: isEcom(u) ? 'ecommerce' : undefined })\n      const ev = d2.data('eventos')\n      if (ev) await ev.create({ event: 'assistant_ask', email: u.email, nome: u.name, country: mk, payload: { article: (d2.state.rows && d2.state.rows[0] || {}).article } })\n    }\n\n    const ask = async function () {\n      const el = d2.$('.q'); if (!el) return\n      const q = (el.value || '').trim(); if (!q) return\n      const t0 = Date.now()\n      el.value = ''\n      d2.setState({ pregunta: q, err: '', duracion: 0, grade: 0, vcomment: '', rows: [], diag: null })\n      if (isDemo(d2)) { await demo(q, t0); return }\n      try {\n        const u = user(d2), mk = market(d2, u)\n        if (!mk) throw new Error('No hay mercado seleccionado.')\n        const out = await retrieve(d2, q, mk, isEcom(u))\n        const maxC = d2.param('maxCaracteres', 1200)\n        const ctx = out.rows.map(function (r) {\n          return { fuente: r.origen === 'faq' ? 'FAQ' : 'Wiki', title: r.title, categoria: r.category, articulo: r.article, contenido: excerptOf(r.content, out.ts, maxC) }\n        })\n        const payload = JSON.stringify(ctx)\n        out.diag.chars = payload.length\n        d2.setState({ rows: out.rows, total: out.all, diag: out.diag })\n        const a = bot(d2)\n        if (!a) throw new Error('El parámetro \"assistant\" no está conectado.')\n        await a.ask(PROMPT.replace('{q}', q), { context: payload })\n        d2.state.duracion = Date.now() - t0\n        if (d2.param('telemetry')) await persist(q)\n      } catch (e) {\n        d2.state.err = 'No se pudo completar la búsqueda: ' + String((e && e.message) || e)\n      }\n    }\n\n    d2.on('.try', 'click', function () {\n      const el = d2.$('.q')\n      if (el) el.value = '¿Por qué el pedido quedó retenido por límite de crédito?'\n      ask()\n    })\n    d2.on('.go', 'click', ask)\n    d2.on('.q', 'keydown', function (e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); ask() } })\n    d2.on('.chip', 'click', function (e, el) { d2.state.origen = el.dataset.o })\n    d2.on('.sel', 'change', function (e, el) { d2.state.region = el.value })\n    d2.on('.help', 'click', function () { d2.state.panel = 'help' })\n    d2.on('.hist', 'click', function () { d2.state.panel = 'hist' })\n    d2.on('.vote', 'click', function () { d2.setState({ panel: 'vote', grade: 0, vcomment: '' }) })\n    d2.on('.x', 'click', function () { d2.state.panel = null })\n    d2.on('.scrim', 'click', function (e, el) { if (e.target === el) d2.state.panel = null })\n    d2.on('.hitem', 'click', function (e, el) { d2.state.hsel = el.dataset.h })\n    d2.on('.dot', 'click', function (e, el) { d2.state.grade = Number(el.dataset.g) })\n    d2.on('.vin', 'input', function (e, el) { d2.state.vcomment = el.value })\n    d2.on('.src-l', 'click', function (e, el) {\n      if (!d2.param('telemetry')) return\n      const ev = d2.data('eventos'), u = user(d2)\n      if (ev) ev.create({ event: 'wiki_view', email: u.email, nome: u.name, country: market(d2, u), payload: { article: el.dataset.article } })\n    })\n    d2.on('.vsend', 'click', async function () {\n      const g = d2.state.grade; if (!g) return\n      if (d2.param('telemetry')) {\n        const u = user(d2), mk = market(d2, u)\n        const payload = { message: d2.state.pregunta, answer: answerText(d2), grade: g, comment: d2.state.vcomment || '' }\n        const ev = d2.data('eventos')\n        if (ev) {\n          await ev.create({ event: 'voting', email: u.email, nome: u.name, country: mk, payload: payload })\n          if (g === 1) await ev.create({ event: 'answer_not_found', email: u.email, nome: u.name, country: mk, payload: payload })\n        }\n        const enc = d2.data('encuestas')\n        if (enc) await enc.create({ country: mk, email: u.email, reaction: g >= 4 ? 'like' : 'dislike', comments: d2.state.vcomment || '' })\n      }\n      d2.setState({ panel: null })\n    })\n    d2.on('.copy', 'click', function (e, el) {\n      const t = answerText(d2); if (!t) return\n      try { navigator.clipboard.writeText(t) } catch (err) { }\n      el.textContent = 'Copiado'\n      setTimeout(function () { try { el.textContent = 'Copiar' } catch (e2) { } }, 1400)\n    })\n    d2.on(document, 'keydown', function (e) { if (e.key === 'Escape' && d2.state.panel) d2.state.panel = null })\n\n    if (isDemo(d2) && !d2.state.pregunta) {\n      setTimeout(function () {\n        const el = d2.$('.q')\n        if (el && !d2.state.pregunta) { el.value = '¿Por qué el pedido quedó retenido por límite de crédito?'; ask() }\n      }, 250)\n    }\n  },\n\n  updated(d2) {\n    const log = d2.$('.log')\n    if (log) log.scrollTop = log.scrollHeight\n  }\n}\n\n// Spanish relative time — d2.fmt.relative follows the browser locale, which is English here.\nfunction rel(ts) {\n  const t = typeof ts === 'number' ? ts : Date.parse(ts)\n  if (!t) return ''\n  const m = Math.round((Date.now() - t) / 60000)\n  if (m < 1) return 'recién'\n  if (m < 60) return 'hace ' + m + (m === 1 ? ' minuto' : ' minutos')\n  const h = Math.round(m / 60)\n  if (h < 24) return 'hace ' + h + (h === 1 ? ' hora' : ' horas')\n  const d = Math.round(h / 24)\n  if (d === 1) return 'ayer'\n  if (d < 30) return 'hace ' + d + ' días'\n  return new Date(t).toLocaleDateString('es')\n}\n"}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"telemetry":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"telemetry"}}}},"mxBaseSeparada":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"mxBaseSeparada"}}}},"assistant":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant"}}}},"faqs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"faqs"}}}},"faqsMx":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"faqsMx"}}}},"faqsCuradas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"faqsCuradas"}}}},"usuarios":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"usuarios"}}}},"regiones":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"regiones"}}}},"historial":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"historial"}}}},"eventos":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eventos"}}}},"encuestas":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"encuestas"}}}},"autenticacion":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autenticacion"}}}},"maxFuentes":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"maxFuentes"}}}},"maxCaracteres":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"maxCaracteres"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}}}}}}}},{"_id":"6a8cb55995d9f0fa3ff0ca5a","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"DashboardNasviV2","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// DashboardNasviV2 — supervisor dashboard for NASVI.\n// Same 8 metrics + 5 KPIs as the legacy screen. Nothing legacy is edited, but every known\n// defect of the legacy screen is an acceptance requirement here (see PLAN):\n//  · legacy sees only AR/MX (Store Switch, 2 cases) -> market selector over the `regions` table\n//  · legacy mixes two meanings of `country`        -> we use the SERVED MARKET on both sides\n//  · legacy NPS chart hardcoded to 2025-05-17..08-23 / AR -> dynamic, honours the filters\n//  · legacy guard (\"item._id\" != \"\") is a string literal -> real reference\n//  · legacy \"Palabras\" has no slice, so it is not a top-N -> real top-N\n//  · legacy KPI4 groups by country then reads .data.0    -> aggregate once, name the market\n//  · legacy pushes filters into tables lacking the column -> each pipeline uses its own columns\n//  · legacy runs 4 dead aggregations per load             -> not reproduced\n\nconst HUE = { claro: ['#2a78d6', '#eb6834', '#1baf7a'], escuro: ['#3987e5', '#d95926', '#199e70'] }\nconst MOCK_REG = ['AR', 'CL', 'CO', 'EC', 'MX', 'PE']\n\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\nfunction nf(n, d) { const v = Number(n); if (!isFinite(v)) return '--'; return v.toLocaleString('es', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }) }\nfunction pct(a, b, d) { if (!b) return '--'; return nf((a / b) * 100, d == null ? 1 : d) + '%' }\nfunction iso(dt) { return new Date(dt).toISOString().slice(0, 10) }\n\nfunction hoje() { return new Date() }\nfunction haDias(n) { const d = hoje(); d.setDate(d.getDate() - n); return d }\n\nfunction regionCodes(d2) {\n  if (isDemo(d2)) return MOCK_REG\n  const ds = d2.data('regiones')\n  const r = ds ? ds.records().map(function (x) { return x.country_code }).filter(Boolean) : []\n  return r.length ? r.slice().sort() : MOCK_REG\n}\nfunction mercado(d2) { return d2.state.mk || regionCodes(d2)[0] || 'AR' }\nfunction desde(d2) { return d2.state.desde || iso(haDias(30)) }\nfunction hasta(d2) { return d2.state.hasta || iso(hoje()) }\n\n/*ENGINE_START*/\n// Every pipeline runs server-side and uses ONLY columns its own table has — the legacy screen\n// pushes `email`/`user_type` into tables that lack them, which silently zeroes those charts.\nasync function agg(d2, nome, pipeline) {\n  const h = d2.data(nome)\n  if (!h) throw new Error('parámetro \"' + nome + '\" no conectado')\n  // The dashboard DataSets carry a baked-in filter (current week + country from the Store, which\n  // only knows AR/MX). Clear it so the market is OUR parameter, not the app domain's.\n  h.filter({})\n  await new Promise(function (r) { setTimeout(r, 150) })\n  const res = await h.aggregate(pipeline)\n  // the runtime returns an envelope, not a bare array — normalising here keeps every caller honest\n  if (Array.isArray(res)) return res\n  if (res && Array.isArray(res.data)) return res.data\n  if (res && Array.isArray(res.result)) return res.result\n  return []\n}\n\nfunction janela(d2) {\n  return { $gte: desde(d2) + 'T00:00:00.000Z', $lte: hasta(d2) + 'T23:59:59.999Z' }\n}\n\nasync function carregar(d2) {\n  if (isDemo(d2)) { d2.setState({ carregando: false, dados: mockDados(), erros: {} }); return }\n  d2.setState({ carregando: true, erro: '', erros: {} })\n  const mk = mercado(d2), top = Math.max(3, d2.param('maxTop', 10))\n  const per = { createdAt: janela(d2) }\n  const bm = Object.assign({}, per, { country: mk })   // monitoring: country = served market\n  const be = Object.assign({}, per, { country: mk })   // events: country = app domain (legacy)\n  const D = {}, erros = {}\n\n  // A dataset that never settles must not freeze the whole panel. Measured: one of the bound\n  // datasets hangs indefinitely instead of rejecting, which left Promise.all pending forever\n  // and the screen stuck on \"loading\" with no error to show.\n  function job(chave, fn) {\n    return Promise.race([\n      fn(),\n      new Promise(function (_, rej) {\n        // 12 s was too tight: a $count over ~27k rows legitimately takes ~20 s on this endpoint\n        setTimeout(function () { rej(new Error('tiempo agotado (35 s) — el dataset no respondió')) }, 35000)\n      })\n    ]).then(function (v) { D[chave] = v }).catch(function (e) {\n      erros[chave] = String((e && e.message) || e)\n    })\n  }\n  const um = function (rows, campo) { return (rows && rows[0] && rows[0][campo]) || 0 }\n\n  await Promise.all([\n    job('totalConsultas', function () {\n      return agg(d2, 'monitoring', [{ $match: bm }, { $count: 'n' }]).then(function (r) { return um(r, 'n') })\n    }),\n    job('canal', function () {\n      return agg(d2, 'monitoring', [{ $match: Object.assign({}, bm, { origen: { $in: ['chat', 'voz', 'video'] } }) },\n        { $group: { _id: '$origen', n: { $sum: 1 } } }, { $sort: { n: -1 } }])\n    }),\n    job('asesores', function () {\n      return agg(d2, 'monitoring', [{ $match: bm }, { $group: { _id: '$email', n: { $sum: 1 } } },\n        { $sort: { n: -1 } }, { $limit: top }])\n    }),\n    job('duracao', function () {\n      // only strictly positive values: the legacy writer stores dateDiff(undefined, now())\n      return agg(d2, 'monitoring', [{ $match: Object.assign({}, bm, { duracion: { $gt: 0 } }) },\n        { $group: { _id: null, avg: { $avg: '$duracion' }, n: { $sum: 1 } } }])\n    }),\n    job('horas', function () {\n      return agg(d2, 'monitoring', [{ $match: bm },\n        // createdAt is an ISO string here; $hour/$toDate hangs on this endpoint, so slice the\n        // \"HH\" out of the string instead (chars 11-12 of 2026-08-24T18:41:18.380Z)\n        { $group: { _id: { $substrBytes: ['$createdAt', 11, 2] }, n: { $sum: 1 } } }, { $sort: { _id: 1 } }])\n    }),\n    job('wikis', function () {\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'assistant_ask' }) },\n        { $group: { _id: '$payload.article', n: { $sum: 1 } } }, { $sort: { n: -1 } }, { $limit: top + 6 }])\n    }),\n    job('faqs', function () {\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'context' }) },\n        { $group: { _id: '$payload.data', n: { $sum: 1 } } }, { $sort: { n: -1 } }, { $limit: top + 6 }])\n    }),\n    job('categorias', function () {\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'category' }) },\n        { $group: { _id: '$payload.data', n: { $sum: 1 } } }, { $sort: { n: -1 } }, { $limit: top + 6 }])\n    }),\n    job('votos', function () {\n      // group by raw grade and bucket client-side: $switch/$addFields are not reliable here\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'voting' }) },\n        { $group: { _id: '$payload.grade', n: { $sum: 1 } } }, { $sort: { _id: 1 } }])\n    }),\n    job('naoEncontradas', function () {\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'answer_not_found' }) },\n        { $count: 'n' }]).then(function (r) { return um(r, 'n') })\n    }),\n    job('asesoresAtivos', function () {\n      return agg(d2, 'eventos', [{ $match: Object.assign({}, be, { event: 'login' }) },\n        { $group: { _id: '$email' } }, { $count: 'n' }]).then(function (r) { return um(r, 'n') })\n    }),\n    job('asesoresTotal', function () {\n      return agg(d2, 'usuarios', [{ $match: { countries: mk } }, { $count: 'n' }]).then(function (r) { return um(r, 'n') })\n    }),\n    job('palabras', function () {\n      return agg(d2, 'palabras', [{ $match: Object.assign({}, per, { country: mk }) },\n        { $group: { _id: '$word_master', n: { $sum: 1 } } }, { $sort: { n: -1 } }, { $limit: top }])\n    })\n  ])\n\n  // derived, client-side — wrapped so a failure here still commits the state and surfaces the\n  // per-metric errors, instead of leaving the screen stuck on \"loading\" with nothing to show\n  try {\n  const dur = (D.duracao || [])[0]\n  D.duracaoMedia = dur && dur.n ? dur.avg : 0\n  D.duracaoAmostra = dur ? dur.n : 0\n  const vt = Array.isArray(D.votos) ? D.votos : []\n  let soma = 0, qtd = 0, faixas = { '1-2': 0, '3': 0, '4-5': 0 }\n  vt.forEach(function (v) {\n    const g = Number(v._id), n = Number(v.n) || 0\n    if (!isFinite(g)) return\n    soma += g * n; qtd += n\n    if (g <= 2) faixas['1-2'] += n; else if (g === 3) faixas['3'] += n; else faixas['4-5'] += n\n  })\n  D.notaMedia = qtd ? soma / qtd : 0\n  D.votosTotal = qtd\n  D.votos = qtd\n  D.faixas = [{ _id: '1-2 Detractores', n: faixas['1-2'] }, { _id: '3 Neutros', n: faixas['3'] }, { _id: '4-5 Promotores', n: faixas['4-5'] }]\n\n  // real guard against null/empty ids — the legacy one compares the string \"item._id\"\n  const limpa = function (rows) {\n    return (rows || []).filter(function (r) { return r._id != null && String(r._id).trim() !== '' }).slice(0, top)\n  }\n  D.wikis = limpa(D.wikis); D.faqs = limpa(D.faqs); D.categorias = limpa(D.categorias)\n  } catch (e) { erros.derivados = String((e && e.message) || e) }\n\n  d2.setState({ carregando: false, dados: D, erros: erros })\n}\n\nfunction mockDados() {\n  return {\n    totalConsultas: 4820, asesoresAtivos: 34, asesoresTotal: 51, naoEncontradas: 212,\n    duracaoMedia: 11400, duracaoAmostra: 480, notaMedia: 4.1, votos: 318,\n    canal: [{ _id: 'chat', n: 3120 }, { _id: 'voz', n: 1210 }, { _id: 'video', n: 490 }],\n    asesores: [{ _id: 'ana@natura.net', n: 210 }, { _id: 'jose@natura.net', n: 188 }, { _id: 'lu@natura.net', n: 141 }, { _id: 'mar@natura.net', n: 97 }, { _id: 'rob@natura.net', n: 63 }],\n    horas: [{ _id: 8, n: 120 }, { _id: 9, n: 260 }, { _id: 10, n: 410 }, { _id: 11, n: 480 }, { _id: 12, n: 300 }, { _id: 13, n: 190 }, { _id: 14, n: 420 }, { _id: 15, n: 510 }, { _id: 16, n: 470 }, { _id: 17, n: 330 }, { _id: 18, n: 180 }],\n    wikis: [{ _id: '478306', n: 84 }, { _id: '215131', n: 61 }, { _id: '476936', n: 44 }, { _id: '430161', n: 30 }],\n    faqs: [{ _id: 'DEVUELTO A SURCURSAL', n: 71 }, { _id: 'ACTUALIZACIÓN DE DATOS', n: 55 }, { _id: 'PAGOS', n: 38 }],\n    categorias: [{ _id: 'PEDIDOS', n: 190 }, { _id: 'REGISTRO', n: 142 }, { _id: 'PAGOS', n: 88 }, { _id: 'PRODUCTOS', n: 51 }],\n    faixas: [{ _id: '1-2 Detractores', n: 42 }, { _id: '3 Neutros', n: 61 }, { _id: '4-5 Promotores', n: 215 }],\n    palabras: [{ _id: 'pedido', n: 310 }, { _id: 'credito', n: 208 }, { _id: 'entrega', n: 174 }, { _id: 'registro', n: 120 }]\n  }\n}\n/*ENGINE_END*/\n\n/*CHARTS_START*/\n// Length encodes magnitude, so top-N charts use ONE colour — a rainbow over a single series is\n// the classic anti-pattern. Only the 3-category charts use the validated categorical trio.\nfunction barrasH(rows) {\n  if (!rows || !rows.length) return '<div class=\"empty\">Sin datos en el período.</div>'\n  const max = Math.max.apply(null, rows.map(function (r) { return Number(r.n) || 0 })) || 1\n  return '<ul class=\"bars\">' + rows.map(function (r) {\n    const n = Number(r.n) || 0\n    const w = Math.max(1.5, (n / max) * 100)\n    return '<li data-key=\"' + attr(r._id) + '\">'\n      + '<span class=\"bl\" title=\"' + attr(r._id) + '\">' + esc(r._id) + '</span>'\n      + '<span class=\"bt\"><i style=\"width:' + w.toFixed(1) + '%\" title=\"' + attr(r._id) + ' — ' + attr(nf(n)) + '\"></i></span>'\n      + '<span class=\"bv\">' + esc(nf(n)) + '</span></li>'\n  }).join('') + '</ul>'\n}\n\nfunction colunas(rows) {\n  const m = {}\n  ;(rows || []).forEach(function (r) { const h = Number(r._id); if (isFinite(h)) m[h] = Number(r.n) || 0 })\n  const arr = []\n  for (let h = 0; h < 24; h++) arr.push({ h: h, n: m[h] || 0 })\n  const total = arr.reduce(function (s, a) { return s + a.n }, 0)\n  if (!total) return '<div class=\"empty\">Sin datos en el período.</div>'\n  const max = Math.max.apply(null, arr.map(function (a) { return a.n })) || 1\n  return '<div class=\"cols\">' + arr.map(function (a) {\n    const ht = a.n ? Math.max(2, (a.n / max) * 100) : 0\n    return '<div class=\"col\" data-key=\"h' + a.h + '\" title=\"' + a.h + ':00 — ' + attr(nf(a.n)) + '\">'\n      + '<i style=\"height:' + ht.toFixed(1) + '%\"></i>'\n      + '<span>' + (a.h % 3 === 0 ? a.h : '') + '</span></div>'\n  }).join('') + '</div>'\n}\n\nfunction segmentos(rows) {\n  const tot = (rows || []).reduce(function (s, r) { return s + (Number(r.n) || 0) }, 0)\n  if (!tot) return '<div class=\"empty\">Sin datos en el período.</div>'\n  const barra = '<div class=\"segbar\">' + rows.map(function (r, i) {\n    const n = Number(r.n) || 0\n    if (!n) return ''\n    return '<i class=\"sg s' + ((i % 3) + 1) + '\" style=\"width:' + ((n / tot) * 100).toFixed(2) + '%\" title=\"'\n      + attr(r._id) + ' — ' + attr(nf(n)) + '\"></i>'\n  }).join('') + '</div>'\n  // direct labels are mandatory here: one of the three light-mode hues sits below 3:1 contrast\n  const leg = '<ul class=\"leg\">' + rows.map(function (r, i) {\n    const n = Number(r.n) || 0\n    return '<li><b class=\"dot s' + ((i % 3) + 1) + '\"></b>' + esc(r._id)\n      + ' <span>' + esc(nf(n)) + ' · ' + ((n / tot) * 100).toFixed(1) + '%</span></li>'\n  }).join('') + '</ul>'\n  return barra + leg\n}\n\nfunction tabela(rows, rotulo) {\n  if (!rows || !rows.length) return '<div class=\"empty\">Sin datos.</div>'\n  return '<table class=\"tb\"><thead><tr><th>' + esc(rotulo || 'Valor') + '</th><th>N</th></tr></thead><tbody>'\n    + rows.map(function (r) {\n      return '<tr data-key=\"' + attr(r._id) + '\"><td>' + esc(r._id) + '</td><td>' + esc(nf(r.n)) + '</td></tr>'\n    }).join('') + '</tbody></table>'\n}\n\nfunction card(d2, id, titulo, sub, corpo, rows, rotulo) {\n  const tab = (d2.state.tabelas || {})[id]\n  const err = (d2.state.erros || {})[id]\n  return '<section class=\"card\"><div class=\"cardhd\"><h3>' + esc(titulo) + '</h3>'\n    + '<button class=\"tgl\" data-t=\"' + attr(id) + '\">' + (tab ? 'gráfico' : 'tabla') + '</button></div>'\n    + '<div class=\"sub\">' + esc(sub) + '</div>'\n    + (err ? '<div class=\"err\">' + esc(err) + '</div>' : (tab ? tabela(rows, rotulo) : corpo))\n    + '</section>'\n}\n/*CHARTS_END*/\n\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '.app{--cream:rgb(254,251,244);--surf:#fff;--ink:#162b37;--ink2:rgba(22,43,55,.62);--line:#e3ddd2;--acc:var(--a,#FF6C0E);--s1:#2a78d6;--s2:#eb6834;--s3:#1baf7a;display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.5 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;overflow:hidden}'\n    + '@media (prefers-color-scheme:dark){.app{--cream:#1a1a19;--surf:#232322;--ink:#fff;--ink2:#c3c2b7;--line:#3a3a38;--s1:#3987e5;--s2:#d95926;--s3:#199e70}}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:16px;padding:14px 22px;border-bottom:1px solid var(--line);background:var(--surf)}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}'\n    + '.brand b{font-size:20px;font-weight:700}'\n    + '.brand span{font-size:12px;color:var(--ink2)}'\n    + '.sp{flex:1 1 auto}'\n    + '.f{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink2);flex:none}'\n    + '.f select,.f input{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:7px;background:var(--surf);color:var(--ink)}'\n    + '.body{flex:1 1 auto;min-height:0;overflow:auto;padding:16px 22px 22px}'\n    + '.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;margin-bottom:16px}'\n    + '.kpi{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px}'\n    + '.kpi .v{font-size:30px;font-weight:700;color:var(--acc);line-height:1.1}'\n    + '.kpi .l{font-size:12px;color:var(--ink2);margin-top:4px}'\n    + '.kpi .n{font-size:10.5px;color:var(--ink2);margin-top:6px;opacity:.85}'\n    + '.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:14px}'\n    + '.card{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px;min-width:0}'\n    + '.card h3{margin:0 0 2px;font-size:13.5px;font-weight:700}'\n    + '.card .sub{font-size:11px;color:var(--ink2);margin-bottom:10px}'\n    + '.err{background:#fff0ef;border:1px solid rgba(255,60,51,.45);color:#b3261e;border-radius:9px;padding:9px 12px;font-size:13px;margin-bottom:12px}'\n    + '.warn{background:#fff6e6;border:1px solid #f0dcb4;color:#7a5a12;border-radius:9px;padding:8px 12px;font-size:12px;margin-bottom:12px}'\n    + '.empty{color:var(--ink2);font-size:12.5px;padding:18px 0;text-align:center}'\n    + '.btn{flex:none;border:1px solid var(--line);background:var(--surf);border-radius:8px;padding:6px 13px;font:600 12px/1 inherit;color:var(--ink);cursor:pointer}'\n    + '.btn:hover{border-color:var(--acc);color:var(--acc)}'\n    + '.cardhd{display:flex;align-items:baseline;gap:8px}'\n    + '.tgl{margin-left:auto;border:0;background:transparent;color:var(--ink2);font:600 11px/1 inherit;cursor:pointer;padding:3px 6px;border-radius:5px}'\n    + '.tgl:hover{color:var(--acc)}'\n    + '.bars{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}'\n    + '.bars li{display:grid;grid-template-columns:minmax(0,150px) 1fr auto;align-items:center;gap:10px}'\n    + '.bl{font-size:12px;color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.bt{background:rgba(22,43,55,.07);border-radius:4px;height:14px;overflow:hidden}'\n    + '.bt i{display:block;height:100%;border-radius:0 4px 4px 0;background:var(--s1)}'\n    + '.bars li:hover .bt i{filter:brightness(1.14)}'\n    + '.bv{font-size:12px;font-weight:700;min-width:46px;text-align:right}'\n    + '.cols{display:flex;align-items:flex-end;gap:3px;height:158px}'\n    + '.col{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;height:100%;gap:5px}'\n    + '.col i{display:block;width:100%;background:var(--s1);border-radius:4px 4px 0 0}'\n    + '.col span{font-size:9.5px;color:var(--ink2);height:12px}'\n    + '.col:hover i{filter:brightness(1.14)}'\n    + '.segbar{display:flex;height:22px;border-radius:5px;overflow:hidden;gap:2px}'\n    + '.sg{display:block;height:100%;border-radius:3px}'\n    + '.s1{background:var(--s1)}.s2{background:var(--s2)}.s3{background:var(--s3)}'\n    + '.leg{list-style:none;margin:11px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:14px}'\n    + '.leg li{display:flex;align-items:center;gap:6px;font-size:12px}'\n    + '.leg li span{color:var(--ink2)}'\n    + '.dot{width:10px;height:10px;border-radius:3px;display:inline-block;flex:none}'\n    + '.tb{width:100%;border-collapse:collapse;font-size:12px}'\n    + '.tb th{text-align:left;color:var(--ink2);font-weight:600;padding:5px 6px;border-bottom:1px solid var(--line)}'\n    + '.tb td{padding:5px 6px;border-bottom:1px solid var(--line)}',\n\n  render(d2) {\n    const mk = mercado(d2)\n    const regs = regionCodes(d2)\n    const D = d2.state.dados || {}\n    const carregando = d2.state.carregando !== false\n    const top = Math.max(3, d2.param('maxTop', 10))\n\n    const filtros = '<div class=\"f\"><span>Mercado</span><select class=\"selMk\">'\n      + regs.map(function (c) { return '<option value=\"' + attr(c) + '\"' + (c === mk ? ' selected' : '') + '>' + esc(c) + '</option>' }).join('')\n      + '</select></div>'\n      + '<div class=\"f\"><span>De</span><input class=\"inDesde\" type=\"date\" value=\"' + attr(desde(d2)) + '\"/></div>'\n      + '<div class=\"f\"><span>a</span><input class=\"inHasta\" type=\"date\" value=\"' + attr(hasta(d2)) + '\"/></div>'\n      + '<button class=\"btn recarregar\">Actualizar</button>'\n\n    const kpi = function (v, l, n) {\n      return '<div class=\"kpi\"><div class=\"v\">' + esc(v) + '</div><div class=\"l\">' + esc(l) + '</div>'\n        + (n ? '<div class=\"n\">' + esc(n) + '</div>' : '') + '</div>'\n    }\n\n    return '<div class=\"app\" data-ready style=\"--a:' + attr(d2.param('accent', '#FF6C0E')) + '\">'\n      + '<header class=\"hd\"><div class=\"brand\"><b>NASVI</b><span>Panel del supervisor</span></div>'\n      + '<div class=\"sp\"></div>' + filtros + '</header>'\n      + '<div class=\"body\">'\n      + (d2.state.erro ? '<div class=\"err\">' + esc(d2.state.erro) + '</div>' : '')\n      + '<div class=\"kpis\">'\n      + kpi(carregando ? '…' : nf(D.totalConsultas), 'Consultas a NASVI', 'mercado ' + mk)\n      + kpi(carregando ? '…' : (D.asesoresAtivos != null ? pct(D.asesoresAtivos, D.asesoresTotal, 0) : '--'), 'Asesores activos', (D.asesoresAtivos || 0) + ' de ' + (D.asesoresTotal || 0))\n      + kpi(carregando ? '…' : (D.naoEncontradas != null ? pct(D.naoEncontradas, D.totalConsultas, 1) : '--'), 'Respuestas no encontradas', (D.naoEncontradas || 0) + ' eventos')\n      + kpi(carregando ? '…' : (D.duracaoMedia ? nf(D.duracaoMedia / 1000, 2) + ' s' : '--'), 'Duración media', 'serie nueva — el histórico es inválido')\n      + kpi(carregando ? '…' : (D.notaMedia ? nf(D.notaMedia, 2) : '--'), 'Nota media', (D.votos || 0) + ' votos')\n      + '</div>'\n      + (d2.state.erros && Object.keys(d2.state.erros).length ? '<div class=\"warn\">Algunas métricas no cargaron — el detalle aparece en la tarjeta correspondiente.</div>' : '')\n      + '<div class=\"grid\">'\n      + card(d2, 'palabras', 'Palabras más usadas', 'top ' + top + ' del período', barrasH(D.palabras), D.palabras, 'Palabra')\n      + card(d2, 'canal', 'Consultas por clasificación de canal', 'chat · voz · video', segmentos(D.canal), D.canal, 'Canal')\n      + card(d2, 'asesores', 'Top ' + top + ' asesores con más consultas', 'por correo del asesor', barrasH(D.asesores), D.asesores, 'Asesor')\n      + card(d2, 'wikis', 'Top ' + top + ' wikis más frecuentes', 'evento assistant_ask · payload.article', barrasH(D.wikis), D.wikis, 'Artículo')\n      + card(d2, 'horas', 'Horas de mayor actividad', 'hora UTC · franja de 24 h', colunas(D.horas), D.horas, 'Hora')\n      + card(d2, 'faqs', 'Top ' + top + ' contextos más usados', 'evento context · payload.data', barrasH(D.faqs), D.faqs, 'Contexto')\n      + card(d2, 'categorias', 'Top ' + top + ' categorías más frecuentes', 'evento category · payload.data', barrasH(D.categorias), D.categorias, 'Categoría')\n      + card(d2, 'faixas', 'Franjas de votos', '1-2 detractores · 3 neutros · 4-5 promotores', segmentos(D.faixas), D.faixas, 'Franja')\n      + '</div>'\n      + '</div></div>'\n  },\n\n  mounted(d2) {\n    const r = d2.data('regiones'); if (r) r.refresh()\n    d2.on('.selMk', 'change', function (e, el) { d2.setState({ mk: el.value }); carregar(d2) })\n    d2.on('.inDesde', 'change', function (e, el) { d2.state.desde = el.value })\n    d2.on('.inHasta', 'change', function (e, el) { d2.state.hasta = el.value })\n    d2.on('.recarregar', 'click', function () { carregar(d2) })\n    d2.on('.tgl', 'click', function (e, el) {\n      const t = Object.assign({}, d2.state.tabelas || {})\n      t[el.dataset.t] = !t[el.dataset.t]\n      d2.state.tabelas = t\n    })\n    setTimeout(function () { carregar(d2) }, 400)\n  }\n}\n"}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"monitoring":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"monitoring"}}}},"eventos":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"eventos"}}}},"palabras":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"palabras"}}}},"usuarios":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"usuarios"}}}},"regiones":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"regiones"}}}},"autenticacion":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autenticacion"}}}},"maxTop":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"maxTop"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}}}}}}}},{"_id":"6acea8de36e69ceacd76dba4","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"NasviWikis","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const VERSION = 'wikis-2.1.0'\nconst MERCADOS = ['AR', 'MX', 'CO', 'PE', 'CL', 'EC']\nconst NOMBRES = { AR: 'Argentina', MX: 'México', CO: 'Colombia', PE: 'Perú', CL: 'Chile', EC: 'Ecuador' }\nconst INST = { latam: 'naturalatam', eco: 'naturaecolatam', mx: 'naturamexico' }\nconst MAX_FRAGMENTO = 1200\nconst MAX_FRAGMENTOS_ART = 300          // tope del importador por artículo (gravar valida 1–300 chunks)\nconst LOTE = 5                         // el importador acepta 1–10 IDs por \"buscar\" (1 login por lote)\nconst MAX_IDS = 100\nconst LIMITE_MS = 5 * 60 * 1000      // el handler corta en ~4 min; la pantalla espera 1 min más\nconst OLVIDO_MS = 15 * 60 * 1000     // credenciales sin uso se descartan solas\nconst SEP = ' › '               // \"Título del artículo › Sección\"\nconst CONSERVAR = '__conservar__'    // opción \"Conservar la de la base\" (base desconocida: no se envía category)\nconst CATEGORIAS = [\n  ['REGISTRO', 'Registro'], ['PEDIDOS', 'Pedidos'], ['PAGOS', 'Pagos'], ['PRODUCTOS', 'Productos'],\n  ['HERRAMIENTAS_DE_VENTAS', 'Herramientas de ventas'], ['MODELO_COMERCIAL', 'Modelo comercial'],\n  ['VENTAS_EN_LÍNEA', 'Ventas en línea']\n]\nconst PISTAS = {\n  REGISTRO: ['registro', 'alta', 'inscrip', 'baja', 'cese', 'reingreso', 'contrasena', 'clave', 'usuario', 'datos personales', 'documento', 'dni', 'cuit', 'rfc', 'domicilio', 'correo electronico'],\n  PEDIDOS: ['pedido', 'entrega', 'envio', 'despacho', 'reparto', 'sucursal', 'devuelto', 'faltante', 'retenido', 'plazo', 'seguimiento', 'transporte', 'paquete', 'facturacion'],\n  PAGOS: ['pago', 'cobranza', 'deuda', 'factura', 'reembolso', 'devolucion de dinero', 'transferencia', 'cuota', 'boleta', 'tarjeta', 'saldo', 'nota de credito', 'credito'],\n  PRODUCTOS: ['producto', 'defecto', 'calidad', 'fragancia', 'perfume', 'maquillaje', 'crema', 'vencid', 'stock', 'lanzamiento', 'repuesto', 'regalo'],\n  HERRAMIENTAS_DE_VENTAS: ['app', 'aplicacion', 'plataforma', 'sistema', 'portal', 'herramienta', 'mi negocio', 'catalogo', 'folleto', 'revista'],\n  MODELO_COMERCIAL: ['nivel', 'puntos', 'ganancia', 'descuento', 'escalon', 'ciclo', 'bonificacion', 'gerente', 'lider', 'consultoria', 'diamante', 'premio', 'reconocimiento', 'modelo comercial', 'margen'],\n  'VENTAS_EN_LÍNEA': ['venta online', 'venta en linea', 'en linea', 'online', 'ecommerce', 'e-commerce', 'tienda virtual', 'mi tienda', 'tienda online', 'digital']\n}\nconst RX_PISTAS = Object.keys(PISTAS).map(function (cat) {\n  return [cat, PISTAS[cat].map(function (p) { return new RegExp('\\\\b' + p.replace(/[.*+?^${}()|[\\]\\\\-]/g, '\\\\$&')) })]\n})\nconst ESTADOS = {\n  creado: ['Creado', 'ok'], actualizado: ['Actualizado', 'up'], sin_cambios: ['Sin cambios', 'eq'],\n  no_encontrado: ['No encontrado', 'nf'], error: ['Error', 'er'], removido: ['Quitado', 'eq']\n}\nconst ORDEN_ESTADOS = ['creado', 'actualizado', 'sin_cambios', 'no_encontrado', 'error']\nconst ORDEN_HIST = ORDEN_ESTADOS.concat(['removido'])\nconst ESTADOS_JOB = { preview: ['Previsualización', 'eq'], importando: ['En curso', 'up'], concluido: ['Concluido', 'ok'], erro: ['Con error', 'er'] }\nconst TIPOS_ERROR = {\n  login: 'Login de Beedoo rechazado', sesion: 'Sesión sin permiso', red: 'Falla de red',\n  tiempo: 'Tiempo agotado', servidor: 'Error del importador', beedoo: 'Error de Beedoo',\n  instancia: 'Instancia no disponible', config: 'Configuración de la pantalla',\n  contenido: 'Artículo sin texto', largo: 'Artículo demasiado largo', detenido: 'Detenido'\n}\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\nfunction norm(s) { return String(s == null ? '' : s).toLowerCase().normalize('NFD').replace(/[̀-ͯ]/g, '') }\nfunction dormir(ms) { return new Promise(function (r) { setTimeout(r, ms) }) }\nfunction plural(n, uno, varios) { return Number(n || 0).toLocaleString('es') + ' ' + (n === 1 ? uno : varios) }\nfunction enLotes(a, n) { const o = []; for (let i = 0; i < a.length; i += n) o.push(a.slice(i, i + n)); return o }\nfunction idDom(s) { return String(s == null ? '' : s).replace(/[^A-Za-z0-9_-]/g, '_') }\nfunction urlSegura(u) { const s = String(u || '').trim(); return /^https?:\\/\\//i.test(s) ? s : '' }\nfunction beedooUrl(instance, id) { return 'https://' + instance + '.beedoo.io/wiki/' + encodeURIComponent(id) + '/lll' }\nfunction etiquetaCat(c) { const x = CATEGORIAS.filter(function (k) { return k[0] === c })[0]; return x ? x[1] : String(c || '') }\nfunction tituloArticulo(t) { return String(t || '').split(SEP)[0].trim() }\nfunction unirMercados(a, b) {\n  const todos = [].concat(a || [], b || []).map(function (x) { return String(x || '').toUpperCase() })\n  const o = []\n  todos.forEach(function (x) { if (x && o.indexOf(x) < 0) o.push(x) })\n  return MERCADOS.filter(function (c) { return o.indexOf(c) >= 0 }).concat(o.filter(function (c) { return MERCADOS.indexOf(c) < 0 }))\n}\nfunction tiempoDe(v) {\n  if (v == null || v === '') return 0\n  if (v instanceof Date) return v.getTime()\n  if (typeof v === 'number') return v\n  const t = Date.parse(v)\n  return isFinite(t) ? t : 0\n}\nfunction fecha(v) {\n  const t = tiempoDe(v)\n  if (!t) return '—'\n  try { return new Date(t).toLocaleString('es', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit' }) } catch (e) { return new Date(t).toISOString().slice(0, 16).replace('T', ' ') }\n}\nfunction duracion(ms) {\n  const s = Math.round((Number(ms) || 0) / 1000)\n  if (!s) return '—'\n  const m = Math.floor(s / 60)\n  return m ? m + ' min ' + (s % 60) + ' s' : s + ' s'\n}\nfunction kchars(n) { return n >= 1000 ? (n / 1000).toLocaleString('es', { maximumFractionDigits: 1 }) + ' mil car.' : n + ' car.' }\nfunction sinPunto(s) { return String(s == null ? '' : s).replace(/[.\\s]+$/, '') }\nfunction acento(d2) {\n  const v = String(d2.param('accent', '') || '').trim()\n  return /^(#[0-9a-f]{3,8}|(rgb|hsl)a?\\([0-9.,%\\s/deg]+\\)|[a-z]{3,24})$/i.test(v) ? v : '#FF6C0E'\n}\nconst VIDA = new WeakMap()\nfunction vida(d2) {\n  let v = VIDA.get(d2)\n  if (!v) { v = { activo: true, detener: false, foco: null, dlg: false, volver: null }; VIDA.set(d2, v) }\n  return v\n}\nfunction poner(d2, o) { if (vida(d2).activo) d2.setState(o) }\nfunction leerIds(texto) {\n  const toks = String(texto || '').replace(/\\r/g, '').replace(/[​-‍⁠﻿]/g, '').split(/[\\s,;]+/)\n  const validos = [], invalidos = [], visto = {}\n  let duplicados = 0\n  for (let i = 0; i < toks.length; i++) {\n    const t = toks[i].trim()\n    if (!t) continue\n    if (/^\\d{1,12}$/.test(t) && /[1-9]/.test(t)) {\n      const id = t.replace(/^0+/, '')\n      if (visto[id]) { duplicados++; continue }\n      visto[id] = 1\n      validos.push(id)\n    } else if (invalidos.indexOf(t) < 0) invalidos.push(t)\n  }\n  return { validos: validos, invalidos: invalidos, duplicados: duplicados }\n}\nfunction mercadosSel(d2) {\n  if (d2.state.soloMx) return ['MX']\n  const m = d2.state.mercados || []\n  return MERCADOS.filter(function (c) { return m.indexOf(c) >= 0 })\n}\nfunction plan(d2) {\n  if (d2.state.soloMx) return { instance: INST.mx, fallback: null, forzada: true, soloMx: true }\n  const f = d2.state.instForzada\n  if (f) return { instance: f, fallback: null, forzada: true }\n  const eco = !!d2.state.ecommerce\n  return { instance: eco ? INST.eco : INST.latam, fallback: null, forzada: false }\n}\nfunction firma(d2) {\n  return leerIds(d2.state.idsText).validos.join(',') + '|' + mercadosSel(d2).join(',') + '|' + (d2.state.ecommerce ? 1 : 0) + '|' + (d2.state.instForzada || '') + '|' + (d2.state.soloMx ? 'mx' : '')\n}\nfunction regiones(d2) {\n  const out = {}\n  if (!isDemo(d2)) {\n    const ds = d2.data('regiones')\n    const rows = ds ? ds.records() : []\n    for (let i = 0; i < rows.length; i++) {\n      const c = String(rows[i].country_code || '').toUpperCase()\n      if (c && !out[c] && rows[i].title) out[c] = String(rows[i].title)\n    }\n  }\n  MERCADOS.forEach(function (c) { if (!out[c]) out[c] = NOMBRES[c] })\n  return out\n}\nfunction sesion(d2) {\n  if (isDemo(d2)) return { email: 'supervisor.demo@natura.net', ok: true }\n  const ref = d2.params && d2.params.auth\n  if (!ref) return { email: '', ok: false, sinParam: true }\n  if (d2.state.sesEmail) return { email: d2.state.sesEmail, ok: true }\n  try {\n    const a = d2.auth(ref)\n    if (!a) return { email: '', ok: false }\n    const u = a.user, s = a.session\n    const cand = [u && u.email, s && s.email, s && s.user && s.user.email, s && s.credentials && s.credentials.email, s && s.username]\n    let email = ''\n    for (let i = 0; i < cand.length; i++) { if (typeof cand[i] === 'string' && cand[i].indexOf('@') > 0) { email = cand[i]; break } }\n    return { email: email, ok: !!(a.isAuthed || email) }\n  } catch (e) { return { email: '', ok: false } }\n}\nasync function emailSesion(d2) {\n  try {\n    const a = d2.auth(d2.params.auth)\n    if (!a) return ''\n    const c = []\n    try {\n      let g = a.raw && typeof a.raw.getSelectedSession === 'function' ? a.raw.getSelectedSession() : null\n      if (g && typeof g.then === 'function') g = await g\n      if (g && g.credentials) c.push(g.credentials.email)\n    } catch (e) { /* sigue con los otros caminos */ }\n    const u = a.user || {}\n    const s = a.session || {}\n    c.push(u.email, s.credentials && s.credentials.email, s.email)\n    for (let i = 0; i < c.length; i++) if (typeof c[i] === 'string' && c[i].indexOf('@') > 0) return c[i].trim().toLowerCase()\n  } catch (e) { /* sin sesión */ }\n  return ''\n}\nconst OMITIR = { SCRIPT: 1, STYLE: 1, NOSCRIPT: 1, TEMPLATE: 1, IFRAME: 1, OBJECT: 1, EMBED: 1, SVG: 1, CANVAS: 1, HEAD: 1, META: 1, LINK: 1, TITLE: 1, BUTTON: 1, SELECT: 1, INPUT: 1, TEXTAREA: 1, AUDIO: 1, VIDEO: 1 }\nconst PARRAFO = { P: 1, H1: 1, H2: 1, H3: 1, H4: 1, H5: 1, H6: 1, BLOCKQUOTE: 1, SECTION: 1, ARTICLE: 1, HEADER: 1, FOOTER: 1, MAIN: 1, ASIDE: 1, NAV: 1, FIGURE: 1, FORM: 1, FIELDSET: 1, DETAILS: 1, ADDRESS: 1, DL: 1, CENTER: 1 }\nconst LINEA = { DIV: 1, DT: 1, DD: 1, FIGCAPTION: 1, SUMMARY: 1, CAPTION: 1, LEGEND: 1 }\nfunction Escritor() { this.lineas = []; this.actual = ''; this.blancoPend = false; this.vineta = false; this.enLista = 0 }\nEscritor.prototype.texto = function (s) { this.actual += s }\nEscritor.prototype.salto = function () {\n  const t = this.actual.replace(/\\s+/g, ' ').trim()\n  this.actual = ''\n  if (!t) return\n  if (this.blancoPend && this.lineas.length) this.lineas.push('')\n  this.blancoPend = false\n  this.lineas.push(this.vineta ? '- ' + t : t)\n  this.vineta = false\n}\nEscritor.prototype.parrafo = function () { this.salto(); if (this.lineas.length && !this.enLista) this.blancoPend = true }\nEscritor.prototype.fin = function () { this.salto(); return this.lineas.join('\\n').normalize('NFC') }\nfunction textoNodo(s) { return String(s || '').replace(/[​-‍⁠﻿­]/g, '') }\nfunction recorrer(nodo, w, prof) {\n  for (let n = nodo.firstChild; n; n = n.nextSibling) {\n    if (n.nodeType === 3) { w.texto(textoNodo(n.nodeValue)); continue }\n    if (n.nodeType !== 1) continue\n    const tag = String(n.nodeName || '').toUpperCase()\n    if (OMITIR[tag]) continue\n    if (tag === 'BR') { if (w.actual.trim()) w.salto(); else if (w.lineas.length) w.blancoPend = true; continue }\n    if (tag === 'HR') { w.parrafo(); continue }\n    if (tag === 'IMG') {\n      const alt = String((n.getAttribute && n.getAttribute('alt')) || '').trim()\n      if (alt) w.texto(' [imagen: ' + alt + '] ')\n      continue\n    }\n    if (tag === 'PRE') {\n      w.parrafo()\n      textoNodo(n.textContent).split(/\\r?\\n/).forEach(function (l) { w.texto(l); w.salto() })\n      w.parrafo()\n      continue\n    }\n    if (tag === 'LI') { w.salto(); w.vineta = true; w.enLista++; recorrer(n, w, prof); w.salto(); w.enLista--; w.vineta = false; continue }\n    if (tag === 'UL' || tag === 'OL') { w.salto(); recorrer(n, w, prof + 1); w.salto(); if (!prof && !w.enLista && w.lineas.length) w.blancoPend = true; continue }\n    if (tag === 'TABLE') { w.parrafo(); tabla(n, w); w.parrafo(); continue }\n    if (tag === 'TR') { fila(n, w); continue }\n    if (tag === 'A') {\n      recorrer(n, w, prof)\n      const href = urlSegura(n.getAttribute && n.getAttribute('href'))\n      if (href && href.length <= 500 && String(n.textContent || '').indexOf(href) < 0) w.texto(' (' + href + ')')\n      continue\n    }\n    if (PARRAFO[tag]) { w.parrafo(); recorrer(n, w, prof); w.parrafo(); continue }\n    if (LINEA[tag]) { w.salto(); recorrer(n, w, prof); w.salto(); continue }\n    recorrer(n, w, prof)\n  }\n}\nfunction celdaTexto(c) {\n  const w = new Escritor()\n  recorrer(c, w, 1)\n  w.salto()\n  return w.lineas.filter(Boolean).join(' / ')\n}\nfunction fila(tr, w) {\n  const celdas = tr.cells ? Array.prototype.slice.call(tr.cells) : []\n  const txt = celdas.map(celdaTexto)\n  if (!txt.some(Boolean)) return\n  w.salto()\n  w.texto(txt.join(' | '))\n  w.salto()\n}\nfunction tabla(t, w) {\n  const filas = t.rows ? Array.prototype.slice.call(t.rows) : (t.querySelectorAll ? Array.prototype.slice.call(t.querySelectorAll('tr')) : [])\n  for (let i = 0; i < filas.length; i++) fila(filas[i], w)\n}\nfunction decodificarBasico(s) {\n  return s.replace(/&nbsp;/g, ' ').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&#39;/g, \"'\").replace(/&amp;/g, '&')\n}\nfunction htmlATexto(html) {\n  const src = String(html == null ? '' : html)\n  if (!src.trim()) return ''\n  const w = new Escritor()\n  if (!/<[a-z!/]/i.test(src)) {\n    decodificarBasico(src).replace(/\\r\\n?/g, '\\n').split('\\n').forEach(function (l) {\n      if (l.trim()) { w.texto(textoNodo(l)); w.salto() } else if (w.lineas.length) w.blancoPend = true\n    })\n    return w.fin()\n  }\n  let doc = null\n  try { doc = new DOMParser().parseFromString(src, 'text/html') } catch (e) { doc = null }\n  if (!doc || !doc.body) return htmlATexto(src.replace(/<[^>]*>/g, ' '))\n  recorrer(doc.body, w, 0)\n  return w.fin()\n}\nfunction lineaUnica(s) { return String(s || '').replace(/\\s+/g, ' ').trim() }\nfunction partirPalabras(s, max) {\n  const out = []\n  let cur = ''\n  s.split(' ').forEach(function (p) {\n    if (!p) return\n    if (p.length > max) {   // \"palabra\" absurda (URL/código): único caso en que se corta sin espacio\n      if (cur) { out.push(cur); cur = '' }\n      for (let i = 0; i < p.length; i += max) out.push(p.slice(i, i + max))\n      return\n    }\n    if (!cur) cur = p\n    else if (cur.length + 1 + p.length <= max) cur += ' ' + p\n    else { out.push(cur); cur = p }\n  })\n  if (cur) out.push(cur)\n  return out\n}\nfunction partirLargo(s, max) {\n  const frases = s.replace(/([.!?;:])\\s+/g, '$1\\u0000').split('\\u0000')\n  const out = []\n  let cur = ''\n  frases.forEach(function (f0) {\n    const f = f0.trim()\n    if (!f) return\n    if (f.length > max) {\n      if (cur) { out.push(cur); cur = '' }\n      partirPalabras(f, max).forEach(function (x) { out.push(x) })\n      return\n    }\n    if (!cur) cur = f\n    else if (cur.length + 1 + f.length <= max) cur += ' ' + f\n    else { out.push(cur); cur = f }\n  })\n  if (cur) out.push(cur)\n  return out\n}\nfunction trocear(texto, max) {\n  const trozos = []\n  let actual = ''\n  const cerrar = function () { const t = actual.trim(); if (t) trozos.push(t); actual = '' }\n  const sumar = function (pieza, sep) {\n    if (!actual) { actual = pieza; return }\n    if (actual.length + sep.length + pieza.length <= max) { actual += sep + pieza; return }\n    cerrar()\n    actual = pieza\n  }\n  String(texto || '').split(/\\n{2,}/).forEach(function (par) {\n    par.split('\\n').forEach(function (l, i) {\n      const ln = l.trim()\n      if (!ln) return\n      const sep = i === 0 ? '\\n\\n' : '\\n'\n      if (ln.length <= max) { sumar(ln, sep); return }\n      partirLargo(ln, max).forEach(function (p, k) { sumar(p, k === 0 ? sep : ' ') })\n    })\n  })\n  cerrar()\n  return trozos\n}\nfunction hex(bytes) { let s = ''; for (let i = 0; i < bytes.length; i++) s += (bytes[i] < 16 ? '0' : '') + bytes[i].toString(16); return s }\nconst K256 = [\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]\nfunction rotr(x, n) { return (x >>> n) | (x << (32 - n)) }\nfunction sha256Js(bytes) {\n  const H = new Uint32Array([0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19])\n  const len = bytes.length\n  const total = ((len + 9 + 63) >> 6) << 6\n  const m = new Uint8Array(total)\n  m.set(bytes)\n  m[len] = 0x80\n  const dv = new DataView(m.buffer)\n  dv.setUint32(total - 8, Math.floor(len / 0x20000000))\n  dv.setUint32(total - 4, (len * 8) >>> 0)\n  const w = new Uint32Array(64)\n  for (let off = 0; off < total; off += 64) {\n    for (let i = 0; i < 16; i++) w[i] = dv.getUint32(off + i * 4)\n    for (let i = 16; i < 64; i++) {\n      const s0 = rotr(w[i - 15], 7) ^ rotr(w[i - 15], 18) ^ (w[i - 15] >>> 3)\n      const s1 = rotr(w[i - 2], 17) ^ rotr(w[i - 2], 19) ^ (w[i - 2] >>> 10)\n      w[i] = (w[i - 16] + s0 + w[i - 7] + s1) | 0\n    }\n    let a = H[0], b = H[1], c = H[2], d = H[3], e = H[4], f = H[5], g = H[6], h = H[7]\n    for (let i = 0; i < 64; i++) {\n      const t1 = (h + (rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25)) + ((e & f) ^ (~e & g)) + K256[i] + w[i]) | 0\n      const t2 = ((rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22)) + ((a & b) ^ (a & c) ^ (b & c))) | 0\n      h = g; g = f; f = e; e = (d + t1) | 0; d = c; c = b; b = a; a = (t1 + t2) | 0\n    }\n    H[0] += a; H[1] += b; H[2] += c; H[3] += d; H[4] += e; H[5] += f; H[6] += g; H[7] += h\n  }\n  const out = new Uint8Array(32)\n  const ov = new DataView(out.buffer)\n  for (let i = 0; i < 8; i++) ov.setUint32(i * 4, H[i])\n  return hex(out)\n}\nasync function sha256Hex(texto) {\n  const bytes = new TextEncoder().encode(texto)\n  const c = (typeof globalThis !== 'undefined' && globalThis.crypto) || null\n  if (c && c.subtle && typeof c.subtle.digest === 'function') {\n    try { return hex(new Uint8Array(await c.subtle.digest('SHA-256', bytes))) } catch (e) { /* contexto no seguro: respaldo */ }\n  }\n  return sha256Js(bytes)\n}\nfunction sugerirCategoria(titulo, fragmentos) {\n  const t = norm(titulo)\n  const c = norm(fragmentos.slice(0, 6).map(function (x) { return x.content }).join(' ')).slice(0, 6000)\n  let mejor = '', pts = 0\n  RX_PISTAS.forEach(function (par) {\n    let s = 0\n    par[1].forEach(function (rx) { if (rx.test(t)) s += 3; if (rx.test(c)) s += 1 })\n    if (s > pts) { pts = s; mejor = par[0] }\n  })\n  return pts >= 2 ? mejor : ''\n}\nasync function prepararArticulo(x) {\n  const tituloArt = lineaUnica(htmlATexto(x.titulo_html)) || ('Artículo ' + x.article_id)\n  const fragmentos = []\n  const visto = {}\n  let omitidos = 0, secciones = 0, chars = 0\n  const secs = x.secciones_html || []\n  for (let i = 0; i < secs.length; i++) {\n    const tSec = lineaUnica(htmlATexto(secs[i].title))\n    const texto = htmlATexto(secs[i].html)\n    if (!texto) continue\n    secciones++\n    const titulo = (tSec && norm(tSec) !== norm(tituloArt)) ? tituloArt + SEP + tSec : tituloArt\n    const piezas = trocear(texto, MAX_FRAGMENTO)\n    for (let k = 0; k < piezas.length; k++) {\n      const t = piezas[k]\n      if (!/[\\p{L}\\p{N}]/u.test(t)) { omitidos++; continue }\n      const h = await sha256Hex(t)\n      if (visto[h]) { omitidos++; continue }\n      visto[h] = 1\n      fragmentos.push({ chunk_index: fragmentos.length, title: titulo, content: t, content_hash: h })\n      chars += t.length\n    }\n  }\n  return { tituloArt: tituloArt, fragmentos: fragmentos, omitidos: omitidos, secciones: secciones, chars: chars }\n}\nfunction listo(x) {\n  const n = (x.fragmentos || []).length\n  return x.estado === 'encontrado' && n > 0 && n <= MAX_FRAGMENTOS_ART && (x.mercados || []).length > 0\n}\nfunction debeForzar(x) {\n  if (!x || x.conservarCat) return false\n  if (x.baseDesconocida) return !!x.categoriaManual\n  const ex = x.existente\n  return !!(ex && (x.categoria || '') !== (ex.category || ''))\n}\nfunction errTipo(msg, tipo) { const e = new Error(msg); e.tipoNasvi = tipo; return e }\nfunction recortar(t, max) {\n  const s = String(t == null ? '' : t)\n  if (s.length <= max) return s\n  let c = s.slice(0, max - 1)\n  const i = c.lastIndexOf(' ')\n  if (i > max * 0.6) c = c.slice(0, i)\n  return c.replace(/[\\s.,;:·(\\-]+$/, '') + '…'\n}\nfunction limpiarMsg(t, ctx) {\n  let s = String(t == null ? '' : t)\n  const v = ctx && ctx.vault\n  if (v) [v.password, v.email].forEach(function (sec) { if (sec && sec.length >= 3) s = s.split(sec).join('***') })\n  s = s.replace(/(x-beedoo-set-cookie|set-cookie|cookie|password|contrase(?:ñ|n)a|senha|token|authorization)([\"']?\\s*[:=]\\s*)(\"[^\"]*\"|'[^']*'|[^\\r\\n,}]*)/gi, '$1$2***')\n  s = s.replace(/\\bBearer\\s+\\S+/gi, 'Bearer ***')\n  s = s.replace(/\\beyJ[\\w-]+\\.[\\w-]+\\.[\\w-]+/g, '***')\n  return recortar(s, 300)\n}\nfunction conLimite(p, ms, msg) {\n  let t = null\n  const reloj = new Promise(function (_, rej) {\n    t = setTimeout(function () { rej(errTipo(msg || ('el importador no respondió en ' + Math.round(ms / 60000) + ' min (puede haber terminado en el servidor)'), 'tiempo')) }, ms)\n  })\n  return Promise.race([Promise.resolve(p), reloj]).finally(function () { clearTimeout(t) })\n}\nconst LIMITE_LECTURA_MS = 30000\nfunction leerConLimite(p) { return conLimite(p, LIMITE_LECTURA_MS, 'el DataSet no respondió en ' + (LIMITE_LECTURA_MS / 1000) + ' s') }\nconst ENVOLTORIO = { data: 1, body: 1, statusCode: 1, status: 1, headers: 1 }\nfunction esRespuesta(o) { return !!o && typeof o === 'object' && !Array.isArray(o) && ('ok' in o || 'op' in o) }\nfunction desenvolver(res) {\n  let r = res\n  for (let i = 0; i < 3; i++) {\n    if (!r || typeof r !== 'object' || Array.isArray(r)) break\n    if (!('op' in r) && esRespuesta(r.data)) { r = r.data; continue }\n    if (!('op' in r) && esRespuesta(r.body)) { r = r.body; continue }\n    if (esRespuesta(r)) break\n    const ks = Object.keys(r)\n    const soloSobre = ks.length > 0 && ks.every(function (k) { return ENVOLTORIO[k] })\n    if (soloSobre && r.body && typeof r.body === 'object') { r = r.body; continue }\n    if (soloSobre && r.data && typeof r.data === 'object') { r = r.data; continue }\n    break\n  }\n  if (r && typeof r === 'object' && r.error && (r.code || r.statusCode) && !r.articles && r.ok !== true) {\n    const e = new Error(String(r.error))\n    e.status = Number(r.code || r.statusCode) || 0\n    throw e\n  }\n  return (r && typeof r === 'object') ? r : {}\n}\nasync function llamarApi(d2, ctx, payload) {\n  if (isDemo(d2)) return demoApi(d2, payload)\n  const ref = d2.params && d2.params.api\n  if (!ref) throw errTipo('El parámetro \"api\" (importador de wikis) no está conectado.', 'config')\n  const email = await emailSesion(d2)\n  if (!email) throw errTipo('No se encontró la sesión del supervisor en esta pantalla: volver a ingresar.', 'sesion')\n  if (email !== d2.state.sesEmail) poner(d2, { sesEmail: email })\n  let h\n  try { h = d2.rush(ref) } catch (e) { throw errTipo('No se pudo resolver el importador: ' + limpiarMsg((e && e.message) || e, ctx), 'config') }\n  return desenvolver(await conLimite(h.invoke(Object.assign({}, payload, { email: email })), LIMITE_MS))\n}\nfunction errInfo(e, ctx) {\n  if (e && e.tipoNasvi) return { tipo: e.tipoNasvi, status: 0, texto: limpiarMsg(e.message, ctx) }\n  let msg = String((e && (e.message || e.statusText)) || e || '')\n  const j = msg.indexOf('{')\n  if (j >= 0) {\n    try { const o = JSON.parse(msg.slice(j)); if (o && (o.error || o.message)) msg = String(o.error || o.message) + (o.code ? ' (' + o.code + ')' : '') } catch (x) { /* texto libre */ }\n  }\n  const st = Number((e && (e.status || e.statusCode || (e.response && e.response.status))) || (e && typeof e.code === 'number' ? e.code : 0)) ||\n    Number((String((e && e.message) || '').match(/\\b([45]\\d\\d)\\b/) || [])[1] || 0)\n  const s = norm(msg)\n  let tipo = 'servidor'\n  if (st === 401 || st === 403) tipo = 'sesion'\n  else if (st === 408 || st === 504) tipo = 'tiempo'\n  else if (st >= 400) tipo = 'servidor'   // 424 handler sin compilar, 500 excepción (p. ej. policy de un DataSet)\n  else if (/failed to fetch|networkerror|network error|load failed|err_internet|err_network|net::|offline/.test(s)) tipo = 'red'\n  else if (/timeout|timed out|tiempo agotado/.test(s)) tipo = 'tiempo'\n  else if (/no permissions|unauthori|forbidden|sin permiso/.test(s)) tipo = 'sesion'\n  return { tipo: tipo, status: st, texto: limpiarMsg(msg, ctx) || 'error desconocido' }\n}\nfunction textoError(inf) { return (TIPOS_ERROR[inf.tipo] || 'Error') + ': ' + inf.texto }\nconst CODIGOS = {\n  AUTH_BEEDOO: 'login', BEEDOO_NO_DISPONIBLE: 'beedoo', LECTURA_NO_AUTORIZADA: 'beedoo', MX_NO_CONFIGURADO: 'instancia', ERROR_BEEDOO: 'beedoo',\n  PAYLOAD_INVALIDO: 'config', OP_DESCONOCIDA: 'config', ACCION_DESCONOCIDA: 'config', JOB_NO_ENCONTRADO: 'servidor',\n  LECTURA_INCOMPLETA: 'servidor', INSERCION_INCOMPLETA: 'servidor', VERIFICACION_FALLIDA: 'servidor', LIMPIEZA_INCOMPLETA: 'servidor',\n  REVERSION_INCOMPLETA: 'servidor', JOB_INVALIDO: 'servidor', JOB_NO_GRABADO: 'servidor', SESION_NO_IDENTIFICADA: 'sesion'\n}\nfunction cortaLote(code, motivo) { return code === 'SESION_NO_IDENTIFICADA' || (code === 'JOB_INVALIDO' && motivo !== 'lectura' && motivo !== 'articulo') }\nfunction errorDe(r) {\n  if (!r || typeof r !== 'object') return null\n  const e = r.error\n  if (e && typeof e === 'object') return { code: String(e.code || ''), message: String(e.message || e.mensaje || '') }\n  if (r.ok === false || e) return { code: String(r.code || ''), message: String(r.message || r.mensaje || (typeof e === 'string' ? e : '') || '') }\n  return null\n}\nfunction clasificarGlobal(code, texto, ctx) {\n  const c = String(code || '').toUpperCase()\n  if (CODIGOS[c]) return { tipo: CODIGOS[c], code: c, texto: limpiarMsg(texto || c, ctx) }\n  const s = norm(String(code || '') + ' ' + String(texto || ''))\n  let tipo = 'beedoo'\n  if (/instanc|no soportad|not supported|nao suportad|placeholder|req_auth|req_read|no configurad/.test(s)) tipo = 'instancia'\n  else if (/login|auth|credencial|contrasen|password|senha|401|unauthori|cookie/.test(s)) tipo = 'login'\n  else if (/timeout|tiempo|timed out/.test(s)) tipo = 'tiempo'\n  return { tipo: tipo, texto: limpiarMsg(texto || code || 'el importador devolvió un error', ctx) }\n}\nfunction lista(res, claves) {\n  for (let i = 0; i < claves.length; i++) { const v = res && res[claves[i]]; if (Array.isArray(v)) return v }\n  return []\n}\nfunction idDe(x) {\n  if (!x || typeof x !== 'object') return ''\n  const v = x.article_id != null ? x.article_id : (x.articleId != null ? x.articleId : (x.article && x.article.id != null ? x.article.id : x.id))\n  return v == null ? '' : String(v).replace(/^0+(?=\\d)/, '')\n}\nfunction seccionesDe(a) {\n  const s = a.sessions || a.secciones || (a.article && a.article.sessions) || []\n  return (Array.isArray(s) ? s : []).map(function (x) {\n    x = x || {}\n    return { title: x.title || x.titulo || '', html: x.html != null ? x.html : (x.content != null ? x.content : (x.contenido || '')) }\n  })\n}\nfunction tagsDe(a) {\n  const t = a.tags || (a.article && a.article.tags) || []\n  return (Array.isArray(t) ? t : []).map(function (x) { return typeof x === 'string' ? x : (x && (x.name || x.title || x.label)) || '' }).map(lineaUnica).filter(Boolean).slice(0, 30)\n}\nfunction itemError(id, instance, texto, tipo) { return { article_id: id, estado: 'error', instance: instance, tipo: tipo || 'servidor', mensaje: texto } }\nfunction noExiste(id, instance) { return { article_id: id, estado: 'no_encontrado', instance: instance, mensaje: 'No existe en ' + instance + ' o el usuario de Beedoo no tiene acceso.' } }\nfunction leerBuscar(res, ids, instance, ctx) {\n  const porId = {}\n  const respaldos = []\n  let global = null\n  const eg = res && res.ok === false ? errorDe(res) : null\n  if (eg) global = clasificarGlobal(eg.code, eg.message, ctx)\n  lista(res, ['errors', 'errores']).forEach(function (e) {\n    const obj = !!e && typeof e === 'object'\n    const id = idDe(e)\n    const code = String((obj && e.code) || '').toUpperCase()\n    const inst = (obj && e.instance) ? String(e.instance) : instance\n    const texto = limpiarMsg(typeof e === 'string' ? e : (e && (e.message || e.mensaje || e.error || e.code)) || '', ctx)\n    if (obj && (e.scope === 'respaldo_mx' || inst !== instance)) {\n      respaldos.push({ id: (id && ids.indexOf(id) >= 0) ? id : '', inst: inst, code: code, texto: texto })\n    } else if (id && ids.indexOf(id) >= 0) {\n      if (code === 'NO_ENCONTRADO' || /^(no_encontrado|not_found)$/i.test(code)) porId[id] = noExiste(id, instance)\n      else porId[id] = itemError(id, instance, texto || 'Beedoo no devolvió el artículo.', (CODIGOS[code] && CODIGOS[code] !== 'config') ? CODIGOS[code] : 'beedoo')\n    } else if (!global) global = clasificarGlobal(typeof e === 'string' ? e : (e && (e.code || e.type || e.error)), texto, ctx)\n  })\n  lista(res, ['articles', 'articulos', 'resultados', 'results', 'items']).forEach(function (a) {\n    if (!a || typeof a !== 'object') return\n    const id = idDe(a)\n    if (!id || ids.indexOf(id) < 0) return\n    const st = norm(a.status || a.estado || '')\n    const secs = seccionesDe(a)\n    const enc = a.found === true || /^(encontrado|ok|found)$/.test(st) || (a.found !== false && !st && secs.length > 0)\n    const noEnc = a.found === false || /^(no_encontrado|not_found|nao_encontrado|no encontrado)$/.test(st)\n    const inst = String(a.instance || instance)\n    if (enc) {\n      porId[id] = {\n        article_id: id, estado: 'encontrado', instance: inst,\n        titulo_html: a.title || a.titulo || (a.article && (a.article.title || a.article.name)) || '',\n        secciones_html: secs,\n        url: urlSegura(a.url || a.link) || beedooUrl(inst, id),\n        source_updated_at: a.updated_at || a.updatedAt || a.source_updated_at || (a.article && (a.article.updated_at || a.article.updatedAt)) || null,\n        tags: tagsDe(a)\n      }\n    } else if (noEnc) porId[id] = noExiste(id, instance)\n    else porId[id] = itemError(id, instance, limpiarMsg(a.message || (errorDe(a) || {}).message || 'respuesta sin estado', ctx), 'beedoo')\n  })\n  respaldos.forEach(function (r) {\n    const reintentar = r.code !== 'MX_NO_CONFIGURADO'\n    ;(r.id ? [r.id] : ids).forEach(function (id) {\n      if (!porId[id] && r.id) porId[id] = noExiste(id, instance)\n      if (!porId[id] || porId[id].estado !== 'no_encontrado') return\n      porId[id] = Object.assign({}, porId[id], {\n        mensaje: 'No existe en ' + instance + '; la búsqueda en ' + r.inst + (reintentar ? ' falló (' + sinPunto(r.texto) + ').' : ' todavía no está disponible.'),\n        respaldoFallo: reintentar\n      })\n    })\n  })\n  ids.forEach(function (id) {\n    if (!porId[id]) porId[id] = global ? itemError(id, instance, global.texto, global.tipo) : itemError(id, instance, 'el importador no devolvió este artículo', 'servidor')\n  })\n  return { porId: porId, global: global }\n}\nfunction leerGravar(g, x, ctx) {\n  const MAPA = { creado: 'creado', created: 'creado', criado: 'creado', insertado: 'creado', actualizado: 'actualizado', updated: 'actualizado', atualizado: 'actualizado', sin_cambios: 'sin_cambios', 'sin cambios': 'sin_cambios', unchanged: 'sin_cambios', sem_mudancas: 'sin_cambios', error: 'error', erro: 'error' }\n  let st = MAPA[norm((g && (g.status || g.estado || g.result)) || '')] || ''\n  if (!st || (g && g.ok === false)) st = 'error'\n  const eg = st === 'error' ? errorDe(g) : null\n  const ed = (g && g.error && typeof g.error === 'object') ? g.error : {}\n  const code = eg ? String(eg.code || '').toUpperCase() : ''\n  const ver = g && g.version != null ? Number(g.version) : null\n  const n = st === 'error' ? 0 : (g && g.chunks != null ? Number(g.chunks) : x.fragmentos.length)\n  const mk = g && Array.isArray(g.markets) ? g.markets : null\n  const prev = g && Array.isArray(g.markets_previos) ? g.markets_previos : null\n  const mkTxt = mk ? ' · mercados ' + (prev && prev.join(',') !== mk.join(',') && prev.length ? prev.join(', ') + ' → ' : '') + mk.join(', ') : ''\n  let msg = ''\n  if (st === 'error') {\n    const txt = limpiarMsg((eg && eg.message) || (g && g.message) || '', ctx)\n    let extra = ''\n    if (!txt) {\n      const sinRevertir = typeof ed.sin_revertir === 'number' ? ed.sin_revertir\n        : (typeof ed.revertidos === 'number' && typeof ed.insertados === 'number' ? ed.insertados - ed.revertidos : 0)\n      if (code === 'REVERSION_INCOMPLETA' || sinRevertir > 0) extra = 'Quedaron fragmentos de la versión intentada: resincronizar el artículo.'\n      else if (NADA_GRABADO[code]) extra = x.existente ? 'La versión vigente sigue intacta.' : 'No se grabó nada.'\n      else extra = 'Revisar el artículo en la pestaña Base.'\n    }\n    msg = (txt || 'El importador no confirmó la grabación.') + (code ? ' [' + code + ']' : '') + (extra ? ' ' + extra : '')\n  } else if (st === 'creado') msg = 'Creado' + (ver != null ? ' (v' + ver + ')' : '') + ' con ' + plural(n, 'fragmento', 'fragmentos') + mkTxt + '.'\n  else if (st === 'actualizado') msg = 'Actualizado' + (ver != null ? ' a v' + ver : '') + ' con ' + plural(n, 'fragmento', 'fragmentos') + mkTxt + (g && typeof g.removidos === 'number' ? '; se quitaron ' + plural(g.removidos, 'fragmento', 'fragmentos') + ' de la versión anterior' : '') + '.'\n  else msg = 'Sin cambios: el texto, los títulos y los mercados ya estaban en la base' + (ver != null ? ' (v' + ver + ')' : '') + '.'\n  const cx = g && g.contexto && typeof g.contexto === 'object' ? g.contexto : null\n  const faqs = []\n  if (cx && Array.isArray(cx.detalle)) cx.detalle.forEach(function (d) { if (d && d.faq && d.via !== 'bajo' && faqs.indexOf(String(d.faq)) < 0) faqs.push(String(d.faq)) })\n  let ctxTxt = ''\n  if (st !== 'error' && cx) {\n    if (typeof cx.secciones === 'number') ctxTxt = ' FAQ vinculada en ' + cx.vinculadas + ' de ' + plural(cx.secciones, 'sección', 'secciones') + '.'\n    else if (typeof cx.fragmentos_vinculados === 'number') ctxTxt = ' ' + plural(cx.fragmentos_vinculados, 'fragmento sigue', 'fragmentos siguen') + ' con FAQ vinculada.'\n  }\n  const av = g && g.aviso && typeof g.aviso === 'object' ? g.aviso : null\n  if (av && st !== 'error') msg += ' Aviso: ' + limpiarMsg(av.message || av.code || '', ctx)\n  return {\n    article_id: x.article_id, instance: x.instance, status: st, chunks: isFinite(n) ? n : 0, message: recortar(msg + ctxTxt, 300),\n    version: ver, markets: mk, tipo: st === 'error' ? (CODIGOS[code] || 'servidor') : null, code: code || null, motivo: ed.motivo || null,\n    faqs: faqs.slice(0, 6), titulo: x.titulo || ''\n  }\n}\nconst NADA_GRABADO = { LECTURA_INCOMPLETA: 1, INSERCION_INCOMPLETA: 1, VERIFICACION_FALLIDA: 1, JOB_INVALIDO: 1, SESION_NO_IDENTIFICADA: 1, PAYLOAD_INVALIDO: 1 }\nfunction filasDe(res) {\n  if (Array.isArray(res)) return res\n  if (res && Array.isArray(res.data)) return res.data\n  if (res && Array.isArray(res.result)) return res.result\n  if (res && Array.isArray(res.records)) return res.records\n  return []\n}\nasync function dsFind(h, q) {\n  if (h && typeof h.find === 'function') return h.find(q)\n  if (h && h.raw && typeof h.raw.find === 'function') return h.raw.find(q)\n  if (h && typeof h.query === 'function') return h.query(q)\n  throw new Error('el DataSet no expone find()')\n}\nasync function dsAggregate(h, p) {\n  if (h && typeof h.aggregate === 'function') return h.aggregate(p)\n  if (h && h.raw && typeof h.raw.aggregate === 'function') return h.raw.aggregate(p)\n  throw new Error('el DataSet no expone aggregate()')\n}\nconst PIPELINE_BASE = [\n  { $group: {\n    _id: { article_id: '$article_id', instance: '$instance', version: '$version' },\n    chunks: { $sum: 1 }, title: { $first: '$title' }, markets: { $first: '$markets' },\n    ecommerce: { $first: '$ecommerce' }, category: { $first: '$category' }, url: { $first: '$url' },\n    imported_at: { $max: '$imported_at' }, imported_by: { $first: '$imported_by' }, job_id: { $first: '$job_id' }\n  } },\n  { $limit: 5000 }\n]\nconst CAMPOS_BASE = ['article_id', 'instance', 'version', 'title', 'markets', 'mkt_ar', 'mkt_mx', 'mkt_co', 'mkt_pe', 'mkt_cl', 'mkt_ec', 'ecommerce', 'category', 'url', 'imported_at', 'imported_by', 'job_id', 'chunk_index']\nfunction mercadosDeFila(f) {\n  if (Array.isArray(f.markets)) return unirMercados(f.markets, [])\n  return MERCADOS.filter(function (c) { return f['mkt_' + c.toLowerCase()] === true })\n}\nfunction agruparBase(filas) {\n  const por = {}\n  filas.forEach(function (f) {\n    if (!f || typeof f !== 'object') return\n    const k = (f._id && typeof f._id === 'object') ? f._id : f\n    const id = k.article_id == null ? '' : String(k.article_id)\n    if (!id) return\n    const inst = String(k.instance || '')\n    const ver = Number(k.version) || 0\n    const n = typeof f.chunks === 'number' ? f.chunks : 1\n    const clave = id + '|' + inst\n    let a = por[clave]\n    if (!a) a = por[clave] = { key: clave, article_id: id, instance: inst, version: -1, versiones: {} }\n    a.versiones[ver] = (a.versiones[ver] || 0) + n\n    if (ver > a.version) {\n      a.version = ver\n      a.title = f.title; a.markets = mercadosDeFila(f); a.ecommerce = !!f.ecommerce; a.category = f.category || ''\n      a.url = f.url || ''; a.imported_at = f.imported_at; a.imported_by = f.imported_by || ''; a.job_id = f.job_id || ''\n    } else if (ver === a.version) {\n      if (tiempoDe(f.imported_at) > tiempoDe(a.imported_at)) a.imported_at = f.imported_at\n      if (!a.title && f.title) a.title = f.title\n      if (!a.imported_by && f.imported_by) a.imported_by = f.imported_by\n    }\n  })\n  return Object.keys(por).map(function (k) {\n    const a = por[k]\n    a.chunks = a.versiones[a.version] || 0\n    a.nVersiones = Object.keys(a.versiones).length\n    a.titulo = tituloArticulo(a.title) || ('Artículo ' + a.article_id)\n    return a\n  }).sort(function (x, y) { return tiempoDe(y.imported_at) - tiempoDe(x.imported_at) })\n}\nasync function baseViaFind(h) {\n  const filas = []\n  const TAM = 200\n  let conSelect = true\n  for (let pag = 0; pag < 25; pag++) {\n    const q = { $sort: { article_id: 1, chunk_index: 1 }, $limit: TAM, $skip: pag * TAM }\n    if (conSelect) q.$select = CAMPOS_BASE\n    let res\n    try { res = await leerConLimite(dsFind(h, q)) } catch (e) {\n      if (conSelect && pag === 0 && !e.tipoNasvi) { conSelect = false; pag--; continue }\n      throw e\n    }\n    const rows = filasDe(res)\n    rows.forEach(function (r) { filas.push(r) })\n    const total = res && typeof res.total === 'number' ? res.total : null\n    if (rows.length < TAM || (total != null && filas.length >= total)) return { filas: filas, parcial: false }\n  }\n  return { filas: filas, parcial: true }\n}\nasync function cargarBase(d2, ctx) {\n  if (isDemo(d2)) {\n    poner(d2, { cargandoBase: true })\n    await dormir(200)\n    poner(d2, { base: { rows: agruparBase(demoDb(d2).t1), at: Date.now(), modo: 'demo' }, cargandoBase: false })\n    return\n  }\n  const h = d2.data('wikis')\n  if (!h) { poner(d2, { base: { rows: [], error: 'El parámetro \"wikis\" no está conectado.' } }); return }\n  poner(d2, { cargandoBase: true })\n  try {\n    let filas, modo = 'aggregate', parcial = false\n    try { filas = filasDe(await leerConLimite(dsAggregate(h, PIPELINE_BASE))) } catch (e) {\n      const r = await baseViaFind(h)   // policy sin aggregate (o aggregate colgado): find paginado\n      filas = r.filas; parcial = r.parcial; modo = 'find'\n    }\n    const rows = agruparBase(filas)\n    poner(d2, { base: { rows: rows, at: Date.now(), modo: modo, parcial: parcial, sinAutor: rows.length > 0 && rows.every(function (r) { return !r.imported_by }) } })\n  } catch (e) {\n    const prev = d2.state.base\n    poner(d2, { base: { rows: (prev && prev.rows) || [], at: prev && prev.at, error: 'No se pudo leer la base: ' + textoError(errInfo(e, ctx)) } })\n  } finally { poner(d2, { cargandoBase: false }) }\n}\nfunction ordenarJobs(rows) {\n  const stamp = function (j) { return tiempoDe(j.created_at || j.started_at || j.createdAt) || Number.MAX_SAFE_INTEGER }\n  return rows.slice().sort(function (a, b) { return stamp(b) - stamp(a) })\n}\nasync function cargarJobs(d2, ctx) {\n  if (isDemo(d2)) {\n    poner(d2, { cargandoJobs: true })\n    await dormir(200)\n    poner(d2, { jobs: { rows: ordenarJobs(demoDb(d2).t3), at: Date.now() }, cargandoJobs: false })\n    return\n  }\n  const h = d2.data('jobs')\n  if (!h) { poner(d2, { jobs: { rows: [], error: 'El parámetro \"jobs\" no está conectado.' } }); return }\n  poner(d2, { cargandoJobs: true })\n  try {\n    let rows\n    try { rows = filasDe(await leerConLimite(dsFind(h, { $sort: { created_at: -1 }, $limit: 50 }))) } catch (e) {\n      rows = (h.records && h.records()) || []\n      if (!rows.length) throw e\n    }\n    poner(d2, { jobs: { rows: ordenarJobs(rows), at: Date.now() } })\n  } catch (e) {\n    poner(d2, { jobs: { rows: [], error: 'No se pudo leer el historial: ' + textoError(errInfo(e, ctx)) } })\n  } finally { poner(d2, { cargandoJobs: false }) }\n}\nfunction filaBase(d2, clave) {\n  const b = d2.state.base\n  return ((b && b.rows) || []).filter(function (r) { return r.key === clave })[0] || null\n}\nfunction leerCred(d2, ctx) {\n  const e = d2.$('#bd-email'), p = d2.$('#bd-pass')\n  if (e) ctx.vault.email = String(e.value || '').trim()\n  if (p) ctx.vault.password = String(p.value || '')\n  return ctx.vault\n}\nasync function completarItem(d2, x, mercados) {\n  const prep = await prepararArticulo(x)\n  const b = d2.state.base\n  const base = (b && b.rows) || []\n  const ex = base.filter(function (r) { return r.article_id === x.article_id && r.instance === x.instance })[0] || null\n  const desconocida = !ex && (!b || !!b.error || !!b.parcial)\n  const sug = sugerirCategoria(prep.tituloArt, prep.fragmentos)\n  const out = {\n    article_id: x.article_id, estado: 'encontrado', instance: x.instance, url: x.url,\n    source_updated_at: x.source_updated_at, tags: x.tags || [], viaRespaldo: !!x.viaRespaldo,\n    titulo: prep.tituloArt, fragmentos: prep.fragmentos, omitidos: prep.omitidos,\n    secciones: prep.secciones, chars: prep.chars, mercados: x.mercados || mercados,\n    existente: ex ? { version: ex.version, markets: ex.markets || [], chunks: ex.chunks, category: ex.category || '', titulo: ex.titulo || '' } : null,\n    baseDesconocida: desconocida\n  }\n  if (ex) {\n    out.categoria = ex.category || ''\n    out.categoriaSugerida = false\n    out.sugerencia = (sug && sug !== out.categoria) ? sug : ''\n  } else if (desconocida) {\n    out.categoria = ''\n    out.conservarCat = true\n    out.categoriaSugerida = false\n    out.sugerencia = sug\n  } else {\n    out.categoria = sug\n    out.categoriaSugerida = !!sug\n    out.sugerencia = ''\n  }\n  if (!prep.fragmentos.length) { out.tipo = 'contenido'; out.mensaje = 'El artículo existe pero no tiene texto para importar.' }\n  else if (prep.fragmentos.length > MAX_FRAGMENTOS_ART) { out.tipo = 'largo'; out.mensaje = 'Tiene ' + prep.fragmentos.length + ' fragmentos y el importador acepta hasta ' + MAX_FRAGMENTOS_ART + ' por artículo: dividir el artículo en Beedoo.' }\n  return out   // el HTML crudo no se guarda en el estado\n}\nfunction pendiente(id, instance) { return { article_id: id, estado: 'pendiente', instance: instance } }\nfunction reintentable(x) { return x.estado === 'error' }\nfunction respaldable(x) { return x.estado === 'no_encontrado' && !!x.respaldoFallo }\nasync function previsualizar(d2, ctx, modo) {\n  if (d2.state.busy) return\n  modo = modo || 'nuevo'\n  const pvPrev = d2.state.preview\n  let ids, mk, eco, pl\n  const faltas = []\n  if (modo !== 'nuevo') {\n    if (!pvPrev || pvPrev.importado) return\n    ids = pvPrev.items.filter(modo === 'respaldo' ? respaldable : reintentable).map(function (x) { return x.article_id })\n    if (!ids.length || (modo === 'respaldo' && !pvPrev.fallback)) return\n    mk = pvPrev.markets; eco = pvPrev.ecommerce\n    pl = { instance: pvPrev.instance, fallback: pvPrev.fallback, forzada: pvPrev.forzada }\n  } else {\n    ids = leerIds(d2.state.idsText).validos\n    mk = mercadosSel(d2); eco = !!d2.state.ecommerce; pl = plan(d2)\n    if (!ids.length) faltas.push('Ingresar al menos un ID de artículo válido.')\n    else if (ids.length > MAX_IDS) faltas.push('Se admiten hasta ' + MAX_IDS + ' IDs por importación (hay ' + ids.length + '): dividir la lista.')\n    if (!mk.length) faltas.push('Elegir al menos un mercado.')\n  }\n  const cred = leerCred(d2, ctx)\n  if (!cred.email || !cred.password) faltas.push('Completar el e-mail y la contraseña de Beedoo.')\n  else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(cred.email)) faltas.push('El e-mail de Beedoo no parece válido.')\n  if (faltas.length) { poner(d2, { aviso: { tipo: 'error', texto: faltas.join(' ') } }); return }\n  const v = vida(d2)\n  v.detener = false\n  ctx.tocar()\n  const res = {}\n  if (modo !== 'nuevo') pvPrev.items.forEach(function (x) { if (modo === 'respaldo' || ids.indexOf(x.article_id) < 0) res[x.article_id] = x })\n  const orden = modo !== 'nuevo' ? pvPrev.items.map(function (x) { return x.article_id }) : ids\n  const principal = modo === 'respaldo' ? [] : ids\n  const nuevo = {\n    at: Date.now(), firma: modo !== 'nuevo' ? pvPrev.firma : firma(d2), instance: pl.instance, fallback: pl.fallback,\n    forzada: pl.forzada, markets: mk, ecommerce: eco, importado: false\n  }\n  const publicar = function () {\n    nuevo.items = orden.map(function (id) { return res[id] || pendiente(id, pl.instance) })\n    return Object.assign({}, nuevo)\n  }\n  poner(d2, { busy: 'buscar', aviso: null, resultado: null, preview: publicar(), abiertos: modo !== 'nuevo' ? (d2.state.abiertos || {}) : {}, prog: { etiqueta: 'Leyendo la base actual…', hecho: 0, total: ids.length } })\n  let corte = null, fallasSeguidas = 0, hechos = 0\n  const correr = async function (instance, lote, esRespaldo) {\n    let r, falla\n    try {\n      const c = ctx.vault\n      if (!c.email || !c.password) throw errTipo('las credenciales se olvidaron durante la consulta', 'detenido')\n      r = leerBuscar(await llamarApi(d2, ctx, { op: 'buscar', instance: instance, articleIds: lote, beedoo_email: c.email, beedoo_password: c.password }), lote, instance, ctx)\n      falla = !!r.global\n    } catch (e) {\n      const inf = errInfo(e, ctx)\n      r = { porId: {}, global: inf }\n      lote.forEach(function (id) { r.porId[id] = itemError(id, instance, inf.texto, inf.tipo) })\n      falla = true\n    }\n    fallasSeguidas = falla ? fallasSeguidas + 1 : 0\n    const g = r.global\n    if (g && (/^(login|sesion|config|detenido|instancia)$/.test(g.tipo) || g.code === 'BEEDOO_NO_DISPONIBLE' || g.code === 'LECTURA_NO_AUTORIZADA')) corte = { tipo: g.tipo, code: g.code || null, texto: g.texto, instance: instance, respaldo: esRespaldo }\n    else if (fallasSeguidas >= 2) corte = { tipo: g ? g.tipo : 'red', texto: (g && g.texto) || 'error desconocido', instance: instance, respaldo: esRespaldo, seguidas: true }\n    return r\n  }\n  try {\n    if (!d2.state.base || !(d2.state.base.rows || []).length) await cargarBase(d2, ctx)\n    const lotes = enLotes(principal, LOTE)\n    if (lotes.length) poner(d2, { prog: { etiqueta: 'Consultando Beedoo (' + pl.instance + ')…', hecho: 0, total: principal.length } })\n    for (let i = 0; i < lotes.length; i++) {\n      if (!v.activo) return\n      const lote = lotes[i]\n      if (v.detener && !corte) corte = { tipo: 'detenido', texto: 'detenido por el usuario' }\n      if (corte) { lote.forEach(function (id) { res[id] = itemError(id, pl.instance, 'No consultado: ' + sinPunto(corte.texto) + '.', corte.tipo) }); continue }\n      const r = await correr(pl.instance, lote, false)\n      for (let k = 0; k < lote.length; k++) {\n        const x = r.porId[lote[k]]\n        if (x.estado === 'encontrado') {\n          if (x.instance === INST.mx && pl.instance !== INST.mx) { x.viaRespaldo = true; x.mercados = ['MX'] }\n          res[lote[k]] = await completarItem(d2, x, mk)\n        } else res[lote[k]] = x\n      }\n      hechos += lote.length\n      poner(d2, { preview: publicar(), prog: { etiqueta: 'Consultando Beedoo (' + pl.instance + ')…', hecho: hechos, total: principal.length } })\n    }\n    if (pl.fallback && !corte) {\n      fallasSeguidas = 0   // otra instancia: el conteo de lotes fallidos empieza de nuevo\n      const faltan = ids.filter(function (id) { return res[id] && res[id].estado === 'no_encontrado' })\n      const lotesMx = enLotes(faltan, LOTE)\n      let hechosMx = 0\n      for (let i = 0; i < lotesMx.length; i++) {\n        if (!v.activo) return\n        const lote = lotesMx[i]\n        if (v.detener && !corte) corte = { tipo: 'detenido', texto: 'detenido por el usuario', instance: pl.fallback, respaldo: true }\n        if (corte) {\n          const reint = corte.tipo !== 'instancia'\n          lote.forEach(function (id) { res[id] = Object.assign({}, res[id], { mensaje: 'No existe en ' + pl.instance + (reint ? '; no se buscó en ' + pl.fallback + ' (' + sinPunto(corte.texto) + ').' : '; la búsqueda en ' + pl.fallback + ' todavía no está disponible.'), respaldoFallo: reint }) })\n          continue\n        }\n        poner(d2, { prog: { etiqueta: 'Buscando en ' + pl.fallback + ' lo que no está en ' + pl.instance + '…', hecho: hechosMx, total: faltan.length } })\n        const r = await correr(pl.fallback, lote, true)\n        for (let k = 0; k < lote.length; k++) {\n          const id = lote[k], x = r.porId[id]\n          if (x.estado === 'encontrado') { x.instance = pl.fallback; x.viaRespaldo = true; x.mercados = ['MX']; res[id] = await completarItem(d2, x, ['MX']) }\n          else if (x.estado === 'no_encontrado') res[id] = Object.assign({}, res[id], { mensaje: 'No existe en ' + pl.instance + ' ni en ' + pl.fallback + '.', respaldoFallo: false })\n          else if (x.tipo === 'instancia') res[id] = Object.assign({}, res[id], { mensaje: 'No existe en ' + pl.instance + '; la búsqueda en ' + pl.fallback + ' todavía no está disponible.', respaldoFallo: false })\n          else res[id] = Object.assign({}, res[id], { mensaje: 'No existe en ' + pl.instance + '; la búsqueda en ' + pl.fallback + ' falló (' + (TIPOS_ERROR[x.tipo] || 'error') + ': ' + sinPunto(x.mensaje) + ').', respaldoFallo: true })\n        }\n        hechosMx += lote.length\n        poner(d2, { preview: publicar() })\n      }\n    }\n  } finally {\n    if (v.activo) cerrarPrevia(d2, ctx, publicar(), corte)\n  }\n}\nfunction cerrarPrevia(d2, ctx, final, corte) {\n  let aviso = null\n  const it = final.items || []\n  if (corte && corte.tipo === 'login' && !corte.respaldo) {\n    aviso = { tipo: 'error', texto: 'Beedoo rechazó el inicio de sesión en ' + corte.instance + '. Verificar el e-mail y la contraseña de Beedoo e intentar de nuevo; los artículos no se consultaron.' }\n    ctx.olvidarClave()\n  } else if (corte && corte.tipo === 'login') {\n    aviso = { tipo: 'error', texto: 'Beedoo rechazó el inicio de sesión en ' + corte.instance + ': los artículos que no están en ' + final.instance + ' no pudieron buscarse allí. Si la cuenta de ' + corte.instance + ' es otra, cambiar las credenciales y usar «Buscar en ' + corte.instance + '».' }\n  } else if (corte && corte.tipo === 'sesion') {\n    aviso = { tipo: 'error', texto: 'La sesión no tiene permiso para usar el importador (se requiere rol supervisor) o expiró. Volver a ingresar e intentar de nuevo.' }\n  } else if (corte && corte.tipo === 'config') {\n    aviso = { tipo: 'error', texto: corte.texto }\n  } else if (corte && corte.tipo === 'instancia' && corte.respaldo) {\n    aviso = { tipo: 'info', texto: 'La búsqueda en ' + corte.instance + ' todavía no está disponible en el importador (' + sinPunto(corte.texto) + '): lo que no está en ' + final.instance + ' queda como no encontrado.' }\n  } else if (corte && corte.tipo === 'instancia') {\n    aviso = { tipo: 'error', texto: 'El importador no tiene disponible la instancia ' + corte.instance + ' (' + sinPunto(corte.texto) + '). No se consultó ningún artículo.' }\n  } else if (corte && corte.tipo === 'detenido') {\n    aviso = { tipo: 'info', texto: 'Previsualización detenida: ' + sinPunto(corte.texto) + '.' }\n  } else if (corte && corte.code === 'BEEDOO_NO_DISPONIBLE') {\n    aviso = { tipo: 'error', texto: 'Beedoo (' + corte.instance + ') no respondió al inicio de sesión: la ' + (corte.respaldo ? 'búsqueda en ' + corte.instance : 'previsualización') + ' se detuvo para no repetir el login. Lo consultado se muestra abajo; reintentar en unos minutos.' }\n  } else if (corte && corte.code === 'LECTURA_NO_AUTORIZADA') {\n    aviso = { tipo: 'error', texto: 'Beedoo (' + corte.instance + ') aceptó el inicio de sesión, pero rechazó la lectura de los artículos (HTTP 401). La ' + (corte.respaldo ? 'búsqueda en ' + corte.instance : 'previsualización') + ' se detuvo: avisar al equipo técnico (configuración de la lectura en el importador).' }\n  } else if (corte && corte.seguidas) {\n    const quien = corte.tipo === 'beedoo' ? 'Beedoo (' + corte.instance + ') no responde'\n      : corte.tipo === 'red' ? 'Falla de red'\n        : corte.tipo === 'tiempo' ? 'El importador no respondió a tiempo' : 'El importador devolvió errores'\n    aviso = { tipo: 'error', texto: quien + ': la ' + (corte.respaldo ? 'búsqueda en ' + corte.instance : 'previsualización') + ' se detuvo tras 2 lotes seguidos con error (' + sinPunto(corte.texto) + '). Lo consultado se muestra abajo; reintentar más tarde.' }\n  } else if (corte) {\n    aviso = { tipo: 'error', texto: 'Falla de red o del importador: la previsualización se interrumpió (' + sinPunto(corte.texto) + '). Lo consultado se muestra abajo; usar «Reintentar» para los que fallaron.' }\n  } else {\n    const ok = it.filter(listo).length\n    const nf = it.filter(function (x) { return x.estado === 'no_encontrado' }).length\n    const er = it.length - ok - nf - it.filter(function (x) { return x.estado === 'pendiente' }).length\n    aviso = { tipo: 'ok', texto: 'Previsualización lista: ' + plural(ok, 'artículo listo', 'artículos listos') + (nf ? ', ' + plural(nf, 'no encontrado', 'no encontrados') : '') + (er ? ', ' + plural(er, 'con error', 'con error') : '') + '.' }\n  }\n  vida(d2).foco = '#pv-t'\n  poner(d2, { busy: null, prog: null, preview: final, aviso: aviso })\n}\nfunction cargaGravar(jobId, pv, x) {\n  const art = {\n    article_id: x.article_id, source_updated_at: x.source_updated_at || null,\n    tags: x.tags || [],\n    chunks: x.fragmentos.map(function (t) { return { title: t.title, content: t.content, chunk_index: t.chunk_index, content_hash: t.content_hash } })\n  }\n  if (!x.conservarCat) art.category = x.categoria || ''\n  return {\n    op: 'gravar', job_id: jobId, instance: x.instance, ecommerce: !!pv.ecommerce && x.instance === INST.eco,\n    markets: x.mercados.slice(), forzar: debeForzar(x), article: art\n  }\n}\nasync function abrirJob(d2, ctx, job) {\n  const r = await llamarApi(d2, ctx, { op: 'job', acao: 'iniciar', job: Object.assign({ status: 'importando' }, job) })\n  const eg = r.ok === false ? errorDe(r) : null\n  if (eg) throw errTipo(limpiarMsg(eg.message || eg.code, ctx) + (eg.code ? ' [' + eg.code + ']' : ''), CODIGOS[eg.code] || 'servidor')\n  const id = r.job_id || r.jobId || (r.job && (r.job.job_id || r.job._id)) || null\n  if (!id) throw errTipo('el importador no devolvió el identificador del registro de importación', 'servidor')\n  return { job_id: String(id), identity: r.identity || null }\n}\nasync function cerrarJob(d2, ctx, jobId, status, items) {\n  try {\n    const r = await llamarApi(d2, ctx, {\n      op: 'job', acao: 'concluir',\n      job: {\n        job_id: jobId, status: status,\n        results: items.map(function (x) { return { article_id: x.article_id, instance: x.instance || null, status: x.status, chunks: x.chunks, version: x.version != null ? x.version : null, message: recortar(x.message || '', 300) } })\n      }\n    })\n    const eg = r.ok === false ? errorDe(r) : null\n    return eg ? 'El historial no registró el cierre de la importación: ' + limpiarMsg(eg.message || eg.code, ctx) : null\n  } catch (e) { return 'El historial no registró el cierre de la importación: ' + textoError(errInfo(e, ctx)) }\n}\nfunction contar(items) {\n  const c = {}\n  ;(items || []).forEach(function (r) { const k = r && r.status; if (k) c[k] = (c[k] || 0) + 1 })\n  return c\n}\nconst RESUMEN = { creado: ['creado', 'creados'], actualizado: ['actualizado', 'actualizados'], sin_cambios: ['sin cambios', 'sin cambios'], no_encontrado: ['no encontrado', 'no encontrados'], error: ['con error', 'con error'], removido: ['quitado', 'quitados'] }\nfunction resumenEstados(c) { return ORDEN_HIST.filter(function (k) { return c[k] }).map(function (k) { return plural(c[k], RESUMEN[k][0], RESUMEN[k][1]) }).join(', ') }\nconst MOTIVOS_JOB = { estado: 'ya no está en curso', autor: 'es de otro supervisor', no_existe: 'no existe', expirado: 'venció (más de 4 horas desde el inicio)' }\nfunction noGrabado(x) { return x && x.existente ? 'La versión vigente sigue intacta.' : 'No se grabó nada.' }\nasync function importar(d2, ctx) {\n  if (d2.state.busy) return\n  const pv = d2.state.preview\n  if (!pv || pv.importado || pv.firma !== firma(d2)) return\n  const listos = pv.items.filter(listo)\n  if (!listos.length) return\n  const v = vida(d2)\n  v.detener = false\n  const t0 = Date.now()\n  const porId = {}\n  pv.items.forEach(function (x) {\n    if (listo(x)) return\n    porId[x.article_id] = x.estado === 'no_encontrado'\n      ? { article_id: x.article_id, instance: x.instance, status: 'no_encontrado', chunks: 0, message: x.mensaje || 'No existe en Beedoo.' }\n      : { article_id: x.article_id, instance: x.instance, status: 'error', chunks: 0, message: (TIPOS_ERROR[x.tipo] || 'Error') + ': ' + (x.mensaje || 'no se pudo leer'), tipo: x.tipo || 'servidor' }\n  })\n  poner(d2, { busy: 'importar', aviso: null, resultado: null, prog: { etiqueta: 'Registrando la importación…', hecho: 0, total: listos.length } })\n  let jobId = null, corte = null, cierre = null, fallasSeguidas = 0\n  try {\n    try {\n      const ab = await abrirJob(d2, ctx, { instance: pv.instance, markets: pv.markets, ecommerce: pv.ecommerce, article_ids: pv.items.map(function (x) { return x.article_id }) })\n      jobId = ab.job_id\n    } catch (e) {\n      const inf = errInfo(e, ctx)\n      poner(d2, { aviso: { tipo: 'error', texto: 'No se pudo registrar la importación. ' + textoError(inf) + (/no se grab/i.test(inf.texto) ? '' : ' No se grabó nada.') } })\n      return\n    }\n    for (let k = 0; k < listos.length; k++) {\n      const x = listos[k]\n      if (!v.activo && !corte) corte = { tipo: 'detenido', texto: 'la pantalla se cerró' }\n      if (v.detener && !corte) corte = { tipo: 'detenido', texto: 'detenido por el usuario' }\n      if (corte) { porId[x.article_id] = { article_id: x.article_id, instance: x.instance, status: 'error', chunks: 0, message: 'No procesado: ' + sinPunto(corte.texto) + '. ' + noGrabado(x), tipo: corte.tipo }; continue }\n      poner(d2, { prog: { etiqueta: 'Grabando ' + x.article_id + ' (' + (k + 1) + ' de ' + listos.length + ')…', hecho: k, total: listos.length } })\n      try {\n        const g = leerGravar(await llamarApi(d2, ctx, cargaGravar(jobId, pv, x)), x, ctx)\n        porId[x.article_id] = g\n        fallasSeguidas = 0\n        if (g.status === 'error' && cortaLote(g.code, g.motivo)) {\n          corte = { tipo: CODIGOS[g.code] || 'servidor', texto: g.code === 'SESION_NO_IDENTIFICADA' ? 'el importador no identificó la sesión del supervisor' : 'el registro de la importación ' + (MOTIVOS_JOB[g.motivo] || 'no es válido') }\n        }\n      } catch (e) {\n        const inf = errInfo(e, ctx)\n        fallasSeguidas++\n        porId[x.article_id] = { article_id: x.article_id, instance: x.instance, status: 'error', chunks: 0, message: textoError(inf), tipo: inf.tipo }\n        if (inf.tipo === 'sesion' || inf.tipo === 'config') corte = { tipo: inf.tipo, texto: inf.tipo === 'sesion' ? 'la sesión no tiene permiso o expiró' : inf.texto }\n        else if (fallasSeguidas >= 2) corte = { tipo: inf.tipo, texto: 'dos grabaciones seguidas fallaron (' + (TIPOS_ERROR[inf.tipo] || 'error') + ')' }\n      }\n    }\n  } finally {\n    const items = pv.items.map(function (x) { return porId[x.article_id] }).filter(Boolean)\n    const c = contar(items)\n    const okN = (c.creado || 0) + (c.actualizado || 0) + (c.sin_cambios || 0)\n    const dur = Date.now() - t0\n    if (jobId) cierre = await cerrarJob(d2, ctx, jobId, (corte || !okN) ? 'erro' : 'concluido', items)\n    ctx.olvidar('fin')\n    if (jobId) {\n      vida(d2).foco = '#res-t'\n      poner(d2, {\n        busy: null, prog: null,\n        aviso: { tipo: (corte || c.error) ? 'info' : 'ok', texto: (corte ? 'Importación interrumpida: ' : 'Importación terminada: ') + (resumenEstados(c) || 'ningún artículo procesado') + '.' },\n        preview: Object.assign({}, pv, { importado: true }),\n        resultado: { job_id: jobId, items: items, duracion: dur, corte: corte, cierre: cierre, at: Date.now() }\n      })\n      cargarBase(d2, ctx)\n      if (d2.state.jobs) cargarJobs(d2, ctx)\n    } else poner(d2, { busy: null, prog: null })\n  }\n}\nasync function quitar(d2, ctx) {\n  const c = d2.state.confirmar\n  if (!c || d2.state.busy) return\n  poner(d2, { busy: 'remover' })\n  let jobId = null\n  try {\n    try {\n      jobId = (await abrirJob(d2, ctx, { instance: c.instance, markets: (c.markets && c.markets.length) ? c.markets : ['AR'], ecommerce: c.instance === INST.eco, article_ids: [c.article_id] })).job_id\n    } catch (e) {\n      poner(d2, { confirmar: null, avisoBase: { tipo: 'error', texto: 'No se pudo registrar la remoción; no se quitó nada. ' + textoError(errInfo(e, ctx)) } })\n      return\n    }\n    let item, aviso, cerrado = false\n    try {\n      const r = await llamarApi(d2, ctx, { op: 'remover', instance: c.instance, article_id: c.article_id, job_id: jobId })\n      cerrado = r.job_cerrado === true\n      const n = [r.removidos, r.removed, r.count, r.deleted].filter(function (x) { return typeof x === 'number' })[0]\n      const st = norm(r.status || (r.ok === false ? 'error' : 'removido'))\n      const eg = r.ok === false ? errorDe(r) : null\n      if (st === 'removido' && r.ok !== false) {\n        item = { article_id: c.article_id, instance: c.instance, status: 'removido', chunks: n || 0, message: 'Quitado de la base' + (n != null ? ' (' + plural(n, 'fragmento', 'fragmentos') + ')' : '') + ' para ' + ((r.markets || c.markets || []).join(', ') || 'todos los mercados') + '.' }\n        aviso = { tipo: 'ok', texto: 'Se quitó el artículo ' + c.article_id + ' (' + c.instance + ')' + (n != null ? ': ' + plural(n, 'fragmento eliminado', 'fragmentos eliminados') : '') + '.' }\n      } else if (st === 'no_encontrado') {\n        item = { article_id: c.article_id, instance: c.instance, status: 'no_encontrado', chunks: 0, message: 'No había fragmentos de este artículo en la base.' }\n        aviso = { tipo: 'info', texto: 'El artículo ' + c.article_id + ' ya no tenía fragmentos en la base.' }\n      } else {\n        const resto = typeof r.restantes === 'number' ? r.restantes : null\n        const txt = st === 'parcial'\n          ? 'Se quitaron ' + plural(n || 0, 'fragmento', 'fragmentos') + (resto != null ? ' y quedaron ' + resto : ', pero no se confirmó el borrado de todos') + ': repetir «Quitar» para terminar.'\n          : limpiarMsg((eg && (eg.message || eg.code)) || 'el importador rechazó la remoción', ctx)\n        item = { article_id: c.article_id, instance: c.instance, status: 'error', chunks: n || 0, message: txt }\n        aviso = { tipo: 'error', texto: 'No se pudo quitar del todo el artículo ' + c.article_id + '. ' + txt }\n      }\n    } catch (e) {\n      const inf = errInfo(e, ctx)\n      item = { article_id: c.article_id, instance: c.instance, status: 'error', chunks: 0, message: textoError(inf) }\n      aviso = { tipo: 'error', texto: 'No se pudo quitar el artículo ' + c.article_id + '. ' + textoError(inf) }\n    }\n    const cierre = cerrado ? null : await cerrarJob(d2, ctx, jobId, item.status === 'error' ? 'erro' : 'concluido', [item])\n    if (cierre) aviso = { tipo: aviso.tipo, texto: aviso.texto + ' ' + cierre }\n    poner(d2, { confirmar: null, avisoBase: aviso })\n    cargarBase(d2, ctx)\n    if (d2.state.jobs) cargarJobs(d2, ctx)\n  } finally { poner(d2, { busy: null }) }\n}\nconst DEMO_TEMAS = [\n  'Devolución de dinero por cese de consultora', 'Plazos de entrega de pedidos', 'Reseteo de contraseña de la consultora',\n  'Pedido retenido por límite de crédito', 'Cambio de dirección de entrega', 'Producto con defecto de fábrica'\n]\nconst DEMO_PARRAFO = 'Antes de cerrar la atención, el asesor confirma con la consultora el número de pedido, la fecha de facturación y el medio de pago utilizado. Si la consulta corresponde a un reclamo, se registra el caso en la herramienta de gestión con la categoría correcta y se informa el plazo estimado de respuesta. Cuando la situación no está contemplada en este procedimiento, se deriva al equipo de soporte de segundo nivel indicando el motivo y la información ya validada.'\nconst DEMO_FIJOS = { 130164: 'Devolución de dinero por cese de consultora', 211125: 'Pedido retenido por límite de crédito', 215131: 'Cambio de dirección de entrega', 478306: 'Mi Tienda Natura: medios de pago', 550019: 'Facturación de pedidos' }\nfunction demoArticulo(id, instance) {\n  const n = Number(String(id).slice(-2)) || 0\n  const tema = DEMO_FIJOS[id] || (DEMO_TEMAS[n % DEMO_TEMAS.length] + (instance === INST.mx ? ' (México)' : (instance === INST.eco ? ' — tienda online' : '')))\n  return {\n    article_id: id, found: true, instance: instance, title: tema, updated_at: new Date(Date.now() - (n + 1) * 86400000).toISOString(),\n    tags: ['demo', instance],\n    sessions: [\n      { title: 'Objetivo', html: '<p><span style=\"font-size:14px\">Orientar al asesor sobre&nbsp;<b>' + tema.toLowerCase() + '</b>.</span></p><script>window.demo=1</script><style>p{color:red}</style>' },\n      { title: 'Paso a paso', html: '<ol><li>Validar la identidad de la consultora.</li><li>Consultar el estado en el sistema.<ul><li>Si figura <b>retenido</b>, revisar el crédito disponible.</li></ul></li><li>Registrar el caso con el número de pedido.</li></ol><p>Plazo de respuesta:<br>hasta 48&nbsp;horas hábiles.</p>' },\n      { title: 'Plazos por región', html: '<table><thead><tr><th>Región</th><th>Plazo</th></tr></thead><tbody><tr><td>Capital</td><td>2 días hábiles</td></tr><tr><td>Interior</td><td>5 días hábiles</td></tr></tbody></table>' },\n      { title: 'Detalle del procedimiento', html: '<div>' + DEMO_PARRAFO + '</div><div>' + DEMO_PARRAFO.replace('Antes de cerrar', 'Al iniciar') + '</div><div>' + DEMO_PARRAFO.replace('segundo nivel', 'tercer nivel') + '</div>' }\n    ]\n  }\n}\nfunction demoInicial() {\n  const ahora = Date.now(), dia = 86400000\n  const iso = function (t) { return new Date(t).toISOString() }\n  const v = function (id, inst, ver, n, extra) { return Object.assign({ _id: { article_id: id, instance: inst, version: ver }, chunks: n, url: beedooUrl(inst, id) }, extra) }\n  return {\n    t1: [\n      v('130164', INST.latam, 1, 5, { title: 'Devolución de dinero por cese de consultora' + SEP + 'Objetivo', markets: ['AR'], ecommerce: false, category: 'REGISTRO', imported_at: iso(ahora - 3 * dia), imported_by: 'supervisor.demo@natura.net', job_id: 'demo-job-1' }),\n      v('211125', INST.latam, 2, 12, { title: 'Pedido retenido por límite de crédito' + SEP + 'Paso a paso', markets: ['AR', 'PE'], ecommerce: false, category: 'PAGOS', imported_at: iso(ahora - dia), imported_by: 'ana.supervisora@natura.net', job_id: 'demo-job-2' }),\n      v('215131', INST.latam, 2, 8, { title: 'Cambio de dirección de entrega' + SEP + 'Objetivo', markets: ['AR'], ecommerce: false, category: 'PEDIDOS', imported_at: iso(ahora - 2 * dia), imported_by: 'ana.supervisora@natura.net', job_id: 'demo-job-1' }),\n      v('215131', INST.latam, 3, 9, { title: 'Cambio de dirección de entrega' + SEP + 'Objetivo', markets: ['AR', 'CO'], ecommerce: false, category: 'PEDIDOS', imported_at: iso(ahora - 2 * dia + 60000), imported_by: 'ana.supervisora@natura.net', job_id: 'demo-job-1' }),\n      v('478306', INST.eco, 1, 7, { title: 'Mi Tienda Natura: medios de pago' + SEP + 'Tarjetas', markets: ['AR', 'MX', 'CO', 'PE', 'CL', 'EC'], ecommerce: true, category: 'VENTAS_EN_LÍNEA', imported_at: iso(ahora - 5 * dia), imported_by: 'supervisor.demo@natura.net', job_id: 'demo-job-0' }),\n      v('550019', INST.mx, 1, 4, { title: 'Facturación de pedidos (México)' + SEP + 'Objetivo', markets: ['MX'], ecommerce: false, category: 'PEDIDOS', imported_at: iso(ahora - 6 * dia), imported_by: 'supervisor.demo@natura.net', job_id: 'demo-job-0' })\n    ],\n    t3: [\n      { job_id: 'demo-job-2', created_at: iso(ahora - dia), created_by: 'ana.supervisora@natura.net', instance: INST.latam, markets: ['AR', 'PE'], ecommerce: false, article_ids: ['211125', '130110'], status: 'concluido', started_at: iso(ahora - dia), finished_at: iso(ahora - dia + 48200), duration_ms: 48200, results: [{ article_id: '211125', status: 'actualizado', chunks: 12, message: 'Actualizado a v2 con 12 fragmentos.' }, { article_id: '130110', status: 'no_encontrado', chunks: 0, message: 'No existe en naturalatam.' }] },\n      { job_id: 'demo-job-1', created_at: iso(ahora - 3 * dia), created_by: 'supervisor.demo@natura.net', instance: INST.latam, markets: ['AR'], ecommerce: false, article_ids: ['130164', '215131', '999'], status: 'concluido', started_at: iso(ahora - 3 * dia), finished_at: iso(ahora - 3 * dia + 91000), duration_ms: 91000, results: [{ article_id: '130164', status: 'creado', chunks: 5, message: 'Creado (v1) con 5 fragmentos.' }, { article_id: '215131', status: 'creado', chunks: 8, message: 'Creado (v2) con 8 fragmentos.' }, { article_id: '999', status: 'error', chunks: 0, message: 'Error de Beedoo: el servidor respondió 500.' }] },\n      { job_id: 'demo-job-0', created_at: iso(ahora - 6 * dia), created_by: 'supervisor.demo@natura.net', instance: INST.eco, markets: ['AR', 'MX', 'CO', 'PE', 'CL', 'EC'], ecommerce: true, article_ids: ['478306'], status: 'importando', started_at: iso(ahora - 6 * dia), results: [] }\n    ]\n  }\n}\nfunction demoDb(d2) { if (!d2.state.demo) d2.state.demo = demoInicial(); return d2.state.demo }\nasync function demoApi(d2, p) {\n  await dormir(p.op === 'gravar' ? 500 : 650)\n  const db = demoDb(d2)\n  const sesionDemo = 'supervisor.demo@natura.net'\n  const ahora = new Date().toISOString()\n  if (p.op === 'buscar') {\n    if (p.beedoo_password === 'x') return { ok: false, op: 'buscar', error: { code: 'AUTH_BEEDOO', message: 'Beedoo rechazó el inicio de sesión con esas credenciales.', http_status: 401 } }\n    if ((p.articleIds || []).indexOf('998') >= 0) throw new TypeError('Failed to fetch')\n    const arts = [], errs = []\n    ;(p.articleIds || []).forEach(function (id) {\n      if (id === '999') { errs.push({ article_id: id, instance: p.instance, code: 'ERROR_BEEDOO', message: 'Beedoo respondió 500 al leer el artículo.' }); return }\n      const existe = !/0$/.test(id) && (p.instance === INST.mx ? /9$/.test(id) : (p.instance === INST.eco || !/9$/.test(id)))\n      if (existe) arts.push(demoArticulo(id, p.instance))\n      else errs.push({ article_id: id, instance: p.instance, code: 'NO_ENCONTRADO', message: 'El artículo no fue encontrado o el usuario no tiene acceso a él.' })\n    })\n    return { ok: true, op: 'buscar', instance: p.instance, articles: arts, errors: errs, identity: 'sesion' }\n  }\n  if (p.op === 'job' && p.acao === 'iniciar') {\n    const j = p.job || {}\n    const id = 'demo' + Date.now().toString(36)\n    db.t3 = [{ job_id: id, created_at: ahora, created_by: sesionDemo, instance: j.instance, markets: j.markets, ecommerce: j.ecommerce, article_ids: j.article_ids, status: j.status || 'importando', started_at: ahora, results: [] }].concat(db.t3)\n    return { ok: true, op: 'job', acao: 'iniciar', job_id: id, status: j.status || 'importando', identity: 'sesion' }\n  }\n  const jobDe = function (id) { return db.t3.filter(function (j) { return j.job_id === id })[0] || null }\n  const jobInvalido = function (op, j, aid) {\n    const motivo = !j ? 'no_existe' : (j.status !== 'importando' ? 'estado' : (j.created_by !== sesionDemo ? 'autor' : ((j.article_ids || []).indexOf(aid) < 0 ? 'articulo' : '')))\n    return motivo ? { ok: false, op: op, status: 'error', article_id: aid, instance: p.instance, job_id: p.job_id, error: { code: 'JOB_INVALIDO', message: 'El registro de importación indicado no existe, ya terminó, es de otro supervisor o no incluye este artículo; no se grabó nada.', motivo: motivo }, identity: 'sesion' } : null\n  }\n  if (p.op === 'job' && p.acao === 'concluir') {\n    const j = p.job || {}\n    const x = jobDe(j.job_id)\n    if (!x) return { ok: false, op: 'job', acao: 'concluir', job_id: j.job_id, error: { code: 'JOB_NO_ENCONTRADO', message: 'No existe un registro de importación con ese identificador.' }, identity: 'sesion' }\n    if (x.status !== 'preview' && x.status !== 'importando') return { ok: false, op: 'job', acao: 'concluir', job_id: j.job_id, error: { code: 'JOB_INVALIDO', message: 'Solo el supervisor que inició la importación puede actualizarla, y solo mientras está en curso.', motivo: 'estado' }, identity: 'sesion' }\n    const dur = Date.now() - tiempoDe(x.started_at)\n    db.t3 = db.t3.map(function (y) { return y === x ? Object.assign({}, y, { status: j.status, results: j.results || y.results, finished_at: ahora, duration_ms: dur }) : y })\n    return { ok: true, op: 'job', acao: 'concluir', job_id: j.job_id, status: j.status, n_results: (j.results || x.results || []).length, descartados: 0, duration_ms: dur, identity: 'sesion' }\n  }\n  if (p.op === 'gravar') {\n    const a = p.article\n    const inv = jobInvalido('gravar', jobDe(p.job_id), a.article_id)\n    if (inv) return inv\n    const previos = db.t1.filter(function (r) { return r._id.article_id === a.article_id && r._id.instance === p.instance })\n    const ult = previos.sort(function (x, y) { return y._id.version - x._id.version })[0] || null\n    const prev = ult ? unirMercados(ult.markets, []) : []\n    const mk = unirMercados(prev, p.markets)\n    const hashes = a.chunks.map(function (c) { return c.chunk_index + ':' + c.content_hash + ':' + c.title }).join(',')\n    const cat = typeof a.category === 'string' ? a.category : (ult ? ult.category || '' : '')\n    if (ult && !p.forzar && previos.length === 1 && ult.hashes === hashes && mk.join(',') === prev.join(',')) return { ok: true, op: 'gravar', status: 'sin_cambios', article_id: a.article_id, instance: p.instance, job_id: p.job_id, chunks: ult.chunks, version: ult._id.version, markets: mk, category: ult.category || '', identity: 'sesion' }\n    const ver = ult ? ult._id.version + 1 : 1\n    const removidos = previos.reduce(function (s, r) { return s + r.chunks }, 0)\n    const secs = []\n    a.chunks.forEach(function (c) { if (secs.indexOf(c.title) < 0) secs.push(c.title) })\n    const DEMO_FAQ = ['DEVUELTO A SURCURSAL', 'AUMENTAR LÍNEA DE CRÉDITO', 'CAMBIO DE DOMICILIO']\n    const detalle = secs.map(function (s, i) { const ultima = i === secs.length - 1 && secs.length > 1; return { seccion: s, faq: ultima ? 'PLAZOS DE ENTREGA' : DEMO_FAQ[i % DEMO_FAQ.length], score: ultima ? 0.41 : 0.62, via: ultima ? 'bajo' : 'buscado' } })\n    const contexto = { mercado: (p.markets || [])[0] || 'AR', min: 0.5, secciones: secs.length, vinculadas: detalle.filter(function (d) { return d.via !== 'bajo' }).length, reutilizadas: 0, buscadas: secs.length, errores: 0, fragmentos_vinculados: a.chunks.length, detalle: detalle }\n    db.t1 = db.t1.filter(function (r) { return previos.indexOf(r) < 0 }).concat([{\n      _id: { article_id: a.article_id, instance: p.instance, version: ver }, chunks: a.chunks.length, title: (a.chunks[0] || {}).title || a.context,\n      markets: mk, ecommerce: !!p.ecommerce, category: cat, url: beedooUrl(p.instance, a.article_id), imported_at: ahora, imported_by: sesionDemo, job_id: p.job_id, hashes: hashes\n    }])\n    return { ok: true, op: 'gravar', status: ult ? 'actualizado' : 'creado', article_id: a.article_id, instance: p.instance, job_id: p.job_id, chunks: a.chunks.length, version: ver, markets: mk, markets_previos: prev, category: cat, removidos: removidos, aviso: null, contexto: contexto, verif_via: 'total', identity: 'sesion' }\n  }\n  if (p.op === 'remover') {\n    const j = jobDe(p.job_id)\n    const inv = jobInvalido('remover', j, p.article_id)\n    if (inv) return inv\n    const antes = db.t1.filter(function (r) { return r._id.article_id === p.article_id && r._id.instance === p.instance })\n    const n = antes.reduce(function (s, r) { return s + r.chunks }, 0)\n    const mk = antes.length ? unirMercados(antes[0].markets, []) : []\n    db.t1 = db.t1.filter(function (r) { return antes.indexOf(r) < 0 })\n    const item = { article_id: p.article_id, instance: p.instance, status: antes.length ? 'removido' : 'no_encontrado', chunks: n, version: null, message: antes.length ? 'Quitado de la base: ' + n + ' fragmentos (mercados ' + mk.join(', ') + ').' : 'No había fragmentos de este artículo en la base.' }\n    db.t3 = db.t3.map(function (x) { return x !== j ? x : Object.assign({}, x, { status: 'concluido', results: (x.results || []).concat([item]), finished_at: ahora, duration_ms: Date.now() - tiempoDe(x.started_at) }) })\n    if (!antes.length) return { ok: true, op: 'remover', status: 'no_encontrado', article_id: p.article_id, instance: p.instance, job_id: p.job_id, removidos: 0, restantes: 0, markets: [], versiones: [], aviso: null, error: null, job_cerrado: true, identity: 'sesion' }\n    return { ok: true, op: 'remover', status: 'removido', article_id: p.article_id, instance: p.instance, job_id: p.job_id, removidos: n, restantes: 0, markets: mk, versiones: antes.map(function (r) { return r._id.version }), aviso: null, error: null, job_cerrado: true, identity: 'sesion' }\n  }\n  return { ok: false, op: p.op, error: { code: 'OP_DESCONOCIDA', message: 'Operación desconocida: ' + p.op } }\n}\nfunction msgCaja(a, id) {\n  if (!a) return ''\n  const rol = a.tipo === 'error' ? 'alert' : 'status'\n  return '<div class=\"msg msg-' + attr(a.tipo) + '\" role=\"' + rol + '\"' + (id ? ' id=\"' + id + '\"' : '') + '>' + esc(a.texto) + '</div>'\n}\nfunction chipsMk(lista, nuevos) {\n  const l = unirMercados(lista, [])\n  if (!l.length) return '<span class=\"t2\">—</span>'\n  return l.map(function (c) { return '<span class=\"mkc' + (nuevos && nuevos.indexOf(c) >= 0 ? ' mkc-new' : '') + '\"' + (nuevos && nuevos.indexOf(c) >= 0 ? ' title=\"Mercado nuevo para este artículo\"' : '') + '>' + esc(c) + (nuevos && nuevos.indexOf(c) >= 0 ? ' +' : '') + '</span>' }).join('')\n}\nfunction pill(clase, texto, titulo) { return '<span class=\"pill pill-' + clase + '\"' + (titulo ? ' title=\"' + attr(titulo) + '\"' : '') + '>' + esc(texto) + '</span>' }\nfunction vistaProgreso(d2) {\n  const p = d2.state.prog\n  if (!p) return ''\n  const pct = p.total ? Math.min(100, Math.round((p.hecho / p.total) * 100)) : 0\n  return '<div class=\"prog-w\">'\n    + '<div class=\"prog-l\"><span>' + esc(p.etiqueta) + '</span><span>' + p.hecho + ' de ' + p.total + '</span></div>'\n    + '<div class=\"prog\" role=\"progressbar\" aria-label=\"' + attr(p.etiqueta) + '\" aria-valuemin=\"0\" aria-valuemax=\"' + p.total + '\" aria-valuenow=\"' + p.hecho + '\"><i style=\"width:' + pct + '%\"></i></div>'\n    + '<div class=\"prog-r\"><button type=\"button\" class=\"btn sm detener\">Detener</button><span class=\"hint\">Se detiene al terminar la llamada en curso.</span></div>'\n    + '</div>'\n}\nfunction vistaFormulario(d2, bz) {\n  const p = leerIds(d2.state.idsText)\n  const mk = mercadosSel(d2)\n  const eco = !!d2.state.ecommerce\n  const pl = plan(d2)\n  const reg = regiones(d2)\n  const dis = bz ? ' disabled' : ''\n  const smx = !!d2.state.soloMx\n  const disMx = (bz || smx) ? ' disabled' : ''\n  const inval = p.invalidos.slice(0, 20)\n  const estadoIds = p.validos.length\n    ? '<b>' + plural(p.validos.length, 'ID válido', 'IDs válidos') + '</b>' + (p.duplicados ? ' · ' + plural(p.duplicados, 'duplicado omitido', 'duplicados omitidos') : '') + (p.validos.length > MAX_IDS ? ' · <span class=\"warn-t\">máximo ' + MAX_IDS + ' por importación</span>' : '')\n    : 'Sin IDs todavía.'\n  let instTxt = '<b>' + esc(pl.instance) + '</b>'\n  if (pl.soloMx) instTxt += '<small>Resincronización de un artículo grabado con naturamexico: se busca solo allí y entra solo para MX. <button type=\"button\" class=\"lnk smx-off\"' + dis + '>Volver a la regla normal</button></small>'\n  else if (pl.forzada) instTxt += '<small>Resincronización de un artículo de ' + esc(pl.instance) + ': se busca solo allí y entra solo para MX. Cambiar mercados o e-commerce vuelve a la regla normal.</small>'\n  else if (eco) instTxt += '<small>Contenido de e-commerce para los mercados elegidos.</small>'\n  else if (pl.fallback) instTxt += '<small>MX: lo que no exista en naturalatam se busca en naturamexico y se importa solo para MX.</small>'\n  else instTxt += '<small>Instancia común para todos los mercados.</small>'\n  return '<div class=\"col-form\">'\n    + '<div class=\"fld\">'\n    + '<label for=\"ids\" class=\"lbl\">IDs de artículos de Beedoo</label>'\n    + '<textarea id=\"ids\" class=\"ids\" rows=\"7\" spellcheck=\"false\" autocomplete=\"off\" aria-describedby=\"ids-ayuda ids-estado\"' + dis + ' placeholder=\"130164&#10;130175&#10;211125\">' + esc(d2.state.idsText || '') + '</textarea>'\n    + '<p id=\"ids-ayuda\" class=\"hint\">Uno por línea (también se aceptan comas o espacios). Solo números; los repetidos se cuentan una vez.</p>'\n    + '<p id=\"ids-estado\" class=\"hint\" aria-live=\"polite\">' + estadoIds + '</p>'\n    + (inval.length ? '<div class=\"inval\" role=\"note\"><span>' + plural(p.invalidos.length, 'entrada inválida se ignora', 'entradas inválidas se ignoran') + ':</span> ' + inval.map(function (t, i) { return '<code data-key=\"inv-' + i + '\">' + esc(t.length > 24 ? t.slice(0, 23) + '…' : t) + '</code>' }).join(' ') + (p.invalidos.length > inval.length ? ' <span>y ' + (p.invalidos.length - inval.length) + ' más</span>' : '') + '</div>' : '')\n    + '</div>'\n    + '<fieldset class=\"fld mk\"' + disMx + '>'\n    + '<legend class=\"lbl\">Mercados</legend>'\n    + '<div class=\"mk-grid\">' + MERCADOS.map(function (c) {\n      return '<label class=\"mk-op\" data-key=\"mk-' + c + '\"><input type=\"checkbox\" class=\"mk-in\" value=\"' + c + '\"' + (mk.indexOf(c) >= 0 ? ' checked' : '') + '> <b>' + c + '</b> <span>' + esc(reg[c]) + '</span></label>'\n    }).join('') + '</div>'\n    + '<div class=\"mk-acc\"><button type=\"button\" class=\"lnk mk-todos\">Todos</button><span aria-hidden=\"true\">·</span><button type=\"button\" class=\"lnk mk-ninguno\">Ninguno</button></div>'\n    + '<p class=\"hint\">' + (smx ? 'Resincronización en naturamexico: el artículo entra solo para MX.' : 'Los mercados se suman a los que el artículo ya tenga en la base; nunca se quitan los de otro país. MX también se busca en naturalatam.') + '</p>'\n    + '</fieldset>'\n    + '<div class=\"fld sw\">'\n    + '<input type=\"checkbox\" role=\"switch\" id=\"eco\" class=\"eco\"' + (eco && !smx ? ' checked' : '') + disMx + '>'\n    + '<label for=\"eco\"><b>Contenido de e-commerce</b><span>Usa la instancia naturaecolatam.</span></label>'\n    + '</div>'\n    + '<div class=\"inst\" aria-live=\"polite\"><span class=\"lbl\">Instancia Beedoo</span>' + instTxt + '</div>'\n    + '<div class=\"fld cred\">'\n    + '<div class=\"lbl\" id=\"cred-t\">Credenciales de Beedoo</div>'\n    + '<div class=\"cred-in\" id=\"cred-box\" data-d2-static role=\"group\" aria-labelledby=\"cred-t\">'\n    + '<label for=\"bd-email\">E-mail</label>'\n    + '<input id=\"bd-email\" class=\"bd bd-email\" type=\"email\" inputmode=\"email\" autocomplete=\"off\" spellcheck=\"false\" data-lpignore=\"true\" data-1p-ignore placeholder=\"nombre@natura.net\">'\n    + '<label for=\"bd-pass\">Contraseña</label>'\n    + '<input id=\"bd-pass\" class=\"bd bd-pass\" type=\"password\" autocomplete=\"off\" data-lpignore=\"true\" data-1p-ignore placeholder=\"Contraseña de Beedoo\">'\n    + '</div>'\n    + '<p class=\"hint\">Solo en la memoria de esta pantalla: no se guardan ni se registran. Se descartan al terminar la importación, al cerrar la pantalla o tras 15 minutos sin uso.</p>'\n    + '<div class=\"cred-r\"><span class=\"cred-st' + (d2.state.credOk ? ' on' : '') + '\">' + (d2.state.credOk ? 'Credenciales en memoria' : 'Sin credenciales cargadas') + '</span>'\n    + '<button type=\"button\" class=\"btn sm olvidar\">Olvidar credenciales</button></div>'\n    + '</div>'\n    + '<button type=\"button\" class=\"btn-p previsualizar\"' + dis + '>' + (d2.state.busy === 'buscar' ? 'Consultando…' : 'Previsualizar') + '</button>'\n    + '</div>'\n}\nfunction tarjetaPreview(d2, x, bz, cerrado) {\n  const k = idDom(x.article_id)\n  if (x.estado === 'pendiente') {\n    return '<article class=\"pv pv-pend\" data-key=\"pv-' + attr(x.article_id) + '\"><div class=\"pv-h\">' + pill('eq', 'Pendiente') + '<h3 class=\"pv-t\">Artículo ' + esc(x.article_id) + '</h3></div><div class=\"pv-m\">Esperando la consulta…</div></article>'\n  }\n  if (x.estado !== 'encontrado') {\n    const nf = x.estado === 'no_encontrado'\n    return '<article class=\"pv\" data-key=\"pv-' + attr(x.article_id) + '\"><div class=\"pv-h\">'\n      + (nf ? pill('nf', 'No encontrado') : pill('er', TIPOS_ERROR[x.tipo] || 'Error'))\n      + '<h3 class=\"pv-t\">Artículo ' + esc(x.article_id) + '</h3></div>'\n      + '<div class=\"pv-m\">' + esc(x.mensaje || (nf ? 'No existe en ' + x.instance + '.' : 'No se pudo leer.')) + '</div></article>'\n  }\n  const ok = listo(x)\n  const abierto = !!(d2.state.abiertos || {})[x.article_id]\n  const ex = x.existente\n  const final = unirMercados(ex ? ex.markets : [], x.mercados)\n  const nuevos = ex ? final.filter(function (c) { return (ex.markets || []).indexOf(c) < 0 }) : []\n  return '<article class=\"pv\" data-key=\"pv-' + attr(x.article_id) + '\">'\n    + '<div class=\"pv-h\">' + (ok ? pill('ok', 'Encontrado') : pill('er', TIPOS_ERROR[x.tipo] || 'Sin texto')) + (x.viaRespaldo ? pill('up', 'vía ' + x.instance, 'No existe en naturalatam: se importa solo para MX') : '') + '<h3 class=\"pv-t\">' + esc(x.titulo) + '</h3></div>'\n    + '<div class=\"pv-m\">ID ' + (urlSegura(x.url) ? '<a href=\"' + attr(urlSegura(x.url)) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(x.article_id) + '</a>' : esc(x.article_id)) + ' · ' + esc(x.instance)\n    + ' · ' + plural(x.fragmentos.length, 'fragmento', 'fragmentos') + ' · ' + plural(x.secciones, 'sección', 'secciones') + ' · ' + kchars(x.chars)\n    + (x.omitidos ? ' · ' + plural(x.omitidos, 'fragmento repetido o vacío omitido', 'fragmentos repetidos o vacíos omitidos') : '') + '</div>'\n    + (ok ? '<div class=\"pv-g\">'\n      + '<div><span class=\"k\">Mercados</span>' + chipsMk(final, nuevos) + '</div>'\n      + '<div><span class=\"k\">En la base</span>' + (ex ? 'v' + esc(ex.version) + ' · ' + plural(ex.chunks, 'fragmento', 'fragmentos') : (x.baseDesconocida ? 'Desconocido (no se pudo leer la base)' : 'Nuevo')) + '</div>'\n      + '<div><label class=\"k\" for=\"cat-' + k + '\">Categoría</label><select id=\"cat-' + k + '\" class=\"pv-cat\" data-a=\"' + attr(x.article_id) + '\"' + ((bz || cerrado) ? ' disabled' : '') + '>'\n      + (x.baseDesconocida ? '<option value=\"' + CONSERVAR + '\"' + (x.conservarCat ? ' selected' : '') + '>Conservar la de la base</option>' : '')\n      + '<option value=\"\"' + (!x.conservarCat && !x.categoria ? ' selected' : '') + '>Sin categoría</option>'\n      + CATEGORIAS.map(function (c) { return '<option value=\"' + attr(c[0]) + '\"' + (!x.conservarCat && x.categoria === c[0] ? ' selected' : '') + '>' + esc(c[1]) + '</option>' }).join('')\n      + (x.categoria && !CATEGORIAS.some(function (c) { return c[0] === x.categoria }) ? '<option value=\"' + attr(x.categoria) + '\"' + (!x.conservarCat ? ' selected' : '') + '>' + esc(x.categoria) + '</option>' : '')\n      + '</select>' + (x.categoriaSugerida ? '<small class=\"t2\">sugerida</small>' : (x.sugerencia ? '<small class=\"t2\">sugerida: ' + esc(etiquetaCat(x.sugerencia)) + '</small>' : '')) + '</div>'\n      + '<div><span class=\"k\">FAQ vinculada</span><span class=\"t2\">Se define al importar: por sección, la FAQ curada vigente más parecida (o ninguna).</span></div>'\n      + (debeForzar(x) ? '<div class=\"pv-n\">Se graba una versión nueva aunque el texto no cambió: cambió la categoría.</div>' : '')\n      + '</div>' : '<div class=\"pv-m\">' + esc(x.mensaje || '') + '</div>')\n    + (x.fragmentos.length ? '<button type=\"button\" class=\"lnk pv-tog\" data-a=\"' + attr(x.article_id) + '\" aria-expanded=\"' + (abierto ? 'true' : 'false') + '\" aria-controls=\"tr-' + k + '\">' + (abierto ? 'Ocultar texto' : 'Ver texto (' + plural(x.fragmentos.length, 'fragmento', 'fragmentos') + ')') + '</button>' : '')\n    + (abierto ? '<ol class=\"tr-list\" id=\"tr-' + k + '\">' + x.fragmentos.map(function (t) {\n      return '<li class=\"tr\" data-key=\"' + attr(x.article_id + '-' + t.chunk_index) + '\"><div class=\"tr-h\"><b>#' + (t.chunk_index + 1) + '</b> <span>' + esc(t.title) + '</span><small>' + t.content.length + ' car. · sha-256 ' + esc(t.content_hash.slice(0, 10)) + '…</small></div><div class=\"tr-b\">' + esc(t.content) + '</div></li>'\n    }).join('') + '</ol>' : '')\n    + '</article>'\n}\nfunction vistaPreview(d2, bz) {\n  const pv = d2.state.preview\n  if (!pv) return ''\n  const it = pv.items || []\n  const ok = it.filter(listo)\n  const nf = it.filter(function (x) { return x.estado === 'no_encontrado' }).length\n  const pend = it.filter(function (x) { return x.estado === 'pendiente' }).length\n  const er = it.length - ok.length - nf - pend\n  const fragmentos = ok.reduce(function (s, x) { return s + x.fragmentos.length }, 0)\n  const vieja = !pv.importado && pv.firma !== firma(d2)\n  const reintentables = it.filter(reintentable).length\n  const respaldables = pv.fallback ? it.filter(respaldable).length : 0\n  const mks = unirMercados(ok.reduce(function (a, x) { return a.concat(x.mercados) }, []), [])\n  const b = d2.state.base\n  return '<section class=\"pvw\" aria-labelledby=\"pv-t\">'\n    + '<div class=\"sec-h\"><h2 id=\"pv-t\" class=\"h2\" tabindex=\"-1\">Previsualización</h2><span class=\"t2\">' + fecha(pv.at) + ' · ' + esc(pv.instance) + (pv.fallback ? ' (+ ' + esc(pv.fallback) + ' para MX)' : '') + '</span></div>'\n    + '<div class=\"chips\">' + pill('ok', 'Listos: ' + ok.length) + pill('nf', 'No encontrados: ' + nf) + pill('er', 'Con error: ' + er) + (pend ? pill('eq', 'Pendientes: ' + pend) : '') + '<span class=\"t2\">' + plural(fragmentos, 'fragmento', 'fragmentos') + ' en total</span></div>'\n    + (vieja ? '<div class=\"msg msg-info\" role=\"status\">Los IDs, mercados o e-commerce cambiaron desde esta previsualización: previsualizar de nuevo para poder importar.</div>' : '')\n    + (!pv.importado && b && b.error ? msgCaja({ tipo: 'info', texto: b.error + ' Por eso los artículos que no figuran en la base aparecen como «desconocido»: los mercados se suman igual en el servidor y la categoría vigente se conserva salvo que se elija otra.' }) : '')\n    + (pv.importado ? '' : '<div class=\"pv-acc\">'\n      + '<button type=\"button\" class=\"btn-p importar\"' + ((bz || !ok.length || vieja) ? ' disabled' : '') + '>Importar ' + plural(ok.length, 'artículo', 'artículos') + '</button>'\n      + (reintentables && !bz ? '<button type=\"button\" class=\"btn reintentar\">Reintentar ' + plural(reintentables, 'con error', 'con error') + '</button>' : '')\n      + (respaldables && !bz ? '<button type=\"button\" class=\"btn respaldo\">Buscar ' + respaldables + ' en ' + esc(pv.fallback) + '</button>' : '')\n      + '<button type=\"button\" class=\"btn descartar\"' + (bz ? ' disabled' : '') + '>Descartar</button>'\n      + (ok.length ? '<p class=\"hint\">Se graban ' + plural(ok.length, 'artículo', 'artículos') + ' (' + plural(fragmentos, 'fragmento', 'fragmentos') + ') para ' + esc(mks.join(', ')) + '. Una versión nueva se graba completa antes de quitar la anterior; si algo falla, la versión vigente queda intacta.' + ((nf || er) ? ' Los no encontrados y los que tuvieron error quedan registrados en el historial.' : '') + '</p>' : '')\n      + '</div>')\n    + '<div class=\"pv-list\">' + it.map(function (x) { return tarjetaPreview(d2, x, bz, pv.importado) }).join('') + '</div>'\n    + '</section>'\n}\nfunction vistaResultado(d2) {\n  const r = d2.state.resultado\n  if (!r) return ''\n  const c = contar(r.items)\n  return '<section class=\"res\" aria-labelledby=\"res-t\">'\n    + '<div class=\"sec-h\"><h2 id=\"res-t\" class=\"h2\" tabindex=\"-1\">Resultado de la importación</h2><span class=\"t2\">Registro ' + esc(r.job_id) + ' · ' + duracion(r.duracion) + '</span></div>'\n    + '<div class=\"chips\">' + ORDEN_ESTADOS.map(function (k) { return pill(ESTADOS[k][1], ESTADOS[k][0] + ': ' + (c[k] || 0)) }).join('') + '</div>'\n    + (r.corte ? msgCaja({ tipo: r.corte.tipo === 'detenido' ? 'info' : 'error', texto: 'La importación se interrumpió: ' + sinPunto(r.corte.texto) + '. Los artículos no procesados quedan marcados con error y no se grabó nada en ellos (la versión vigente, si existía, sigue intacta).' }) : '')\n    + (r.cierre ? msgCaja({ tipo: 'info', texto: r.cierre }) : '')\n    + '<div class=\"tbw\"><table class=\"tb\"><caption class=\"sr\">Resultado por artículo</caption><thead><tr><th scope=\"col\">Artículo</th><th scope=\"col\">Estado</th><th scope=\"col\" class=\"num\">Fragmentos</th><th scope=\"col\">Detalle</th></tr></thead><tbody>'\n    + r.items.map(function (it) {\n      const e = ESTADOS[it.status] || ['Error', 'er']\n      const fq = Array.isArray(it.faqs) ? it.faqs : []\n      return '<tr data-key=\"r-' + attr(it.article_id) + '\"><td>' + esc(it.article_id) + (it.titulo ? '<div class=\"t2\">' + esc(recortar(it.titulo, 80)) + '</div>' : '') + '</td><td>' + pill(e[1], it.status === 'error' && it.tipo ? (TIPOS_ERROR[it.tipo] || e[0]) : e[0]) + '</td><td class=\"num\">' + esc(it.chunks) + '</td><td>' + esc(it.message)\n        + (fq.length ? '<div class=\"t2 faqv\"><b>FAQ vinculada:</b> ' + fq.map(function (f) { return esc(f) }).join(' · ') + '</div>' : '') + '</td></tr>'\n    }).join('')\n    + '</tbody></table></div>'\n    + '<p class=\"hint\">Las credenciales de Beedoo ya se descartaron. La pestaña Base muestra el estado actualizado.</p>'\n    + '</section>'\n}\nfunction vistaImportar(d2, ses) {\n  const bz = !!d2.state.busy\n  const hay = d2.state.preview || d2.state.resultado || d2.state.prog\n  return '<div class=\"imp\">'\n    + vistaFormulario(d2, bz)\n    + '<div class=\"col-out\">'\n    + (!isDemo(d2) && !ses.ok ? '<div class=\"msg msg-info\" role=\"status\">No hay una sesión de supervisor identificada en esta pantalla: el importador va a rechazar las acciones.</div>' : '')\n    + vistaProgreso(d2)\n    + msgCaja(d2.state.aviso)\n    + vistaResultado(d2)\n    + vistaPreview(d2, bz)\n    + (hay ? '' : '<div class=\"empty\"><b>Importar wikis de Beedoo</b><span>1. Pegar los IDs. 2. Elegir mercados (y e-commerce si corresponde). 3. Completar el login de Beedoo. 4. Previsualizar el texto limpio y, si está bien, importar.</span><span>Nada se graba durante la previsualización.</span></div>')\n    + '</div></div>'\n}\nfunction filtrarBase(d2, rows) {\n  const fm = d2.state.fMk || '', fe = d2.state.fEco || '', ft = norm(d2.state.fTxt || '').trim()\n  return rows.filter(function (r) {\n    if (fm && (r.markets || []).indexOf(fm) < 0) return false\n    if (fe === 'si' && !r.ecommerce) return false\n    if (fe === 'no' && r.ecommerce) return false\n    if (ft && norm(r.titulo + ' ' + r.article_id + ' ' + r.instance + ' ' + etiquetaCat(r.category)).indexOf(ft) < 0) return false\n    return true\n  })\n}\nfunction vistaBase(d2) {\n  const b = d2.state.base\n  const cargando = !!d2.state.cargandoBase\n  const bz = !!d2.state.busy\n  const rows = (b && b.rows) || []\n  const vis = filtrarBase(d2, rows)\n  const reg = regiones(d2)\n  const fragmentosTot = vis.reduce(function (s, r) { return s + (r.chunks || 0) }, 0)\n  return '<div class=\"bar\" role=\"search\">'\n    + '<div class=\"f\"><label for=\"f-mk\">Mercado</label><select id=\"f-mk\" class=\"f-mk\"><option value=\"\">Todos</option>' + MERCADOS.map(function (c) { return '<option value=\"' + c + '\"' + (d2.state.fMk === c ? ' selected' : '') + '>' + c + ' · ' + esc(reg[c]) + '</option>' }).join('') + '</select></div>'\n    + '<div class=\"f\"><label for=\"f-eco\">E-commerce</label><select id=\"f-eco\" class=\"f-eco\"><option value=\"\">Todos</option><option value=\"si\"' + (d2.state.fEco === 'si' ? ' selected' : '') + '>Solo e-commerce</option><option value=\"no\"' + (d2.state.fEco === 'no' ? ' selected' : '') + '>Sin e-commerce</option></select></div>'\n    + '<div class=\"f f-g\"><label for=\"f-txt\">Buscar</label><input id=\"f-txt\" class=\"f-txt\" type=\"search\" placeholder=\"Título, ID o categoría\" value=\"' + attr(d2.state.fTxt || '') + '\"></div>'\n    + '<button type=\"button\" class=\"btn b-act\"' + (cargando ? ' disabled' : '') + '>' + (cargando ? 'Cargando…' : 'Actualizar') + '</button>'\n    + '</div>'\n    + msgCaja(d2.state.avisoBase)\n    + (b && b.error ? msgCaja({ tipo: 'error', texto: b.error }) : '')\n    + (b && b.parcial ? msgCaja({ tipo: 'info', texto: 'Lista parcial: la base es más grande que el límite de lectura de esta pantalla.' }) : '')\n    + (b && b.sinAutor ? '<p class=\"t2\">El DataSet conectado al parámetro «wikis» no expone imported_by: el autor de cada importación figura como «—» (ver el historial).</p>' : '')\n    + (!b ? '<div class=\"empty\"><span>' + (cargando ? 'Cargando la base…' : 'La base todavía no se cargó.') + '</span></div>'\n      : '<p class=\"t2 cnt\" aria-live=\"polite\">' + plural(vis.length, 'artículo', 'artículos') + ' · ' + plural(fragmentosTot, 'fragmento', 'fragmentos') + (vis.length !== rows.length ? ' (de ' + rows.length + ')' : '') + (b.at ? ' · leído ' + fecha(b.at) : '') + '</p>'\n      + (!vis.length ? '<div class=\"empty\"><span>' + (rows.length ? 'Ningún artículo coincide con los filtros.' : 'La base está vacía: importar artículos en la pestaña Importar.') + '</span></div>'\n        : '<div class=\"tbw\"><table class=\"tb tb-base\"><caption class=\"sr\">Artículos en la base</caption><thead><tr>'\n        + '<th scope=\"col\">Artículo</th><th scope=\"col\">Instancia</th><th scope=\"col\">Mercados</th><th scope=\"col\">E-com.</th><th scope=\"col\" class=\"num\">Fragmentos</th><th scope=\"col\">Versión</th><th scope=\"col\">Importado</th><th scope=\"col\"><span class=\"sr\">Acciones</span></th>'\n        + '</tr></thead><tbody>'\n        + vis.map(function (r) {\n          const por = r.imported_by || ''\n          const u = urlSegura(r.url)\n          return '<tr data-key=\"' + attr(r.key) + '\">'\n            + '<td><div class=\"t1\">' + esc(r.titulo) + '</div><div class=\"t2\">ID ' + (u ? '<a href=\"' + attr(u) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(r.article_id) + '</a>' : esc(r.article_id)) + (r.category ? ' · ' + esc(etiquetaCat(r.category)) : '') + '</div></td>'\n            + '<td>' + esc(r.instance) + '</td>'\n            + '<td>' + chipsMk(r.markets) + '</td>'\n            + '<td>' + (r.ecommerce ? 'Sí' : 'No') + '</td>'\n            + '<td class=\"num\">' + esc(r.chunks) + '</td>'\n            + '<td>v' + esc(r.version) + (r.nVersiones > 1 ? ' ' + pill('nf', plural(r.nVersiones, 'versión', 'versiones'), 'Hay fragmentos de más de una versión: una grabación anterior no terminó de quitar la versión vieja. Resincronizar lo resuelve.') : '') + '</td>'\n            + '<td>' + fecha(r.imported_at) + '<div class=\"t2\">' + esc(por || '—') + '</div></td>'\n            + '<td class=\"acc\"><button type=\"button\" class=\"btn sm resync\" data-k=\"' + attr(r.key) + '\"' + (bz ? ' disabled' : '') + ' aria-label=\"Resincronizar el artículo ' + attr(r.article_id) + '\">Resincronizar</button>'\n            + '<button type=\"button\" class=\"btn-d sm quitar\" data-k=\"' + attr(r.key) + '\"' + (bz ? ' disabled' : '') + ' aria-label=\"Quitar el artículo ' + attr(r.article_id) + '\">Quitar</button></td>'\n            + '</tr>'\n        }).join('')\n        + '</tbody></table></div>'))\n}\nfunction etiquetaJob(j) {\n  const e = ESTADOS_JOB[j.status] || [String(j.status || 'sin estado'), 'eq']\n  const viejo = j.status === 'importando' && tiempoDe(j.started_at || j.created_at) && (Date.now() - tiempoDe(j.started_at || j.created_at) > 30 * 60000)\n  return viejo ? ['Sin cierre', 'nf', 'La importación empezó hace más de 30 min y no se cerró (pantalla cerrada o falla). Revisar la base.'] : [e[0], e[1], '']\n}\nfunction vistaHistorial(d2) {\n  const j = d2.state.jobs\n  const cargando = !!d2.state.cargandoJobs\n  const rows = (j && j.rows) || []\n  const ab = d2.state.jobAbierto || {}\n  return '<div class=\"bar\"><p class=\"t2 cnt\" aria-live=\"polite\">' + (j ? plural(rows.length, 'registro', 'registros') + ' de importación y remoción' + (rows.length >= 50 ? ' (los 50 más recientes)' : '') : '') + '</p>'\n    + '<button type=\"button\" class=\"btn j-act\"' + (cargando ? ' disabled' : '') + '>' + (cargando ? 'Cargando…' : 'Actualizar') + '</button></div>'\n    + (j && j.error ? msgCaja({ tipo: 'error', texto: j.error }) : '')\n    + (!j ? '<div class=\"empty\"><span>' + (cargando ? 'Cargando el historial…' : 'El historial todavía no se cargó.') + '</span></div>'\n      : (!rows.length ? '<div class=\"empty\"><span>Todavía no hay importaciones registradas.</span></div>'\n        : '<div class=\"jobs\">' + rows.map(function (job, i) {\n          const k = String(job.job_id || job._id || ('job-' + i))\n          const abierto = !!ab[k]\n          const res = Array.isArray(job.results) ? job.results : []\n          const c = contar(res)\n          const e = etiquetaJob(job)\n          const nIds = Array.isArray(job.article_ids) ? job.article_ids.length : res.length\n          const dur = job.duration_ms || (tiempoDe(job.finished_at) && tiempoDe(job.started_at) ? tiempoDe(job.finished_at) - tiempoDe(job.started_at) : 0)\n          return '<article class=\"job\" data-key=\"' + attr(k) + '\">'\n            + '<button type=\"button\" class=\"job-h j-tog\" data-j=\"' + attr(k) + '\" aria-expanded=\"' + (abierto ? 'true' : 'false') + '\" aria-controls=\"jd-' + idDom(k) + '\">'\n            + '<span class=\"job-1\">' + pill(e[1], e[0], e[2]) + '<b>' + fecha(job.created_at || job.started_at || job.createdAt) + '</b><span class=\"t2\">' + esc(job.created_by || '—') + '</span></span>'\n            + '<span class=\"job-2\">' + esc(job.instance || '—') + ' · ' + chipsMk(job.markets) + (job.ecommerce ? ' · e-commerce' : '') + ' · ' + plural(nIds, 'artículo', 'artículos') + ' · ' + duracion(dur) + '</span>'\n            + '<span class=\"job-3\">' + ORDEN_HIST.filter(function (s) { return c[s] }).map(function (s) { return pill(ESTADOS[s][1], ESTADOS[s][0] + ' ' + c[s]) }).join('') + '</span>'\n            + '</button>'\n            + (abierto ? '<div class=\"job-d\" id=\"jd-' + idDom(k) + '\">' + (res.length\n              ? '<table class=\"tb\"><caption class=\"sr\">Detalle por artículo</caption><thead><tr><th scope=\"col\">Artículo</th><th scope=\"col\">Estado</th><th scope=\"col\" class=\"num\">Fragmentos</th><th scope=\"col\">Detalle</th></tr></thead><tbody>'\n                + res.map(function (r, n) {\n                  const es = ESTADOS[r.status] || [String(r.status || '—'), 'eq']\n                  return '<tr data-key=\"' + attr(k + '-' + (r.article_id || n)) + '\"><td>' + esc(r.article_id) + '</td><td>' + pill(es[1], es[0]) + '</td><td class=\"num\">' + esc(r.chunks == null ? '—' : r.chunks) + '</td><td>' + esc(r.message || '') + '</td></tr>'\n                }).join('') + '</tbody></table>'\n              : '<p class=\"t2\">Sin detalle por artículo (importación sin cierre o anterior al registro de resultados).</p>') + '</div>' : '')\n            + '</article>'\n        }).join('') + '</div>'))\n}\nfunction vistaDialogo(d2) {\n  const c = d2.state.confirmar\n  if (!c) return ''\n  const bz = d2.state.busy === 'remover'\n  return '<div class=\"scrim\">'\n    + '<div class=\"dlg\" role=\"alertdialog\" aria-modal=\"true\" aria-labelledby=\"dlg-t\" aria-describedby=\"dlg-d\">'\n    + '<h2 id=\"dlg-t\" class=\"h2\">Quitar artículo de la base</h2>'\n    + '<div id=\"dlg-d\"><p>¿Quitar <b>' + esc(c.titulo) + '</b> (ID ' + esc(c.article_id) + ' · ' + esc(c.instance) + ')?</p>'\n    + '<p>Se eliminan sus ' + plural(c.chunks, 'fragmento', 'fragmentos') + ' para <b>todos</b> los mercados (' + esc((c.markets || []).join(', ') || '—') + '). El copiloto deja de usarlo enseguida; para recuperarlo hay que importarlo de nuevo. La remoción queda registrada en el historial.</p></div>'\n    + '<div class=\"dlg-r\"><button type=\"button\" class=\"btn dlg-no\"' + (bz ? ' disabled' : '') + '>Cancelar</button><button type=\"button\" class=\"btn-d dlg-si\"' + (bz ? ' disabled' : '') + '>' + (bz ? 'Quitando…' : 'Sí, quitar artículo') + '</button></div>'\n    + '</div></div>'\n}\nconst TABS = [['importar', 'Importar'], ['base', 'Base'], ['historial', 'Historial']]\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '[hidden]{display:none!important}'\n    + '.app{--cream:rgb(254,251,244);--surf:#fff;--soft:#faf6ef;--ink:#162b37;--ink2:rgba(22,43,55,.68);--line:#e3ddd2;--olive:rgb(230,238,189);--accent:var(--acc,#FF6C0E);'\n    + '--ok-b:#e4f3d6;--ok-f:#2f5a12;--up-b:#dde9f5;--up-f:#1e4a70;--eq-b:#eeeae2;--eq-f:#46535b;--nf-b:#fbefd2;--nf-f:#77560e;--er-b:#fde6e3;--er-f:#a3261d;'\n    + 'display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.55 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;position:relative;overflow:hidden;color-scheme:light}'\n    + 'button,input,select,textarea{font:inherit;color:inherit}'\n    + 'a{color:var(--ink);text-decoration:underline;text-underline-offset:2px}'\n    + ':focus-visible{outline:2px solid var(--ink);outline-offset:2px;box-shadow:0 0 0 4px var(--accent)}'   // anillo ink ≥ 3:1 sobre crema/blanco (WCAG 1.4.11) + naranja de marca\n    + '.h2[tabindex=\"-1\"]:focus:not(:focus-visible){outline:none;box-shadow:none}'\n    + '.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:18px;padding:14px 22px;border-bottom:1px solid var(--line);background:var(--surf);flex-wrap:wrap}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}'\n    + '.brand b{font-size:22px;font-weight:700;letter-spacing:.5px}'\n    + '.brand span{font-size:12px;color:var(--ink2)}'\n    + '.sp{flex:1 1 auto;min-width:8px}'\n    + '.who{font-size:12px;color:var(--ink2);text-align:right;line-height:1.3;min-width:0}'\n    + '.who b{display:block;color:var(--ink);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:320px}'\n    + '.tag{font-size:11px;border:1px dashed rgba(22,43,55,.35);border-radius:6px;padding:2px 7px;color:var(--ink2)}'\n    + '.tabs{flex:none;display:flex;gap:2px;padding:0 22px;background:var(--surf);border-bottom:1px solid var(--line);overflow-x:auto}'\n    + '.tab{border:0;background:transparent;padding:12px 14px 10px;font-size:13px;font-weight:600;line-height:1;color:var(--ink2);cursor:pointer;border-bottom:3px solid transparent;white-space:nowrap}'\n    + '.tab[aria-selected=\"true\"]{color:var(--ink);border-bottom-color:var(--accent)}'\n    + '.tab:hover{color:var(--ink)}'\n    + '.tab .n{font-size:11px;color:var(--ink2);margin-left:6px;background:var(--soft);border:1px solid var(--line);border-radius:9px;padding:1px 7px}'\n    + '.body{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}'\n    + '.pn{flex:1 1 auto;min-height:0;overflow:auto;padding:18px 22px 26px}'\n    + '.imp{display:grid;grid-template-columns:minmax(290px,370px) minmax(0,1fr);gap:22px;align-items:start}'\n    + '.col-form{display:flex;flex-direction:column;gap:14px;background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:16px}'\n    + '.col-out{min-width:0;display:flex;flex-direction:column;gap:14px}'\n    + '.fld{margin:0;padding:0;border:0;min-width:0}'\n    + '.lbl{display:block;font-weight:700;font-size:13px;margin-bottom:6px;padding:0}'\n    + '.hint{margin:6px 0 0;font-size:12px;color:var(--ink2)}'\n    + '.warn-t{color:var(--er-f);font-weight:700}'\n    + '.ids{width:100%;resize:vertical;min-height:120px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:#fff;font-family:ui-monospace,SFMono-Regular,Consolas,monospace;font-size:13px}'\n    + '.ids:disabled,.bd:disabled,select:disabled{background:var(--soft);color:var(--ink2)}'\n    + '.inval{margin-top:8px;font-size:12px;color:var(--er-f);background:var(--er-b);border-radius:8px;padding:7px 9px;line-height:1.7}'\n    + '.inval code{background:#fff;border:1px solid rgba(163,38,29,.25);border-radius:4px;padding:0 5px;font-size:11.5px;color:var(--er-f)}'\n    + '.mk-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}'\n    + '.mk-op{display:flex;align-items:center;gap:7px;border:1px solid var(--line);border-radius:8px;padding:6px 9px;cursor:pointer;background:#fff;font-size:13px;min-width:0}'\n    + '.mk-op span{color:var(--ink2);font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.mk-op:has(input:checked){border-color:var(--ink);background:var(--olive)}'\n    + '.mk-op input,.sw input{accent-color:var(--ink);width:16px;height:16px;margin:0;flex:none}'\n    + '.mk-acc{display:flex;gap:6px;align-items:center;margin-top:6px;font-size:12px;color:var(--ink2)}'\n    + '.lnk{border:0;background:transparent;padding:2px 0;font-size:12px;font-weight:600;color:var(--ink);text-decoration:underline;text-underline-offset:2px;cursor:pointer}'\n    + '.lnk:disabled{opacity:.5;cursor:default}'\n    + '.sw{display:flex;gap:10px;align-items:flex-start;border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:#fff}'\n    + '.sw input{margin-top:3px}'\n    + '.sw label{display:flex;flex-direction:column;cursor:pointer;font-size:13px}'\n    + '.sw label span{font-size:12px;color:var(--ink2)}'\n    + '.inst{background:var(--soft);border:1px dashed var(--line);border-radius:10px;padding:9px 12px;font-size:13px}'\n    + '.inst .lbl{margin-bottom:2px;font-size:11px;letter-spacing:.6px;text-transform:uppercase;color:var(--ink2)}'\n    + '.inst b{font-size:14px}'\n    + '.inst small{display:block;color:var(--ink2);font-size:12px;margin-top:2px}'\n    + '.cred-in{display:grid;grid-template-columns:auto minmax(0,1fr);gap:7px 10px;align-items:center;font-size:13px}'\n    + '.bd{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:#fff}'\n    + '.cred-r{display:flex;align-items:center;gap:10px;justify-content:space-between;margin-top:8px;flex-wrap:wrap}'\n    + '.cred-st{font-size:12px;color:var(--ink2)}'\n    + '.cred-st::before{content:\"\";display:inline-block;width:8px;height:8px;border-radius:50%;background:#c9c2b6;margin-right:6px;vertical-align:1px}'\n    + '.cred-st.on{color:var(--ok-f);font-weight:600}.cred-st.on::before{background:#5aa52a}'\n    + '.btn-p{border:0;border-radius:8px;padding:11px 20px;background:var(--ink);color:#fff;font-size:14px;font-weight:600;line-height:1;cursor:pointer}'\n    + '.btn-p:hover:not(:disabled){background:#0d1d26}'\n    + '.btn-p:disabled{opacity:.4;cursor:default}'\n    + '.btn,.btn-d{border:1px solid var(--line);background:#fff;border-radius:8px;padding:8px 14px;font-size:13px;font-weight:600;line-height:1.1;cursor:pointer;color:var(--ink)}'\n    + '.btn:hover:not(:disabled){border-color:var(--ink)}'\n    + '.btn-d{border-color:rgba(163,38,29,.45);color:var(--er-f)}'\n    + '.btn-d:hover:not(:disabled){background:var(--er-b)}'\n    + '.btn:disabled,.btn-d:disabled{opacity:.45;cursor:default}'\n    + '.sm{padding:5px 10px;font-size:12px}'\n    + '.msg{border-radius:9px;padding:10px 12px;font-size:13px}'\n    + '.msg-error{background:#fff0ef;border:1px solid rgba(255,60,51,.45);color:#b3261e}'\n    + '.msg-ok{background:#eef8e6;border:1px solid #bfe0a6;color:var(--ok-f)}'\n    + '.msg-info{background:#fff6e6;border:1px solid #f0dcb4;color:#6f520f}'\n    + '.prog-w{background:var(--surf);border:1px solid var(--line);border-radius:12px;padding:12px 14px}'\n    + '.prog-l{display:flex;justify-content:space-between;gap:10px;font-size:13px;margin-bottom:7px}'\n    + '.prog{height:8px;border-radius:5px;background:rgba(22,43,55,.09);overflow:hidden}'\n    + '.prog i{display:block;height:100%;background:var(--accent);border-radius:5px;transition:width .25s}'\n    + '.prog-r{display:flex;align-items:center;gap:10px;margin-top:9px}.prog-r .hint{margin:0}'\n    + '.empty{display:flex;flex-direction:column;gap:6px;align-items:center;text-align:center;color:var(--ink2);font-size:13px;padding:34px 18px;border:1px dashed var(--line);border-radius:14px;background:rgba(255,255,255,.5)}'\n    + '.empty b{color:var(--ink);font-size:15px}'\n    + '.sec-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:8px}'\n    + '.h2{margin:0;font-size:16px;font-weight:700}'\n    + '.t1{font-weight:600}'\n    + '.t2{font-size:12px;color:var(--ink2)}'\n    + '.chips{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:10px}'\n    + '.pill{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.2px;border-radius:5px;padding:2px 8px;white-space:nowrap;margin-right:4px}'\n    + '.pill-ok{background:var(--ok-b);color:var(--ok-f)}.pill-up{background:var(--up-b);color:var(--up-f)}.pill-eq{background:var(--eq-b);color:var(--eq-f)}.pill-nf{background:var(--nf-b);color:var(--nf-f)}.pill-er{background:var(--er-b);color:var(--er-f)}'\n    + '.mkc{display:inline-block;font-size:11px;font-weight:700;border:1px solid var(--line);border-radius:5px;padding:0 6px;margin:0 3px 3px 0;background:#fff;line-height:18px}'\n    + '.mkc-new{border-color:var(--ink);background:var(--olive)}'\n    + '.pvw,.res{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px}'\n    + '.pv-acc{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:4px 0 12px}.pv-acc .hint{flex-basis:100%;margin:2px 0 0}'\n    + '.pv-list{display:flex;flex-direction:column;gap:10px}'\n    + '.pv{border:1px solid var(--line);border-radius:12px;padding:11px 13px;background:#fff}'\n    + '.pv-pend{opacity:.7}'\n    + '.pv-h{display:flex;align-items:center;gap:4px;flex-wrap:wrap}'\n    + '.pv-t{margin:0 0 0 4px;font-size:14px;font-weight:700;line-height:1.35;min-width:0;flex:1 1 220px}'\n    + '.pv-m{font-size:12px;color:var(--ink2);margin-top:5px}'\n    + '.pv-g{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 16px;margin-top:9px;font-size:12.5px}'\n    + '.pv-g .k{display:block;font-size:11px;letter-spacing:.5px;text-transform:uppercase;color:var(--ink2);margin-bottom:2px;font-weight:600}'\n    + '.pv-g select{padding:4px 7px;border:1px solid var(--line);border-radius:7px;background:#fff;font-size:12.5px;max-width:100%}'\n    + '.pv-g small{margin-left:6px}'\n    + '.pv-n{grid-column:1/-1;font-size:12px;color:var(--up-f);background:var(--up-b);border-radius:7px;padding:5px 9px}'\n    + '.pv-tog{margin-top:8px}'\n    + '.tr-list{list-style:none;margin:8px 0 0;padding:0;display:flex;flex-direction:column;gap:8px}'\n    + '.tr{border:1px solid var(--line);border-radius:9px;background:var(--soft);padding:8px 10px}'\n    + '.tr-h{display:flex;gap:6px;align-items:baseline;flex-wrap:wrap;font-size:12px}'\n    + '.tr-h span{font-weight:600;flex:1 1 auto;min-width:0}'\n    + '.tr-h small{color:var(--ink2);font-size:11px}'\n    + '.tr-b{margin-top:5px;font-size:12.5px;white-space:pre-wrap;overflow-wrap:anywhere;max-height:260px;overflow:auto}'\n    + '.bar{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;margin-bottom:12px}'\n    + '.f{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--ink2)}'\n    + '.f select,.f input{padding:7px 9px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--ink);font-size:13px;min-width:150px}'\n    + '.f-g{flex:1 1 220px}.f-g input{width:100%}'\n    + '.cnt{margin:0 0 8px}'\n    + '.bar .cnt{margin:0;flex:1}'\n    + '.tbw{overflow-x:auto;border:1px solid var(--line);border-radius:12px;background:#fff}'\n    + '.tb{width:100%;border-collapse:collapse;font-size:12.5px}'\n    + '.tb th{text-align:left;color:var(--ink2);font-weight:600;padding:9px 10px;border-bottom:1px solid var(--line);background:var(--soft);white-space:nowrap}'\n    + '.tb td{padding:9px 10px;border-bottom:1px solid var(--line);vertical-align:top}'\n    + '.tb tbody tr:last-child td{border-bottom:0}'\n    + '.tb .num{text-align:right;white-space:nowrap}'\n    + '.tb .acc{white-space:nowrap;text-align:right}.tb .acc .btn,.tb .acc .btn-d{margin-left:6px}'\n    + '.res .tbw{margin-top:4px}.res .hint{margin-top:10px}'\n    + '.faqv{margin-top:4px;line-height:1.4}.faqv b{color:var(--ink);font-weight:600}'\n    + '.jobs{display:flex;flex-direction:column;gap:8px}'\n    + '.job{border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden}'\n    + '.job-h{display:flex;flex-direction:column;gap:4px;width:100%;text-align:left;border:0;background:transparent;padding:11px 13px;cursor:pointer}'\n    + '.job-h:hover{background:var(--soft)}'\n    + '.job-h[aria-expanded=\"true\"]{background:var(--soft);border-bottom:1px solid var(--line)}'\n    + '.job-1{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap}'\n    + '.job-2{font-size:12px;color:var(--ink2)}'\n    + '.job-3{display:flex;flex-wrap:wrap;gap:4px}'\n    + '.job-d{padding:10px 13px}'\n    + '.job-d .tb{border:1px solid var(--line);border-radius:8px}'\n    + '.scrim{position:absolute;inset:0;background:rgba(0,0,0,.44);display:grid;place-items:center;z-index:9;padding:16px}'\n    + '.dlg{background:var(--cream);border-radius:18px;box-shadow:0 18px 50px rgba(0,0,0,.28);max-width:520px;width:100%;padding:22px 24px}'\n    + '.dlg p{margin:10px 0;font-size:13.5px}'\n    + '.dlg-r{display:flex;justify-content:flex-end;gap:10px;margin-top:16px;flex-wrap:wrap}'\n    + '@media (max-width:900px){'\n    + '.hd{gap:10px;padding:12px 16px}.brand b{font-size:19px}.who b{max-width:200px}'\n    + '.tabs{padding:0 10px}.pn{padding:14px 16px 22px}'\n    + '.imp{grid-template-columns:minmax(0,1fr)}'\n    + '.pv-g{grid-template-columns:minmax(0,1fr)}'\n    + '.f select,.f input{min-width:0}.f{flex:1 1 140px}'\n    + '.tb-base{min-width:820px}.tb-base td:first-child{min-width:200px}'\n    + '}',\n  render(d2) {\n    const tab = d2.state.tab || 'importar'\n    const ses = sesion(d2)\n    const demo = isDemo(d2)\n    const nBase = d2.state.base && d2.state.base.rows ? d2.state.base.rows.length : null\n    const nJobs = d2.state.jobs && d2.state.jobs.rows ? d2.state.jobs.rows.length : null\n    const cuenta = { base: nBase, historial: nJobs }\n    return '<div class=\"app\" data-ready data-version=\"' + VERSION + '\" style=\"--acc:' + attr(acento(d2)) + '\">'\n      + '<header class=\"hd\">'\n      + '<div class=\"brand\"><b>NASVI</b><span>Base de wikis</span></div>'\n      + '<div class=\"sp\"></div>'\n      + (demo ? '<span class=\"tag\" title=\"Datos ficticios: contraseña «x» simula login rechazado; IDs que terminan en 0 o en 9 no existen; 999 da error de Beedoo; 998, falla de red.\">demo</span>' : '')\n      + '<div class=\"who\"><b>' + esc(ses.email || (ses.ok ? 'Sesión activa' : 'Sin sesión')) + '</b>' + (ses.ok ? 'Sesión de Agents Tools' : 'Ingresar como supervisor') + '</div>'\n      + '</header>'\n      + '<div class=\"tabs\" role=\"tablist\" aria-label=\"Secciones de la base de wikis\">'\n      + TABS.map(function (t) {\n        const sel = t[0] === tab\n        return '<button type=\"button\" role=\"tab\" class=\"tab\" id=\"tb-' + t[0] + '\" data-tab=\"' + t[0] + '\" aria-selected=\"' + (sel ? 'true' : 'false') + '\" aria-controls=\"pn-' + t[0] + '\" tabindex=\"' + (sel ? '0' : '-1') + '\">' + t[1] + (cuenta[t[0]] != null ? '<span class=\"n\">' + cuenta[t[0]] + '</span>' : '') + '</button>'\n      }).join('')\n      + '</div>'\n      + '<div class=\"body\">'\n      + '<section class=\"pn\" role=\"tabpanel\" id=\"pn-importar\" aria-labelledby=\"tb-importar\"' + (tab === 'importar' ? '' : ' hidden') + '>' + vistaImportar(d2, ses) + '</section>'\n      + '<section class=\"pn\" role=\"tabpanel\" id=\"pn-base\" aria-labelledby=\"tb-base\"' + (tab === 'base' ? '' : ' hidden') + '>' + (tab === 'base' ? vistaBase(d2) : '') + '</section>'\n      + '<section class=\"pn\" role=\"tabpanel\" id=\"pn-historial\" aria-labelledby=\"tb-historial\"' + (tab === 'historial' ? '' : ' hidden') + '>' + (tab === 'historial' ? vistaHistorial(d2) : '') + '</section>'\n      + '</div>'\n      + vistaDialogo(d2)\n      + '</div>'\n  },\n  mounted(d2) {\n    const v = vida(d2)\n    v.activo = true\n    const vault = { email: '', password: '' }\n    let reloj = null\n    const limpiarInputs = function (soloClave) {\n      const p = d2.$('#bd-pass'); if (p) p.value = ''\n      if (!soloClave) { const e = d2.$('#bd-email'); if (e) e.value = '' }\n    }\n    const ctx = {\n      vault: vault,\n      tocar: function () {\n        if (reloj) clearTimeout(reloj)\n        reloj = setTimeout(function () {\n          if (d2.state.busy) { ctx.tocar(); return }\n          if (vault.email || vault.password || d2.state.credOk) ctx.olvidar('inactividad')\n        }, OLVIDO_MS)\n      },\n      olvidar: function (motivo) {\n        vault.email = ''; vault.password = ''\n        if (reloj) { clearTimeout(reloj); reloj = null }\n        limpiarInputs(false)\n        const o = { credOk: false }\n        if (motivo === 'inactividad') o.aviso = { tipo: 'info', texto: 'Las credenciales de Beedoo se descartaron tras 15 minutos sin uso.' }\n        if (motivo === 'manual') o.aviso = { tipo: 'info', texto: 'Credenciales de Beedoo descartadas.' }\n        poner(d2, o)\n      },\n      olvidarClave: function () {\n        vault.password = ''\n        limpiarInputs(true)\n        poner(d2, { credOk: false })\n        v.foco = '#bd-pass'\n      }\n    }\n    const marcarCred = function () {\n      leerCred(d2, ctx)\n      const ok = !!(vault.email && vault.password)\n      if (ok !== !!d2.state.credOk) poner(d2, { credOk: ok })\n      if (vault.email || vault.password) ctx.tocar()\n    }\n    d2.onUnmount(function () {\n      v.activo = false\n      vault.email = ''; vault.password = ''\n      if (reloj) clearTimeout(reloj)\n    })\n    d2.on(window, 'pagehide', function () { vault.email = ''; vault.password = ''; limpiarInputs(false); poner(d2, { credOk: false }) })\n    if (!d2.state.tab) {\n      const ini = { tab: 'importar', mercados: [], ecommerce: false, idsText: '' }\n      if (isDemo(d2)) { ini.idsText = '130164\\n130175\\n211125\\n132750\\n175799\\n999\\n211125\\nabc'; ini.mercados = ['AR', 'MX'] }\n      d2.setState(ini)\n    }\n    const r0 = d2.data('regiones')\n    if (r0 && !r0.records().length) r0.refresh()\n    if (!isDemo(d2)) emailSesion(d2).then(function (e) { if (e && e !== d2.state.sesEmail) poner(d2, { sesEmail: e }) })\n    const irA = function (t) {\n      d2.state.tab = t\n      if (t === 'base' && !d2.state.base && !d2.state.cargandoBase) cargarBase(d2, ctx)\n      if (t === 'historial' && !d2.state.jobs && !d2.state.cargandoJobs) cargarJobs(d2, ctx)\n    }\n    d2.on('.tab', 'click', function (e, el) { irA(el.dataset.tab) })\n    d2.on('.tab', 'keydown', function (e, el) {\n      const orden = TABS.map(function (t) { return t[0] })\n      let i = orden.indexOf(el.dataset.tab)\n      if (e.key === 'ArrowRight') i = (i + 1) % orden.length\n      else if (e.key === 'ArrowLeft') i = (i + orden.length - 1) % orden.length\n      else if (e.key === 'Home') i = 0\n      else if (e.key === 'End') i = orden.length - 1\n      else return\n      e.preventDefault()\n      irA(orden[i])\n      v.foco = '#tb-' + orden[i]\n    })\n    d2.on('#ids', 'input', function (e, el) { d2.state.idsText = el.value })\n    d2.on('.mk-in', 'change', function (e, el) {\n      const m = mercadosSel(d2).filter(function (c) { return c !== el.value })\n      if (el.checked) m.push(el.value)\n      d2.setState({ mercados: m, instForzada: null })\n    })\n    d2.on('.mk-todos', 'click', function () { if (!d2.state.busy && !d2.state.soloMx) d2.setState({ mercados: MERCADOS.slice(), instForzada: null }) })\n    d2.on('.mk-ninguno', 'click', function () { if (!d2.state.busy && !d2.state.soloMx) d2.setState({ mercados: [], instForzada: null }) })\n    d2.on('.eco', 'change', function (e, el) { d2.setState({ ecommerce: !!el.checked, instForzada: null }) })\n    d2.on('.smx-off', 'click', function () { if (!d2.state.busy) d2.setState({ soloMx: false, instForzada: null }) })\n    d2.on('.bd', 'input', marcarCred)\n    d2.on('.bd', 'change', marcarCred)\n    d2.on('.bd-pass', 'keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); previsualizar(d2, ctx, 'nuevo') } })\n    d2.on('.olvidar', 'click', function () { ctx.olvidar('manual') })\n    d2.on('.previsualizar', 'click', function () { previsualizar(d2, ctx, 'nuevo') })\n    d2.on('.reintentar', 'click', function () { previsualizar(d2, ctx, 'reintentar') })\n    d2.on('.respaldo', 'click', function () { previsualizar(d2, ctx, 'respaldo') })\n    d2.on('.detener', 'click', function () {\n      if (!d2.state.busy) return\n      v.detener = true\n      poner(d2, { prog: Object.assign({}, d2.state.prog, { etiqueta: 'Deteniendo al terminar la llamada en curso…' }) })\n    })\n    d2.on('.descartar', 'click', function () { if (!d2.state.busy) d2.setState({ preview: null, abiertos: {}, aviso: null }) })\n    d2.on('.importar', 'click', function () { importar(d2, ctx) })\n    d2.on('.pv-tog', 'click', function (e, el) {\n      const a = Object.assign({}, d2.state.abiertos || {})\n      a[el.dataset.a] = !a[el.dataset.a]\n      d2.state.abiertos = a\n    })\n    d2.on('.pv-cat', 'change', function (e, el) {\n      const pv = d2.state.preview\n      if (!pv || d2.state.busy) return\n      const conservar = el.value === CONSERVAR\n      d2.state.preview = Object.assign({}, pv, { items: pv.items.map(function (x) { return x.article_id === el.dataset.a ? Object.assign({}, x, { categoria: conservar ? '' : el.value, conservarCat: conservar, categoriaManual: !conservar, categoriaSugerida: false }) : x }) })\n    })\n    d2.on('.f-mk', 'change', function (e, el) { d2.state.fMk = el.value })\n    d2.on('.f-eco', 'change', function (e, el) { d2.state.fEco = el.value })\n    d2.on('.f-txt', 'input', function (e, el) { d2.state.fTxt = el.value })\n    d2.on('.b-act', 'click', function () { if (!d2.state.cargandoBase) { d2.state.avisoBase = null; cargarBase(d2, ctx) } })\n    d2.on('.resync', 'click', function (e, el) {\n      if (d2.state.busy) return\n      const r = filaBase(d2, el.dataset.k)\n      if (!r) return\n      const mk = (r.markets || []).filter(function (c) { return MERCADOS.indexOf(c) >= 0 })\n      d2.setState({\n        tab: 'importar', idsText: r.article_id, mercados: r.instance === INST.mx ? ['MX'] : mk,\n        ecommerce: r.instance === INST.eco, instForzada: null, soloMx: r.instance === INST.mx,\n        preview: null, resultado: null, abiertos: {},\n        aviso: { tipo: 'info', texto: 'Artículo ' + r.article_id + ' cargado para resincronizar (' + r.instance + ' · ' + (mk.join(', ') || 'sin mercados') + '). Completar el login de Beedoo y previsualizar.' }\n      })\n      v.foco = d2.state.credOk ? '.previsualizar' : '#bd-email'\n    })\n    d2.on('.quitar', 'click', function (e, el) {\n      if (d2.state.busy) return\n      const r = filaBase(d2, el.dataset.k)\n      if (!r) return\n      v.volver = el.dataset.k\n      d2.setState({ confirmar: { article_id: r.article_id, instance: r.instance, titulo: r.titulo, chunks: r.chunks, markets: r.markets } })\n    })\n    const cerrarDlg = function () { if (d2.state.busy !== 'remover') d2.state.confirmar = null }\n    d2.on('.dlg-no', 'click', cerrarDlg)\n    d2.on('.dlg-si', 'click', function () { quitar(d2, ctx) })\n    d2.on('.scrim', 'click', function (e, el) { if (e.target === el) cerrarDlg() })\n    d2.on('.dlg', 'keydown', function (e) {\n      if (e.key !== 'Tab') return\n      const f = d2.$$('.dlg button:not([disabled])')\n      if (!f.length) return\n      const raiz = d2.root && d2.root.getRootNode ? d2.root.getRootNode() : document\n      const act = raiz.activeElement\n      if (e.shiftKey && act === f[0]) { e.preventDefault(); f[f.length - 1].focus() }\n      else if (!e.shiftKey && act === f[f.length - 1]) { e.preventDefault(); f[0].focus() }\n    })\n    d2.on(document, 'keydown', function (e) { if (e.key === 'Escape' && d2.state.confirmar) cerrarDlg() })\n    d2.on('.j-act', 'click', function () { if (!d2.state.cargandoJobs) cargarJobs(d2, ctx) })\n    d2.on('.j-tog', 'click', function (e, el) {\n      const a = Object.assign({}, d2.state.jobAbierto || {})\n      a[el.dataset.j] = !a[el.dataset.j]\n      d2.state.jobAbierto = a\n    })\n  },\n  updated(d2) {\n    const v = vida(d2)\n    const bz = !!d2.state.busy\n    d2.$$('.bd').forEach(function (el) { if (el.disabled !== bz) el.disabled = bz })\n    const dlg = d2.$('.dlg')\n    if (dlg && !v.dlg) {\n      v.dlg = true\n      const b = d2.$('.dlg-no')\n      if (b) b.focus()\n    } else if (!dlg && v.dlg) {\n      v.dlg = false\n      const back = v.volver ? d2.$$('.quitar').filter(function (b) { return b.dataset.k === v.volver })[0] : null\n      const alt = d2.$('.b-act')\n      if (back) back.focus(); else if (alt) alt.focus()\n      v.volver = null\n    }\n    if (v.foco) {\n      const el = d2.$(v.foco)\n      v.foco = null\n      if (el && !el.disabled) el.focus()\n    }\n  }\n}\n"}},"api":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"api"}}}},"wikis":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"wikis"}}}},"jobs":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"jobs"}}}},"regiones":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"regiones"}}}},"auth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"auth"}}}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}}}}}}}},{"_id":"6acee31db48793739f877d94","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"NasviCopiloto","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// NasviCopiloto — NASVI v4, copiloto del asesor (Agents Tools AR / MX).\n// Todo el trabajo pesado corre en el listener nasvi-v4-api-operador: perfil de la sesión,\n// búsqueda híbrida (FAQ curada + wikis), prompt, IA (cerebras) y telemetría. La pantalla\n// solo arma el pedido y muestra la respuesta. Sin fuente confiable la API no llama a la IA\n// y la pantalla dice \"sin información\" en vez de inventar.\n// Respuestas con fuente piden voto 1–5 antes de la próxima consulta (comentario si nota <= 2).\n// El texto de la IA se muestra con un markdown propio que escapa todo el HTML.\n\nconst VERSION = 'copiloto-4.2.2'\nconst MERCADOS = ['AR', 'MX', 'CO', 'PE', 'CL', 'EC']\nconst NOMBRES = { AR: 'Argentina', MX: 'México', CO: 'Colombia', PE: 'Perú', CL: 'Chile', EC: 'Ecuador' }\nconst ORIGENES = [['chat', 'Chat'], ['voz', 'Voz'], ['video', 'Video']]\nconst VOTO = {\n  1: ['No encontré nada útil', 'Sin respuesta o sin relevancia para la consulta'],\n  2: ['Encontré muy poca información', 'Respuesta incompleta o poco relevante'],\n  3: ['Encontré parte de la información', 'Resolvió parcialmente, hubo que buscar más'],\n  4: ['Encontré casi todo lo que buscaba', 'Útil en gran parte, con pequeños vacíos'],\n  5: ['Encontré exactamente lo que necesitaba', 'Respuesta clara, completa y satisfactoria']\n}\nconst PEND_MS = 8 * 3600 * 1000\nconst LIMITE_MS = 90000\nconst AYUDA = 'Soy **NASVI**, tu copiloto durante la atención.\\n\\n'\n  + '- Busco primero en las **wikis del asesor** (Beedoo) y completo con la **FAQ de AVI**: es la más actualizada, pero está escrita para la consultora, así que la uso solo como dato.\\n'\n  + '- Cada dato de la respuesta indica su fuente con un número, por ejemplo [1]. Tocá el número para ver esa fuente en el panel **Fuentes**.\\n'\n  + '- Si no encuentro una fuente confiable, te lo digo y **no invento** una respuesta.\\n'\n  + '- Después de cada respuesta, evaluala de 1 a 5. Con nota 1 o 2, contanos qué faltó: así se mejora la base.\\n\\n'\n  + 'Atajos: **Enter** envía · **Shift+Enter** nueva línea.'\nconst TIPOS = { faq: 'FAQ de AVI (bot)', beedoo: 'Wiki del asesor · AR', mx: 'Wiki del asesor · MX', regla: 'Regla operativa México', wiki: 'Wiki del asesor' }\n\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;').replace(/'/g, '&#39;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\nfunction dormir(ms) { return new Promise(function (r) { setTimeout(r, ms) }) }\nfunction urlSegura(u) { const s = String(u || '').trim(); return /^https?:\\/\\/[^\\s\"'<>]+$/i.test(s) ? s : '' }\nfunction acento(d2) {\n  const v = String(d2.param('accent', '') || '').trim()\n  return /^(#[0-9a-f]{3,8}|(rgb|hsl)a?\\([0-9.,%\\s/deg]+\\)|[a-z]{3,24})$/i.test(v) ? v : '#FF6C0E'\n}\nfunction appDe(d2) { const a = String(d2.param('app', 'ar') || 'ar').toLowerCase(); return a === 'mx' ? 'mx' : 'ar' }\nfunction nf(n, d) { const v = Number(n); if (!isFinite(v)) return '—'; return v.toLocaleString('es', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }) }\n\n// ---- estado no reactivo (borradores) ----\nconst VIDA = new WeakMap()\nfunction vida(d2) {\n  let v = VIDA.get(d2)\n  if (!v) { v = { activo: true, borrador: '', comentario: '', reloj: null }; VIDA.set(d2, v) }\n  return v\n}\nfunction poner(d2, o) { if (vida(d2).activo) d2.setState(o) }\n\n// ---- localStorage (siempre en try/catch; por usuario) ----\nfunction lsGet(k) { try { const v = window.localStorage.getItem(k); return v ? JSON.parse(v) : null } catch (e) { return null } }\nfunction lsSet(k, v) { try { window.localStorage.setItem(k, JSON.stringify(v)) } catch (e) { /* sin almacenamiento */ } }\nfunction lsDel(k) { try { window.localStorage.removeItem(k) } catch (e) { /* sin almacenamiento */ } }\nfunction kPend(email) { return 'nasvi.v4.pendiente.' + String(email || '').toLowerCase() }\nfunction kMk(email) { return 'nasvi.v4.mercado.' + String(email || '').toLowerCase() }\n\n// ---- markdown seguro: escapa TODO y después aplica un subconjunto ----\n// 【1】, [1, 2], [1†fuente] -> [1][2]: la IA a veces cita con otros formatos\nfunction normCitas(t) {\n  return String(t || '').replace(/[【\\[]+\\s*(\\d{1,2})\\s*[,;]\\s*(\\d{1,2})\\s*[,;]\\s*(\\d{1,2})\\s*[\\]】]+/g, '[$1][$2][$3]')\n    .replace(/[【\\[]+\\s*(\\d{1,2})\\s*[,;]\\s*(\\d{1,2})\\s*[\\]】]+/g, '[$1][$2]')\n    .replace(/[【\\[]+\\s*(\\d{1,2})(?:\\s*†[^\\]】]*)?\\s*[\\]】]+/g, '[$1]')\n    .replace(/【\\s*(\\d{1,2})\\s*(?:[:†,;][^】]*)?】/g, '[$1]')\n}\nfunction enlace(url, txt) { return '<a href=\"' + attr(url) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + txt + '</a>' }\n// inerte = números de cita sin acción (ayuda, voto pendiente antes de cargar las fuentes)\nfunction inline(t, nf, inerte) {\n  const code = [], links = []\n  function guardar(h) { links.push(h); return '\\u0001' + (links.length - 1) + '\\u0001' }\n  let s = normCitas(t).replace(/`([^`]+)`/g, function (m, c) { code.push(c); return '\\u0000' + (code.length - 1) + '\\u0000' })\n  s = s.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, function (m, txt, u) {\n    const url = urlSegura(u.replace(/&amp;/g, '&'))\n    return url ? guardar(enlace(url, txt)) : txt\n  })\n  // URL suelta (la IA copia el link de la wiki): enlace seguro, sin la puntuación final\n  s = s.replace(/https?:\\/\\/[^\\s<\\[\\u0001*]+/g, function (m) {\n    const fin = (m.match(/[.,;:!?)\\]]+$/) || [''])[0]\n    const base = fin ? m.slice(0, m.length - fin.length) : m\n    const url = urlSegura(base.replace(/&amp;/g, '&'))\n    return url ? guardar(enlace(url, base)) + fin : m\n  })\n  s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>')\n  s = s.replace(/(^|[^*])\\*([^*\\s][^*]*)\\*/g, '$1<em>$2</em>')\n  s = s.replace(/\\s*\\[(\\d{1,2})\\]/g, function (m, n) {\n    const k = Number(n)\n    if (inerte) return k >= 1 ? ' <span class=\"cit cit-i\">' + k + '</span>' : ''\n    if (k >= 1 && k <= nf) return ' <button class=\"cit\" data-n=\"' + k + '\" title=\"Ver fuente ' + k + '\" aria-label=\"Fuente ' + k + '\">' + k + '</button>'\n    return ''\n  })\n  // citas seguidas quedan juntas y pegadas a la palabra anterior (no se parten entre líneas)\n  s = s.replace(/(?: <(?:button|span) class=\"cit[^\"]*\"[^>]*>\\d{1,2}<\\/(?:button|span)>)+/g, function (m) { return '&nbsp;<span class=\"cits\">' + m.replace(/ </g, '<') + '</span>' })\n  s = s.replace(/\\u0001(\\d+)\\u0001/g, function (m, i) { return links[Number(i)] })\n  s = s.replace(/\\u0000(\\d+)\\u0000/g, function (m, i) { return '<code>' + code[Number(i)] + '</code>' })\n  return s\n}\nfunction markdown(texto, nFuentes, inerte) {\n  const lineas = esc(texto).replace(/\\r/g, '').split('\\n')\n  const out = []\n  let lista = null, parr = [], sub = false\n  function ln(x) { return inline(x, nFuentes, inerte) }\n  function cerrarParr() { if (parr.length) { out.push('<p>' + ln(parr.join(' ')) + '</p>'); parr = [] } }\n  function cerrarSub() { if (sub) { out.push('</ul></li>'); sub = false } }\n  function cerrarLista() { cerrarSub(); if (lista) { if (lista === 'ol' && out.length && /<\\/li>$/.test(out[out.length - 1]) === false && /<li>/.test(out[out.length - 1])) out.push('</li>'); out.push('</' + lista + '>'); lista = null } }\n  for (let i = 0; i < lineas.length; i++) {\n    const l = lineas[i]\n    const t = l.trim()\n    if (!t) { cerrarParr(); cerrarLista(); continue }\n    let m = t.match(/^(#{1,4})\\s+(.*)$/)\n    if (m) { cerrarParr(); cerrarLista(); out.push('<h4>' + ln(m[2]) + '</h4>'); continue }\n    m = t.match(/^&gt;\\s?(.*)$/)\n    if (m) { cerrarParr(); cerrarLista(); out.push('<blockquote>' + ln(m[1]) + '</blockquote>'); continue }\n    m = t.match(/^(\\d{1,2})[.)]\\s+(.*)$/)\n    if (m) {\n      cerrarParr(); cerrarSub()\n      if (lista !== 'ol') { cerrarLista(); out.push('<ol start=\"' + Number(m[1]) + '\">'); lista = 'ol' }\n      out.push('<li>' + ln(m[2]) + '</li>'); continue\n    }\n    m = t.match(/^[-*•]\\s+(.*)$/)\n    if (m) {\n      cerrarParr()\n      // viñeta con sangría dentro de una lista numerada = sublista del último paso\n      if (lista === 'ol' && /^\\s{2,}/.test(l) && /<\\/li>$/.test(out[out.length - 1] || '')) {\n        if (!sub) { out[out.length - 1] = out[out.length - 1].replace(/<\\/li>$/, ''); out.push('<ul>'); sub = true }\n        out.push('<li>' + ln(m[1]) + '</li>'); continue\n      }\n      cerrarSub()\n      if (lista !== 'ul') { cerrarLista(); out.push('<ul>'); lista = 'ul' }\n      out.push('<li>' + ln(m[1]) + '</li>'); continue\n    }\n    cerrarLista()\n    parr.push(t)\n  }\n  cerrarParr(); cerrarLista()\n  return out.join('')\n}\nfunction textoPlano(t) { return String(t || '').replace(/\\*\\*([^*]+)\\*\\*/g, '$1').replace(/`([^`]+)`/g, '$1') }\n// texto para pegar en el ticket: citas normalizadas + lista de las fuentes citadas al final\nfunction textoCopia(answer, fuentes) {\n  let t = normCitas(textoPlano(answer))\n  t = t.split('\\n').map(function (l) { return l.replace(/\\s+$/, '') }).join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim()\n  if (!t) return ''\n  const usadas = {}\n  t.replace(/\\[(\\d{1,2})\\]/g, function (m, n) { usadas[Number(n)] = true; return m })\n  const lista = (fuentes || []).filter(function (f) { return usadas[Number(f.n)] }).map(function (f) {\n    const u = urlSegura(f.url)\n    return '[' + f.n + '] ' + (f.tipo || TIPOS[f.corpus] || '') + ' — ' + (f.titulo || '') + (u ? ' (' + u + ')' : '')\n  })\n  return lista.length ? t + '\\n\\nFuentes:\\n' + lista.join('\\n') : t\n}\nfunction copiar(d2, t) {\n  function viejo() {\n    try {\n      const ta = document.createElement('textarea')\n      ta.value = t; ta.setAttribute('readonly', ''); ta.style.position = 'fixed'; ta.style.top = '0'; ta.style.opacity = '0'\n      const host = d2.$('.app') || document.body\n      host.appendChild(ta); ta.focus(); ta.select()\n      const ok = document.execCommand('copy')\n      ta.remove()\n      return !!ok\n    } catch (e) { return false }\n  }\n  try {\n    if (navigator.clipboard && navigator.clipboard.writeText) return navigator.clipboard.writeText(t).then(function () { return true }, function () { return viejo() })\n  } catch (e) { /* sigue con el método viejo */ }\n  return Promise.resolve(viejo())\n}\n\n// ---- llamada a la API ----\nfunction errTipo(msg, tipo, status) { const e = new Error(msg); e.tipoNasvi = tipo; e.status = status || 0; return e }\nfunction conLimite(p, ms) {\n  let t = null\n  const reloj = new Promise(function (_, rej) { t = setTimeout(function () { rej(errTipo('La API no respondió a tiempo.', 'tiempo')) }, ms) })\n  return Promise.race([Promise.resolve(p), reloj]).finally(function () { clearTimeout(t) })\n}\nfunction esResp(o) { return !!o && typeof o === 'object' && !Array.isArray(o) && ('ok' in o || 'op' in o) }\nfunction desenvolver(res) {\n  let r = res\n  for (let i = 0; i < 3; i++) {\n    if (!r || typeof r !== 'object' || Array.isArray(r)) break\n    if (esResp(r)) break\n    if (esResp(r.data)) { r = r.data; continue }\n    if (esResp(r.body)) { r = r.body; continue }\n    if (r.data && typeof r.data === 'object') { r = r.data; continue }\n    break\n  }\n  if (r && typeof r === 'object' && r.error && (r.code || r.statusCode) && !('ok' in r)) {\n    throw errTipo(String(r.error.message || r.error), 'servidor', Number(r.code || r.statusCode) || 0)\n  }\n  return (r && typeof r === 'object') ? r : {}\n}\nfunction clasificar(e) {\n  if (e && e.tipoNasvi) return { tipo: e.tipoNasvi, texto: e.message }\n  const msg = String((e && (e.message || e.statusText)) || e || '')\n  const st = Number((e && (e.status || e.statusCode || (e.response && e.response.status))) || 0) || Number((msg.match(/\\b([45]\\d\\d)\\b/) || [])[1] || 0)\n  if (st === 401 || st === 403 || /unauthori|no permissions|forbidden/i.test(msg)) return { tipo: 'sesion', texto: 'Su sesión expiró o no tiene permiso. Vuelva a iniciar sesión.' }\n  if (/failed to fetch|network|load failed|net::|offline/i.test(msg)) return { tipo: 'red', texto: 'Sin conexión con el servidor. Verifique su red e intente nuevamente.' }\n  if (/timeout|tiempo/i.test(msg)) return { tipo: 'tiempo', texto: 'El servidor tardó demasiado. Intente nuevamente.' }\n  return { tipo: 'servidor', texto: 'Error del servidor' + (st ? ' (' + st + ')' : '') + '. Intente nuevamente.' }\n}\n// El e-mail de la sesión viaja en cada pedido: la policy del listener solo deja pasar si es\n// IGUAL al de la sesión ($session.credentials.email), así la API puede confiar en él.\n// De .user solo se lee .email (las credenciales incluyen la contraseña).\n// .user / .session vienen vacíos después del login (el runtime limpia cursor.current.credentials);\n// la sesión completa está en raw.getSelectedSession().credentials.\nasync function emailSesion(d2) {\n  try {\n    const a = d2.auth(d2.params.auth)\n    if (!a) return ''\n    const c = []\n    try {\n      let g = a.raw && typeof a.raw.getSelectedSession === 'function' ? a.raw.getSelectedSession() : null\n      if (g && typeof g.then === 'function') g = await g\n      if (g && g.credentials) c.push(g.credentials.email)\n    } catch (e) { /* sigue con los otros caminos */ }\n    const u = a.user || {}\n    const s = a.session || {}\n    c.push(u.email, s.credentials && s.credentials.email, s.email)\n    for (let i = 0; i < c.length; i++) if (typeof c[i] === 'string' && c[i].indexOf('@') > 0) return c[i].trim().toLowerCase()\n  } catch (e) { /* sin sesión */ }\n  return ''\n}\nasync function api(d2, payload) {\n  if (isDemo(d2)) return demoApi(d2, payload)\n  const ref = d2.params && d2.params.api\n  if (!ref) throw errTipo('El parámetro \"api\" no está conectado.', 'config')\n  const email = await emailSesion(d2)\n  if (!email) throw errTipo('No se encontró tu sesión. Volvé a iniciar sesión.', 'sesion')\n  const h = d2.rush(ref)\n  return desenvolver(await conLimite(h.invoke(Object.assign({}, payload, { email: email })), LIMITE_MS))\n}\n\n// ---- modo demo (dry_render / preview sin backend) ----\nconst DEMO_PERFIL = { nombre: 'Ana Gómez', email: 'ana.gomez@natura.net', mercados: ['AR', 'MX'], ecommerce: false, supervisor: true, paises: ['AR', 'MX'] }\nconst DEMO_FUENTES = [\n  { n: 1, corpus: 'beedoo', tipo: 'Wiki del asesor · AR', titulo: 'Proceso Documentado Créditos y Cobranzas - CAN Argentina › 2. Asignación de Límites', tema: 'AUMENTAR LÍNEA DE CRÉDITO', categoria: 'PAGOS', sv: 0, sk: 0.45, citada: true, url: 'https://naturalatam.beedoo.io/wiki/476936/lll', texto: 'Ejemplo de demostración: la asignación de límites se revisa cada ciclo según el historial de pagos de la consultora.' },\n  { n: 2, corpus: 'beedoo', tipo: 'Wiki del asesor · AR', titulo: 'Proceso Documentado Créditos y Cobranzas - CAN Argentina › 8. Aplicación del pago y restablecimiento del límite', tema: '', categoria: 'PAGOS', sv: 0, sk: 0.47, citada: true, url: 'https://naturalatam.beedoo.io/wiki/476936/lll', texto: 'Ejemplo de demostración: cuando el pago se aplica, el límite de crédito se restablece.' },\n  { n: 3, corpus: 'faq', tipo: 'FAQ de AVI (bot)', titulo: 'AUMENTAR LÍNEA DE CRÉDITO', categoria: null, sv: 0.749, sk: 0, citada: true, url: null, texto: 'Ejemplo de demostración: el aumento de crédito es automático, con un reencuadramiento mensual.' }\n]\nconst DEMO_RESP = 'Estimado asesor,\\n\\n**Qué hacer**\\n1. Revise el historial de pagos de la consultora: el límite se asigna cada ciclo según ese historial [1].\\n2. Si ya pagó, verifique que el pago esté aplicado: así se restablece el límite [2].\\n\\n**Qué explicarle a la consultora**\\n- El aumento de crédito es automático, con un reencuadramiento mensual [3].'\nasync function demoApi(d2, p) {\n  await dormir(500)\n  if (p.op === 'perfil') return { ok: true, op: 'perfil', perfil: DEMO_PERFIL, pendiente: null, telemetria: false, api_version: 'demo', prompt_version: 'demo' }\n  if (p.op === 'perguntar') {\n    await dormir(700)\n    if (/capital|futbol|clima/i.test(p.pregunta)) return { ok: true, op: 'perguntar', query_id: 'demo-nf-' + Date.now(), not_found: true, fuentes: [], cercanas: [{ corpus: 'faq', titulo: 'PLAZOS DE ENTREGA DE PEDIDOS ELO', score: 0.61 }], registrado: false, indices: { faq: 'ok', beedoo: 'texto', mx: 'off', wiki: 'vacio' }, latencias: { busqueda_ms: 820, ia_ms: 0, total_ms: 830 }, mercado: p.mercado }\n    return { ok: true, op: 'perguntar', query_id: 'demo-' + Date.now(), not_found: false, answer: DEMO_RESP, fuentes: DEMO_FUENTES, citas: [1, 2, 3], registrado: false, indices: { faq: 'ok', beedoo: 'texto', mx: 'off', wiki: 'vacio' }, latencias: { busqueda_ms: 940, ia_ms: 1310, total_ms: 2290 }, diag: { prompt_chars: 4120 }, mercado: p.mercado, prompt_version: 'demo' }\n  }\n  if (p.op === 'votar') return { ok: false, op: 'votar', error: { code: 'TELEMETRIA_NO_DISPONIBLE', message: 'Demo: el voto no se guarda.' } }\n  if (p.op === 'historial') return { ok: false, op: 'historial', items: [], telemetria: false }\n  return { ok: false, op: p.op, error: { code: 'OP_DESCONOCIDA', message: 'demo' } }\n}\n\n// ---- perfil, mercado y voto pendiente ----\nfunction opcionesMercado(perfil) { return (perfil && Array.isArray(perfil.mercados)) ? MERCADOS.filter(function (c) { return perfil.mercados.indexOf(c) >= 0 }) : [] }\nfunction mercadoActual(d2) {\n  const ops = opcionesMercado(d2.state.perfil)\n  if (!ops.length) return ''\n  if (ops.length === 1) return ops[0]\n  const m = d2.state.mercado\n  return ops.indexOf(m) >= 0 ? m : ops[0]\n}\nasync function cargarPerfil(d2) {\n  poner(d2, { cargandoPerfil: true, errPerfil: '' })\n  try {\n    const r = await api(d2, { op: 'perfil', app: appDe(d2), client_version: VERSION })\n    if (!r.ok) {\n      const c = r.error && r.error.code\n      const txt = c === 'PERFIL_NO_ENCONTRADO' ? 'Tu usuario no está registrado en Agents Tools. Pedí el alta a tu supervisor.'\n        : c === 'SESION_NO_IDENTIFICADA' ? 'No fue posible identificar tu sesión. Volvé a iniciar sesión.'\n        : (r.error && r.error.message) || 'No fue posible cargar tu perfil.'\n      poner(d2, { cargandoPerfil: false, errPerfil: txt })\n      return\n    }\n    const p = r.perfil || {}\n    const guardado = lsGet(kMk(p.email))\n    const ops = opcionesMercado(p)\n    const pref = appDe(d2) === 'mx' ? 'MX' : 'AR'\n    const mk = ops.indexOf(guardado) >= 0 ? guardado : (ops.indexOf(pref) >= 0 ? pref : (ops[0] || ''))\n    let pend = null\n    if (r.pendiente && r.pendiente.query_id) {\n      pend = { query_id: r.pendiente.query_id, pregunta: r.pendiente.question || '', answer: r.pendiente.answer || '', mercado: r.pendiente.market || mk, ts: Date.now(), origen: 'servidor' }\n    } else {\n      const lp = lsGet(kPend(p.email))\n      if (lp && lp.query_id && lp.email === String(p.email || '').toLowerCase() && (Date.now() - Number(lp.ts || 0)) < PEND_MS) pend = { query_id: lp.query_id, pregunta: lp.pregunta || '', answer: '', mercado: lp.mercado || mk, ts: lp.ts, origen: 'local' }\n    }\n    poner(d2, { cargandoPerfil: false, perfil: p, mercado: mk, telemetria: r.telemetria !== false, pend: pend, apiVersion: r.api_version || '', promptVersion: r.prompt_version || '' })\n    if (pend && pend.origen === 'servidor' && pend.answer) fuentesPend(d2, pend.query_id)\n  } catch (e) {\n    const inf = clasificar(e)\n    poner(d2, { cargandoPerfil: false, errPerfil: inf.texto })\n  }\n}\n// Voto pendiente después de recargar: el perfil trae solo la respuesta; las fuentes salen del historial\n// (sin ellas los números de cita quedan como texto, sin enlace).\nasync function fuentesPend(d2, qid) {\n  try {\n    const r = await api(d2, { op: 'historial', limite: 5 })\n    const it = r && r.ok ? (r.items || []).filter(function (x) { return x.query_id === qid })[0] : null\n    const pend = d2.state.pend\n    if (!it || !pend || pend.query_id !== qid) return\n    const fs = (it.fuentes || []).map(function (f) { return { n: f.n, corpus: f.corpus, tipo: TIPOS[f.corpus] || f.corpus, titulo: f.titulo, url: f.url, citada: f.citada, texto: '' } })\n    poner(d2, { pend: Object.assign({}, pend, { fuentes: fs }) })\n  } catch (e) { /* sigue sin fuentes */ }\n}\nfunction guardarPend(d2, pend) {\n  const p = d2.state.perfil || {}\n  if (!pend) { lsDel(kPend(p.email)); return }\n  lsSet(kPend(p.email), { query_id: pend.query_id, pregunta: String(pend.pregunta || '').slice(0, 120), mercado: pend.mercado, ts: pend.ts, email: String(p.email || '').toLowerCase() })\n}\n\n// ---- preguntar ----\nasync function preguntar(d2) {\n  const v = vida(d2)\n  const q = String(v.borrador || '').trim()\n  if (d2.state.busy || d2.state.pend) return\n  if (q.length < 3) { poner(d2, { aviso: 'Escribí la pregunta de la consultora (mínimo 3 caracteres).' }); return }\n  const mk = mercadoActual(d2)\n  if (!mk) { poner(d2, { aviso: 'Tu usuario no tiene mercados asignados.' }); return }\n  const t0 = Date.now()\n  v.borrador = ''\n  const area = d2.$('.q'); if (area) area.value = ''\n  poner(d2, { busy: true, aviso: '', conv: { pregunta: q, mercado: mk, estado: 'buscando', res: null, t0: t0 }, abiertas: {}, resaltada: 0 })\n  arrancarReloj(d2)\n  try {\n    const r = await api(d2, { op: 'perguntar', pregunta: q, mercado: mk, origen: d2.state.origen || 'chat', app: appDe(d2), client_version: VERSION })\n    pararReloj(d2)\n    const dur = Date.now() - t0\n    const hist = (d2.state.hist || []).slice(0, 19)\n    if (r.ok && r.not_found) {\n      hist.unshift({ pregunta: q, answer: '', not_found: true, mercado: mk, ts: Date.now() })\n      poner(d2, { busy: false, conv: { pregunta: q, mercado: mk, estado: 'sin_info', res: r, dur: dur }, hist: hist })\n      return\n    }\n    if (r.ok) {\n      const pend = { query_id: r.query_id, pregunta: q, answer: r.answer, mercado: mk, ts: Date.now(), origen: 'actual' }\n      guardarPend(d2, pend)\n      vida(d2).comentario = ''\n      hist.unshift({ pregunta: q, answer: r.answer, not_found: false, mercado: mk, ts: Date.now(), fuentes: r.fuentes })\n      poner(d2, { busy: false, conv: { pregunta: q, mercado: mk, estado: 'ok', res: r, dur: dur }, pend: pend, voto: { nota: 0, enviando: false, err: '' }, hist: hist })\n      return\n    }\n    const code = r.error && r.error.code\n    poner(d2, { busy: false, conv: { pregunta: q, mercado: mk, estado: 'error', res: r, dur: dur, err: (r.error && r.error.message) || 'No fue posible responder.', code: code } })\n  } catch (e) {\n    pararReloj(d2)\n    const inf = clasificar(e)\n    poner(d2, { busy: false, conv: { pregunta: q, mercado: mk, estado: 'error', res: null, err: inf.texto, tipo: inf.tipo } })\n  }\n}\nfunction arrancarReloj(d2) {\n  const v = vida(d2)\n  pararReloj(d2)\n  v.reloj = setInterval(function () { if (v.activo && d2.state.busy) d2.setState({ tick: Date.now() }) }, 1000)\n}\nfunction pararReloj(d2) { const v = vida(d2); if (v.reloj) { clearInterval(v.reloj); v.reloj = null } }\n\n// ---- votar ----\nasync function votar(d2) {\n  const pend = d2.state.pend\n  const vt = d2.state.voto || {}\n  const nota = Number(vt.nota || 0)\n  const com = String(vida(d2).comentario || '').trim()\n  if (!pend || vt.enviando) return\n  if (!(nota >= 1 && nota <= 5)) { poner(d2, { voto: Object.assign({}, vt, { err: 'Elegí una nota de 1 a 5.' }) }); return }\n  if (nota <= 2 && com.length < 3) { poner(d2, { voto: Object.assign({}, vt, { err: 'Con nota 1 o 2, contanos qué faltó (mínimo 3 caracteres).' }) }); return }\n  poner(d2, { voto: Object.assign({}, vt, { enviando: true, err: '' }) })\n  let local = false, errTxt = ''\n  try {\n    const r = await api(d2, { op: 'votar', query_id: pend.query_id, nota: nota, comentario: com, client_version: VERSION })\n    if (!r.ok) {\n      const c = r.error && r.error.code\n      if (c === 'TELEMETRIA_NO_DISPONIBLE' || c === 'CONSULTA_NO_ENCONTRADA') local = true\n      else if (c === 'YA_VOTADO') local = false\n      else errTxt = (r.error && r.error.message) || 'No fue posible guardar el voto.'\n    }\n  } catch (e) {\n    errTxt = clasificar(e).texto\n  }\n  if (errTxt) { poner(d2, { voto: Object.assign({}, vt, { enviando: false, err: errTxt + ' Podés reintentar.' }) }); return }\n  guardarPend(d2, null)\n  vida(d2).comentario = ''\n  // voto de una respuesta restaurada (recarga): la respuesta sigue en pantalla después de votar\n  const sigue = !d2.state.conv && pend.answer ? { conv: { pregunta: pend.pregunta, mercado: pend.mercado, estado: 'ok', res: { query_id: pend.query_id, answer: pend.answer, fuentes: pend.fuentes || [] } } } : {}\n  poner(d2, Object.assign(sigue, { pend: null, voto: { nota: 0, enviando: false, err: '' }, avisoVoto: local ? 'Gracias. Tu evaluación quedó registrada solo en esta pantalla: el registro de votos se activa con la próxima publicación.' : 'Gracias por tu evaluación.' }))\n  setTimeout(function () { if (vida(d2).activo) d2.setState({ avisoVoto: '' }) }, 6000)\n  setTimeout(function () { const el = d2.$('.q'); if (el) try { el.focus() } catch (x) { /* sin foco */ } }, 50)\n}\n\n// ---- historial ----\nasync function abrirHistorial(d2) {\n  poner(d2, { panel: 'hist', histRemoto: { cargando: true, items: [], telemetria: true, err: '' }, hsel: null })\n  try {\n    const r = await api(d2, { op: 'historial', limite: 20 })\n    if (r.ok) poner(d2, { histRemoto: { cargando: false, items: r.items || [], telemetria: true, err: '' } })\n    else poner(d2, { histRemoto: { cargando: false, items: [], telemetria: false, err: '' } })\n  } catch (e) {\n    poner(d2, { histRemoto: { cargando: false, items: [], telemetria: false, err: clasificar(e).texto } })\n  }\n}\nfunction rel(ts) {\n  const t = typeof ts === 'number' ? ts : Date.parse(ts)\n  if (!t) return ''\n  const m = Math.round((Date.now() - t) / 60000)\n  if (m < 1) return 'recién'\n  if (m < 60) return 'hace ' + m + (m === 1 ? ' minuto' : ' minutos')\n  const h = Math.round(m / 60)\n  if (h < 24) return 'hace ' + h + (h === 1 ? ' hora' : ' horas')\n  const d = Math.round(h / 24)\n  if (d === 1) return 'ayer'\n  if (d < 30) return 'hace ' + d + ' días'\n  try { return new Date(t).toLocaleDateString('es') } catch (e) { return '' }\n}\n\n// ---- piezas de la vista ----\nfunction chipScore(f) {\n  const out = []\n  if (Number(f.sv) > 0) out.push('<span class=\"sc sc-v\" title=\"Similitud semántica\">sem ' + nf(f.sv, 2) + '</span>')\n  if (Number(f.sk) > 0) out.push('<span class=\"sc sc-t\" title=\"Coincidencia de términos\">texto ' + nf(f.sk, 2) + '</span>')\n  return out.join('')\n}\nfunction catTexto(c) { return (Array.isArray(c) ? c.join(', ') : String(c == null ? '' : c)).replace(/_/g, ' ').trim() }\nfunction verTecnico(d2) { return !!(d2.state.perfil && d2.state.perfil.supervisor) || d2.param('debug') === true }\n// la ventana del trecho viene cortada en cualquier letra: después de \"…\" se descarta la palabra partida\nfunction trecho(t) { return String(t || '').replace(/^…\\s*\\S*\\s+/, '… ') }\nfunction tarjeta(d2, f) {\n  const cat = catTexto(f.categoria)\n  const abierta = !!(d2.state.abiertas || {})[f.n]\n  const res = Number(d2.state.resaltada || 0) === Number(f.n)\n  const url = urlSegura(f.url)\n  const txt = trecho(f.texto)\n  const largo = txt.length > 260\n  return '<article class=\"src' + (res ? ' src-on' : '') + '\" id=\"fuente-' + attr(f.n) + '\" data-key=\"f' + attr(f.n) + '\">'\n    + '<header class=\"src-h\"><span class=\"src-n\">' + esc(f.n) + '</span><h3 class=\"src-t\">' + esc(f.titulo || '(sin título)') + '</h3></header>'\n    + '<div class=\"src-m\"><span class=\"tp tp-' + attr(f.corpus) + '\">' + esc(f.tipo || TIPOS[f.corpus] || f.corpus) + '</span>'\n    + (cat ? '<span class=\"src-c\">' + esc(cat) + '</span>' : '')\n    + (f.tema ? '<span class=\"src-c\" title=\"Tema de la wiki\">' + esc(f.tema) + '</span>' : '')\n    + (verTecnico(d2) ? chipScore(f) : '')\n    + (f.citada ? '<span class=\"src-cit\" title=\"Citada en la respuesta\">citada</span>' : '') + '</div>'\n    + (txt ? '<p class=\"src-b' + (abierta ? ' src-b-on' : '') + '\">' + esc(txt) + '</p>' : '')\n    + '<div class=\"src-a\">' + (largo ? '<button class=\"lnk ver\" data-n=\"' + attr(f.n) + '\">' + (abierta ? 'ver menos' : 'ver más') + '</button>' : '')\n    + (url ? '<a class=\"lnk\" href=\"' + attr(url) + '\" target=\"_blank\" rel=\"noopener noreferrer\">Abrir en Beedoo ↗</a>' : '') + '</div>'\n    + '</article>'\n}\nfunction bloqueVoto(d2) {\n  const vt = d2.state.voto || {}\n  const g = Number(vt.nota || 0)\n  const lab = VOTO[g]\n  const com = vida(d2).comentario || ''\n  const listo = g >= 1 && (g > 2 || com.trim().length >= 3)\n  return '<section class=\"vote\" aria-labelledby=\"vt-h\" data-key=\"voto\">'\n    + '<div class=\"vote-h\" id=\"vt-h\"><b>¿Qué tan útil fue la respuesta?</b><span>Obligatorio para hacer la próxima consulta.</span></div>'\n    + '<div class=\"scale\" role=\"radiogroup\" aria-label=\"Nota de 1 a 5\">' + [1, 2, 3, 4, 5].map(function (n) {\n      return '<button class=\"dot\" role=\"radio\" data-g=\"' + n + '\" aria-checked=\"' + (n === g ? 'true' : 'false') + '\" title=\"' + attr(VOTO[n][0]) + '\">' + n + '</button>'\n    }).join('') + '</div>'\n    + '<div class=\"vdesc\">' + (lab ? '<b>' + esc(lab[0]) + '</b> · ' + esc(lab[1]) : 'Elegí una nota: 1 = nada útil · 5 = exactamente lo que necesitaba') + '</div>'\n    + '<textarea class=\"vin\" rows=\"2\" maxlength=\"500\" placeholder=\"' + (g && g <= 2 ? '¿Qué faltó o qué estaba mal? (obligatorio)' : 'Comentario (opcional)') + '\">' + esc(com) + '</textarea>'\n    + (g && g <= 2 && com.trim().length < 3 ? '<div class=\"vreq\" role=\"status\">Con nota 1 o 2, contanos qué faltó (mínimo 3 caracteres).</div>' : '')\n    + '<div class=\"vrow\">' + (vt.err ? '<span class=\"verr\" role=\"alert\">' + esc(vt.err) + '</span>' : '<span></span>')\n    + '<button class=\"send vsend\"' + (listo && !vt.enviando ? '' : ' disabled') + '>' + (vt.enviando ? 'Enviando…' : 'Enviar evaluación') + '</button></div>'\n    + '</section>'\n}\nfunction conversacion(d2) {\n  const c = d2.state.conv\n  const pend = d2.state.pend\n  if (!c && pend) {\n    // voto pendiente de una consulta anterior (recarga de la página); las fuentes llegan después (fuentesPend)\n    const nFp = (pend.fuentes || []).length\n    return '<div class=\"you\">' + esc(pend.pregunta || 'Consulta anterior') + '</div>'\n      + '<div class=\"bot\"><div class=\"av\">N</div><div class=\"bw\">'\n      + (pend.answer ? '<div class=\"bub\">' + markdown(pend.answer, nFp, !nFp) + '</div><div class=\"acts\"><button class=\"act copy\">Copiar respuesta</button></div>' : '<div class=\"bub bub-muted\">Quedó pendiente la evaluación de tu última respuesta.</div>')\n      + bloqueVoto(d2) + '</div></div>'\n  }\n  if (!c) {\n    return '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M21 12a8 8 0 0 1-8 8H7l-4 3v-5a8 8 0 0 1 8-11h2a8 8 0 0 1 8 5z\" stroke-linejoin=\"round\"/></svg></b>Escribí la duda de la consultora: NASVI busca en las wikis del asesor y en la FAQ de AVI por vos.</div>'\n  }\n  const you = '<div class=\"you\">' + esc(c.pregunta) + '</div>'\n  if (c.estado === 'buscando') {\n    const s = Math.max(0, Math.round((Date.now() - (c.t0 || Date.now())) / 1000))\n    return you + '<div class=\"bot\"><div class=\"av\">N</div><div class=\"bub bub-muted\"><span class=\"spin\" aria-hidden=\"true\"></span>' + (s < 3 ? 'Buscando en las fuentes…' : 'Preparando la respuesta…') + ' <span class=\"secs\">' + s + ' s</span></div></div>'\n  }\n  if (c.estado === 'sin_info') {\n    const cer = (c.res && c.res.cercanas) || []\n    return you + '<div class=\"bot\"><div class=\"av av-nf\">?</div><div class=\"bw\"><div class=\"bub bub-nf\">'\n      + '<p><b>No encontré información confiable para responder.</b></p>'\n      + '<p>Ninguna FAQ o wiki de ' + esc(NOMBRES[c.mercado] || c.mercado) + ' alcanzó la similitud mínima, así que no generé una respuesta para no inventar.</p>'\n      + (cer.length ? '<p class=\"nf-l\">Lo más cercano (no alcanzó el mínimo):</p><ul>' + cer.map(function (x) { return '<li>' + esc(catTexto(x.titulo)) + (verTecnico(d2) ? ' <span class=\"nf-s\">' + nf(x.score, 2) + '</span>' : '') + '</li>' }).join('') + '</ul>' : '')\n      + '<p class=\"nf-t\">Probá con otras palabras (por ejemplo, el nombre del proceso) o consultá a tu supervisor.</p>'\n      + '</div></div></div>'\n  }\n  if (c.estado === 'error') {\n    return you + '<div class=\"bot\"><div class=\"av av-er\">!</div><div class=\"bw\"><div class=\"bub bub-er\"><p>' + esc(c.err || 'Error') + '</p>'\n      + '<div class=\"acts\"><button class=\"act reintentar\">Reintentar</button></div></div></div></div>'\n  }\n  const r = c.res || {}\n  const nF = (r.fuentes || []).length\n  const pendiente = !!(d2.state.pend && d2.state.pend.query_id === r.query_id)\n  return you + '<div class=\"bot\"><div class=\"av\">N</div><div class=\"bw\">'\n    + '<div class=\"bub\">' + markdown(r.answer || '', nF) + '</div>'\n    + '<div class=\"acts\"><button class=\"act copy\">Copiar respuesta</button></div>'\n    + (pendiente ? bloqueVoto(d2) : '')\n    + '</div></div>'\n}\nfunction modal(d2) {\n  const p = d2.state.panel\n  if (p === 'help') {\n    return '<div class=\"scrim\" data-key=\"scrim-help\"><div class=\"dlg w-help\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"dlg-t\"><div class=\"dlg-h\"><h2 id=\"dlg-t\">NASVI: el copiloto del asesor</h2><button class=\"x\" aria-label=\"Cerrar\">×</button></div><div class=\"dlg-b md\">' + markdown(AYUDA, 0, true) + '</div></div></div>'\n  }\n  if (p === 'hist') {\n    const hr = d2.state.histRemoto || {}\n    const remoto = hr.telemetria !== false\n    const items = remoto ? (hr.items || []).map(function (x) { return { pregunta: x.question, answer: x.answer, not_found: x.not_found, mercado: x.market, ts: x.createdAt, grade: x.grade, fuentes: x.fuentes } })\n      : (d2.state.hist || [])\n    const sel = Number(d2.state.hsel || 0)\n    const cur = items[sel] || items[0]\n    const lista = hr.cargando ? '<div class=\"empty\" style=\"padding:20px\">Cargando…</div>'\n      : items.length ? items.map(function (x, i) {\n        return '<button class=\"hitem\" data-h=\"' + i + '\" aria-selected=\"' + (i === sel ? 'true' : 'false') + '\"><b>' + esc(x.pregunta) + '</b><span>' + esc(rel(x.ts)) + ' · ' + esc(x.mercado || '') + (x.not_found ? ' · sin información' : '') + (x.grade ? ' · nota ' + esc(x.grade) : '') + '</span></button>'\n      }).join('') : '<div class=\"empty\" style=\"padding:20px\">Sin consultas todavía.</div>'\n    return '<div class=\"scrim\" data-key=\"scrim-hist\"><div class=\"dlg w-hist\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"dlg-h\"><div class=\"dlg-h hh\"><h2 id=\"dlg-h\">Historial</h2><button class=\"x\" aria-label=\"Cerrar\">×</button></div>'\n      + (!remoto && !hr.cargando ? '<div class=\"pv hpv\">' + esc(hr.err || 'El historial guardado se activa con la próxima publicación. Se muestran las consultas de esta sesión.') + '</div>' : '')\n      + '<div class=\"hlist\">' + lista + '</div>'\n      + '<div class=\"hdet\">' + (cur && !hr.cargando ? '<div class=\"you\" style=\"align-self:flex-start;max-width:100%\">' + esc(cur.pregunta) + '</div>'\n        + (cur.not_found ? '<div class=\"bot\"><div class=\"av av-nf\">?</div><div class=\"bub bub-nf\"><p><b>Sin información</b>: no se encontraron fuentes confiables.</p></div></div>'\n          : '<div class=\"bot\"><div class=\"av\">N</div><div class=\"bub\">' + markdown(cur.answer || '', (cur.fuentes || []).length) + '</div></div>')\n        + ((cur.fuentes || []).length ? '<ul class=\"hf\">' + cur.fuentes.map(function (f) {\n          const u = urlSegura(f.url)\n          const on = Number(d2.state.hres || 0) === Number(f.n)\n          return '<li data-n=\"' + attr(f.n) + '\"' + (on ? ' class=\"hf-on\"' : '') + '><span class=\"src-n\">' + esc(f.n) + '</span><span class=\"hf-t\">' + (u ? '<a href=\"' + attr(u) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(f.titulo) + '</a>' : esc(f.titulo))\n            + ' <span class=\"hf-tp\">' + esc(TIPOS[f.corpus] || f.corpus || '') + '</span>' + (f.citada ? ' <span class=\"src-cit\">citada</span>' : '') + '</span></li>'\n        }).join('') + '</ul>' : '') : '') + '</div>'\n      + '</div></div>'\n  }\n  return ''\n}\n\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '.app{--cream:rgb(254,251,244);--ink:#162b37;--ink2:rgba(22,43,55,.66);--line:#e3ddd2;--olive:rgb(230,238,189);--ok:#2e7d32;--accent:var(--acc,#FF6C0E);display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.55 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;position:relative;overflow:hidden}'\n    + 'button{font-family:inherit}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:16px;padding:12px 22px;border-bottom:1px solid var(--line);background:#fff;flex-wrap:wrap}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}'\n    + '.brand b{font-size:22px;font-weight:700;letter-spacing:.5px}'\n    + '.brand span{font-size:12px;color:var(--ink2)}'\n    + '.chips{display:flex;gap:6px;flex:none}'\n    + '.chip{flex:none;border:1px solid var(--line);border-radius:16px;padding:6px 14px;font-weight:600;font-size:12px;line-height:1;color:var(--ink);background:#fff;cursor:pointer}'\n    + '.chip[aria-pressed=\"true\"]{background:var(--ink);border-color:var(--ink);color:#fff}'\n    + '.spacer{flex:1 1 auto;min-width:8px}'\n    + '.mk{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--ink2);flex:none}'\n    + '.mk select{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink)}'\n    + '.lock{flex:none;border:1px solid var(--line);border-radius:7px;padding:5px 10px;font-weight:700;background:#faf6ef;color:var(--ink)}'\n    + '.who{font-size:12px;color:var(--ink2);text-align:right;line-height:1.3;flex:none;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.who b{display:block;color:var(--ink);font-size:13px;overflow:hidden;text-overflow:ellipsis}'\n    + '.nav{display:flex;gap:6px;flex:none}'\n    + '.nl{border:1px solid var(--line);background:#fff;border-radius:8px;padding:6px 11px;font-weight:600;font-size:12px;line-height:1;color:var(--ink);cursor:pointer;text-decoration:none}'\n    + '.nl:hover,.ico:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.ico{flex:none;width:34px;height:34px;padding:0;border-radius:50%;border:1px solid var(--line);background:#fff;color:var(--ink);cursor:pointer;font-weight:700;font-size:15px;line-height:1;display:grid;place-items:center}'\n    + '.pv{flex:none;background:#fff6e6;border-bottom:1px solid #f0dcb4;color:#6b4e0e;font-size:12px;padding:7px 22px}'\n    + '.okb{position:absolute;left:50%;bottom:64px;transform:translateX(-50%);z-index:8;max-width:92%;background:#eaf5ea;border:1px solid #c8e3c8;border-radius:10px;box-shadow:0 6px 18px rgba(0,0,0,.12);color:#1d5c20;font-size:12.5px;padding:8px 16px}'\n    + '.erb{flex:none;background:#fdf0f0;border-bottom:1px solid #f3cccc;color:#8c2f2f;font-size:13px;padding:10px 22px;display:flex;gap:12px;align-items:center}'\n    + '.main{flex:1 1 auto;display:grid;grid-template-columns:minmax(0,1fr) clamp(300px,34%,420px);min-height:0}'\n    + '.left{display:flex;flex-direction:column;min-height:0;padding:18px 22px;gap:12px}'\n    + '.ask label{display:block;font-weight:600;margin-bottom:6px}'\n    + '.q{width:100%;height:92px;resize:none;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);font:inherit}'\n    + '.q:focus,.vin:focus{outline:2px solid var(--accent);outline-offset:-1px}'\n    + '.q:disabled{background:#f4f1ea;color:var(--ink2)}'\n    + '.ask-r{display:flex;align-items:center;gap:12px;margin-top:8px}'\n    + '.hint{font-size:12px;color:var(--ink2)}'\n    + '.hint-w{color:#8a4a10;font-weight:600}'\n    + '.send{flex:none;margin-left:auto;border:0;border-radius:8px;padding:10px 20px;background:var(--ink);color:#fff;font-weight:600;font-size:14px;line-height:1;cursor:pointer}'\n    + '.send:disabled{opacity:.4;cursor:default}'\n    + '.send:focus-visible,.chip:focus-visible,.dot:focus-visible,.act:focus-visible,.cit:focus-visible,.lnk:focus-visible,.nl:focus-visible,.ico:focus-visible{outline:2px solid var(--accent);outline-offset:2px}'\n    + '.log{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px}'\n    + '.you{align-self:flex-end;max-width:82%;background:#fff;border:1px solid var(--line);border-radius:12px 12px 2px 12px;padding:10px 14px;white-space:pre-wrap;word-break:break-word}'\n    + '.bot{display:flex;gap:10px;max-width:96%}'\n    + '.bw{min-width:0;display:flex;flex-direction:column;gap:8px;flex:1}'\n    + '.av{width:34px;height:34px;flex:none;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center;font-weight:700;font-size:13px;line-height:1}'\n    + '.av-nf{background:#8a6d1f}.av-er{background:#b3261e}'\n    + '.bub{background:var(--olive);border-radius:2px 16px 16px 16px;padding:12px 16px;min-width:0;word-break:break-word}'\n    + '.bub p{margin:0 0 8px}.bub p:last-child{margin:0}.bub ul,.bub ol{margin:6px 0;padding-left:22px}.bub li{margin:2px 0}'\n    + '.bub h4{font-size:14.5px;margin:8px 0 4px}.bub code{background:rgba(0,0,0,.07);padding:1px 5px;border-radius:4px}'\n    + '.bub blockquote{margin:8px 0;padding-left:10px;border-left:3px solid rgba(22,43,55,.25);color:var(--ink2)}'\n    + '.bub a{color:#0b57d0}'\n    + '.bub-muted{background:#f2efe7;color:var(--ink2);display:flex;align-items:center;gap:8px}'\n    + '.bub-nf{background:#fff6e6;border:1px solid #f0dcb4}.bub-nf ul{margin:4px 0 8px}.nf-l{font-size:12.5px;color:var(--ink2)}.nf-s{font-size:11px;color:var(--ink2)}.nf-t{font-size:12.5px}'\n    + '.bub-er{background:#fff0ef;border:1px solid rgba(179,38,30,.35);color:#8c1d16}'\n    + '.secs{font-size:12px;opacity:.8}'\n    + '.spin{width:14px;height:14px;border:2px solid rgba(22,43,55,.25);border-top-color:var(--ink);border-radius:50%;animation:gi .8s linear infinite;display:inline-block}'\n    + '@keyframes gi{to{transform:rotate(360deg)}}'\n    + '@media (prefers-reduced-motion:reduce){.spin{animation:none}}'\n    + '.cit{display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 4px;margin:0 1px;border:0;border-radius:9px;background:var(--ink);color:#fff;font-weight:700;font-size:10.5px;line-height:1;vertical-align:2px;cursor:pointer}'\n    + '.cit:hover{background:var(--accent)}.cits{white-space:nowrap}.cit-i{cursor:default}.cit-i:hover{background:var(--ink)}'\n    + '.acts{display:flex;gap:8px}'\n    + '.act{border:1px solid rgba(22,43,55,.22);background:rgba(255,255,255,.7);border-radius:7px;padding:5px 11px;font-weight:600;font-size:12px;line-height:1.4;color:var(--ink);cursor:pointer}'\n    + '.act:hover{border-color:var(--ink)}'\n    + '.vote{background:#fff;border:1px solid var(--line);border-left:4px solid var(--accent);border-radius:10px;padding:12px 14px}'\n    + '.vote-h{display:flex;flex-direction:column;gap:2px;margin-bottom:8px}.vote-h span{font-size:12px;color:var(--ink2)}'\n    + '.scale{display:flex;gap:9px;margin:4px 0 8px}'\n    + '.dot{flex:none;width:40px;height:40px;padding:0;border-radius:50%;border:1px solid rgba(22,43,55,.35);background:#fff;color:var(--ink);font-weight:700;font-size:16px;line-height:1;cursor:pointer}'\n    + '.dot[aria-checked=\"true\"]{background:var(--ink);color:#fff;border-color:var(--ink)}'\n    + '.vdesc{min-height:20px;font-size:12.5px;color:var(--ink2);margin-bottom:8px}'\n    + '.vin{width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:8px;font:inherit;background:#fff;color:var(--ink);resize:vertical}'\n    + '.vrow{display:flex;align-items:center;gap:12px;margin-top:8px}.verr{font-size:12.5px;color:#b3261e}.vreq{font-size:12px;color:#8a4a10;margin-top:4px}'\n    + '.irvoto{border:0;background:transparent;padding:0;text-align:left;font-size:12px;font-weight:700;line-height:1.4;color:#8a4a10;text-decoration:underline;cursor:pointer}.irvoto:focus-visible{outline:2px solid var(--accent);outline-offset:2px}'\n    + '.empty{margin:auto;text-align:center;color:var(--ink2);max-width:340px;font-size:13px}'\n    + '.empty b{display:block;margin-bottom:8px;opacity:.3}.empty svg{width:34px;height:34px;stroke:currentColor;fill:none;stroke-width:1.6}'\n    + '.right{border-left:1px solid var(--line);background:#fffdf9;display:flex;flex-direction:column;min-height:0}'\n    + '.rh{display:flex;align-items:baseline;gap:8px;padding:16px 18px 8px;flex-wrap:wrap}'\n    + '.rh h2{margin:0;font-size:11px;letter-spacing:1.3px;text-transform:uppercase;color:var(--ink2)}'\n    + '.rh span{font-size:11px;color:var(--ink2);margin-left:auto}'\n    + '.srcs{flex:1;min-height:0;overflow:auto;padding:0 16px 16px;display:flex;flex-direction:column;gap:10px}'\n    + '.src{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px;transition:box-shadow .2s,border-color .2s}'\n    + '.src-on{border-color:var(--accent);box-shadow:0 0 0 3px rgba(255,108,14,.18)}'\n    + '.src-h{display:flex;gap:9px;align-items:flex-start}'\n    + '.src-n{flex:none;display:inline-grid;place-items:center;min-width:20px;height:20px;border-radius:10px;background:var(--ink);color:#fff;font-weight:700;font-size:11px;line-height:1;margin-top:1px}'\n    + '.src-t{flex:1;margin:0;font-size:13.5px;font-weight:700;line-height:1.35}'\n    + '.src-m{display:flex;gap:6px;margin-top:7px;flex-wrap:wrap}'\n    + '.tp{font-size:10px;letter-spacing:.4px;border-radius:5px;padding:2px 7px;font-weight:700;white-space:nowrap}'\n    + '.tp-faq{background:#e7dcf5;color:#4b2a78}.tp-beedoo{background:#dde9f5;color:#1e4a70}.tp-mx{background:#e6eebd;color:#4a5a17}.tp-wiki{background:#f6e2cd;color:#8a4a10}.tp-regla{background:#fde2e2;color:#7a1f1f}'\n    + '.src-c{font-size:10px;letter-spacing:.4px;background:#f2ede4;border-radius:5px;padding:2px 7px;color:var(--ink2)}'\n    + '.sc{font-size:10px;border-radius:5px;padding:2px 6px;border:1px solid var(--line);color:var(--ink2)}'\n    + '.src-cit{font-size:10px;border-radius:5px;padding:2px 6px;background:#eaf5ea;color:#1d5c20;font-weight:700}'\n    + '.src-b{margin:8px 0 0;font-size:12.5px;color:var(--ink2);display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-wrap}'\n    + '.src-b-on{display:block;-webkit-line-clamp:unset}'\n    + '.src-a{display:flex;gap:14px;margin-top:8px}'\n    + '.lnk{border:0;background:transparent;padding:0;font-weight:600;font-size:12px;line-height:1.4;color:var(--accent);text-decoration:underline;cursor:pointer}'\n    + '.ft{flex:none;display:flex;align-items:center;gap:14px;padding:9px 22px;border-top:1px solid var(--line);background:#fff;font-size:12px;color:var(--ink2);flex-wrap:wrap}'\n    + '.tag{font-size:11px;border:1px dashed rgba(22,43,55,.35);border-radius:6px;padding:2px 7px;color:var(--ink2)}'\n    + '.hist{flex:none;margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 14px;font-weight:600;font-size:12px;line-height:1;color:var(--ink);cursor:pointer}'\n    + '.hist:hover{border-color:var(--accent);color:var(--accent)}'\n    + '.scrim{position:absolute;inset:0;background:rgba(0,0,0,.44);display:grid;place-items:center;z-index:9}'\n    + '.dlg{background:var(--cream);border-radius:18px;box-shadow:0 18px 50px rgba(0,0,0,.28);position:relative;max-width:94%;max-height:88%;display:flex;flex-direction:column}'\n    + '.dlg-h{display:flex;align-items:center;padding:20px 22px 10px}'\n    + '.dlg-h h2{margin:0;font-size:20px;font-weight:700}'\n    + '.x{margin-left:auto;width:36px;height:36px;display:grid;place-items:center;border:0;border-radius:50%;background:transparent;font-weight:700;font-size:22px;line-height:1;color:var(--ink);cursor:pointer;padding:0}.x:hover{background:rgba(22,43,55,.08)}.x:focus-visible{outline:2px solid var(--accent);outline-offset:1px}'\n    + '.dlg-b{padding:0 22px 22px;overflow:auto;min-height:0}.md p{margin:0 0 8px}.md ul{padding-left:20px}'\n    + '.w-help{width:640px}'\n    + '.w-hist{width:1000px;height:80%;display:grid;grid-template-columns:300px 1fr;grid-template-rows:auto auto minmax(0,1fr);gap:10px 18px;padding:0 22px 22px;overflow:hidden}'\n    + '.hh{grid-column:1/-1;padding:18px 0 0}.hpv{grid-column:1/-1;border-radius:8px;border:1px solid #f0dcb4}'\n    + '.hlist{overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px;grid-row:3}'\n    + '.hitem{display:block;width:100%;text-align:left;border:0;border-bottom:1px solid var(--line);background:transparent;padding:10px 12px;cursor:pointer;color:var(--ink)}'\n    + '.hitem:hover{background:#faf6ef}.hitem[aria-selected=\"true\"]{background:var(--olive)}'\n    + '.hitem b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:12.5px;font-weight:600;overflow:hidden}'\n    + '.hitem span{font-size:11px;color:var(--ink2)}'\n    + '.hdet{overflow:auto;padding-right:6px;display:flex;flex-direction:column;gap:12px;grid-row:3}'\n    + '.hf{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:6px;font-size:12.5px}.hf li{display:flex;gap:8px;align-items:flex-start;border-radius:8px;padding:3px 4px;transition:background .2s}.hf a{color:#0b57d0}.hf-on{background:rgba(255,108,14,.16)}.hf-tp{font-size:11px;color:var(--ink2);white-space:nowrap}'\n    + '@media (max-width:900px){'\n    + '.hd{gap:8px 10px;padding:10px 14px}.who{display:none}.brand b{font-size:19px}.mk>span:not(.lock){display:none}'\n    + '.left{padding:12px 14px;flex:1 1 auto;min-height:0;gap:10px}.q{height:64px}.right-vacio{display:none}'\n    + '.main{display:flex;flex-direction:column}'\n    + '.right{flex:0 0 auto;border-left:0;border-top:1px solid var(--line);max-height:40%}'\n    + '.w-hist{width:96vw;grid-template-columns:1fr;grid-template-rows:auto auto auto minmax(0,1fr)}.hlist{grid-row:auto;max-height:32vh}.hdet{grid-row:auto}'\n    + '.w-help{width:94vw}.ft{gap:10px;padding:8px 14px}.okb{bottom:58px}'\n    + '}'\n    + '@media (max-width:600px){.hint-k{display:none}'\n    + '}'\n    + '@media (hover:none) and (pointer:coarse){.hint-k{display:none}.cit{min-width:22px;height:22px;border-radius:11px}}',\n\n  render(d2) {\n    const p = d2.state.perfil\n    const mk = mercadoActual(d2)\n    const ops = opcionesMercado(p)\n    const c = d2.state.conv\n    const r = (c && c.estado === 'ok' && c.res) || null\n    const fuentes = (r && r.fuentes) || (c && c.estado === 'error' && c.res && c.res.fuentes) || (!c && d2.state.pend && d2.state.pend.fuentes) || []\n    const pend = d2.state.pend\n    const bloqueado = !!pend || !!d2.state.busy || !p || !ops.length\n    const sup = !!(p && p.supervisor)\n    const debug = d2.param('debug') === true\n\n    const selector = !p ? '<span class=\"lock\">—</span>'\n      : ops.length > 1 ? '<select class=\"sel\" aria-label=\"Mercado\">' + ops.map(function (x) { return '<option value=\"' + attr(x) + '\"' + (x === mk ? ' selected' : '') + '>' + esc(x + ' · ' + (NOMBRES[x] || x)) + '</option>' }).join('') + '</select>'\n        : '<span class=\"lock\" title=\"Tu usuario está asignado a un solo mercado\">' + esc(mk ? mk + ' · ' + (NOMBRES[mk] || mk) : '—') + '</span>'\n\n    const enlaces = sup ? '<nav class=\"nav\" aria-label=\"Supervisor\"><a class=\"nl\" href=\"' + attr(d2.param('panelUrl', '/dashboard') || '/dashboard') + '\">Panel</a><a class=\"nl\" href=\"' + attr(d2.param('wikisUrl', '/upload-wikis') || '/upload-wikis') + '\">Wikis</a></nav>' : ''\n\n    const idx = (r && r.indices) || null\n    const lat = (c && c.res && c.res.latencias) || null\n    const tec = sup || debug\n    // estado de los índices: lo técnico solo para supervisor; lo que afecta la respuesta, para todos\n    const notaIdx = idx ? [idx.beedoo === 'texto' && tec ? 'wikis AR por texto' : idx.beedoo === 'error' ? 'wikis AR no disponibles' : '', idx.mx === 'degradado' ? 'índice MX degradado' : '', idx.wiki === 'ok' && tec ? 'base nueva activa' : ''].filter(Boolean).join(' · ') : ''\n\n    // con voto pendiente la dica vira botón que lleva al bloque de evaluación (puede quedar abajo de la respuesta)\n    let hint = '<span class=\"hint hint-k\">Enter envía · Shift+Enter nueva línea</span>'\n    if (pend) hint = '<button class=\"irvoto\">Evaluá la respuesta para hacer una nueva consulta ↓</button>'\n    else if (p && !ops.length) hint = '<span class=\"hint hint-w\">Tu usuario no tiene mercados asignados.</span>'\n\n    const banners = (isDemo(d2) ? '<div class=\"pv\">Modo demostración: datos ficticios, nada se guarda.</div>' : '')\n      + (d2.state.errPerfil ? '<div class=\"erb\" role=\"alert\"><span>' + esc(d2.state.errPerfil) + '</span><button class=\"act reperfil\">Reintentar</button></div>' : '')\n      + (d2.state.avisoVoto ? '<div class=\"okb\" role=\"status\">' + esc(d2.state.avisoVoto) + '</div>' : '')\n      + (d2.state.cargandoPerfil ? '<div class=\"pv\">Cargando tu perfil…</div>' : '')\n\n    return '<div class=\"app\" data-ready style=\"--acc:' + attr(acento(d2)) + '\">'\n      + '<header class=\"hd\">'\n      + '<div class=\"brand\"><b>NASVI</b><span>Copiloto del asesor</span></div>'\n      + '<div class=\"chips\" role=\"group\" aria-label=\"Canal de atención\">' + ORIGENES.map(function (o) { return '<button class=\"chip\" data-o=\"' + o[0] + '\" aria-pressed=\"' + ((d2.state.origen || 'chat') === o[0] ? 'true' : 'false') + '\">' + o[1] + '</button>' }).join('') + '</div>'\n      + '<div class=\"spacer\"></div>'\n      + '<div class=\"mk\"><span>Mercado</span>' + selector + '</div>'\n      + (p ? '<div class=\"who\" title=\"' + attr((p.nombre || '') + ' · ' + (p.email || '')) + '\"><b>' + esc(p.nombre || 'Asesor') + '</b>' + esc(p.email || '') + '</div>' : '')\n      + enlaces\n      + '<button class=\"ico help\" title=\"Ayuda\" aria-label=\"Ayuda\">?</button>'\n      + (isDemo(d2) ? '' : '<button class=\"nl salir\" title=\"Cerrar sesión\">Salir</button>')\n      + '</header>'\n      + banners\n      + '<div class=\"main\">'\n      + '<section class=\"left\">'\n      + '<div class=\"ask\"><label for=\"q\">¿Cuál es la pregunta de la consultora?</label>'\n      + '<textarea class=\"q\" id=\"q\" maxlength=\"1000\" placeholder=\"Escribí la duda tal como te la hicieron…\"' + (bloqueado ? ' disabled' : '') + '>' + esc(vida(d2).borrador) + '</textarea>'\n      + '<div class=\"ask-r\">' + hint\n      + (isDemo(d2) ? '<button class=\"act try\">Consulta de ejemplo</button>' : '')\n      + '<button class=\"send go\"' + (bloqueado ? ' disabled' : '') + '>' + (d2.state.busy ? 'Buscando…' : 'Enviar pregunta') + '</button></div>'\n      + (d2.state.aviso ? '<div class=\"hint hint-w\" role=\"alert\" style=\"margin-top:6px\">' + esc(d2.state.aviso) + '</div>' : '')\n      + '</div>'\n      + '<div class=\"log\" aria-live=\"polite\">' + conversacion(d2) + '</div>'\n      + '</section>'\n      + '<aside class=\"right' + (fuentes.length ? '' : ' right-vacio') + '\" aria-label=\"Fuentes\"><div class=\"rh\"><h2>Fuentes</h2>' + (notaIdx ? '<span>' + esc(notaIdx) + '</span>' : '') + '</div><div class=\"srcs\">'\n      + (fuentes.length ? fuentes.map(function (f) { return tarjeta(d2, f) }).join('')\n        : '<div class=\"empty\"><b><svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z\" stroke-linejoin=\"round\"/><path d=\"M14 3v5h5M9 13h6M9 17h4\" stroke-linecap=\"round\"/></svg></b>' + (c && c.estado === 'sin_info' ? 'Sin fuentes confiables para esta consulta.' : 'Las wikis y FAQ usadas en la respuesta aparecen aquí.') + '</div>')\n      + '</div></aside>'\n      + '</div>'\n      + '<footer class=\"ft\">'\n      + (lat && lat.total_ms ? '<span>Respuesta en ' + nf(lat.total_ms / 1000, 1) + ' s</span>' : '')\n      + '<span>' + fuentes.length + (fuentes.length === 1 ? ' fuente' : ' fuentes') + '</span>'\n      + '<span>Mercado ' + esc(mk || '—') + '</span>'\n      + ((sup || debug) && r && r.diag ? '<span class=\"tag\">vec ' + esc(String((r.diag.faq_pasan || 0) + (r.diag.mx_vec_pasan || 0) + (r.diag.wiki_vec_pasan || 0))) + ' · texto ' + esc(String(r.diag.texto_pasan || 0)) + (r.diag.prompt_chars ? ' · ' + nf(r.diag.prompt_chars / 1000, 1) + 'k car.' : '') + '</span>' : '')\n      + ((sup || debug) && c && c.res && c.res.registrado === false ? '<span class=\"tag\" title=\"La tabla de consultas se activa con la próxima publicación\">telemetría pendiente</span>' : '')\n      + (isDemo(d2) ? '<span class=\"tag\">demo</span>' : '')\n      + '<button class=\"hist\">Historial</button>'\n      + '</footer>'\n      + modal(d2)\n      + '</div>'\n  },\n\n  mounted(d2) {\n    const v = vida(d2)\n    d2.onUnmount(function () { v.activo = false; pararReloj(d2) })\n    if (d2.param('debug') === true) {\n      try { window.__nasviApi = function (payload) { return api(d2, payload) }; window.__nasviD2 = d2 } catch (e) { /* sin ventana */ }\n    }\n    d2.setState({ origen: 'chat', hist: [], abiertas: {}, voto: { nota: 0, enviando: false, err: '' } })\n    cargarPerfil(d2)\n\n    d2.on('.q', 'input', function (e, el) { v.borrador = el.value; if (d2.state.aviso && String(el.value).trim().length >= 3) d2.setState({ aviso: '' }) })\n    d2.on('.q', 'keydown', function (e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); v.borrador = e.target.value; preguntar(d2) } })\n    d2.on('.go', 'click', function () { const el = d2.$('.q'); if (el) v.borrador = el.value; preguntar(d2) })\n    d2.on('.try', 'click', function () { v.borrador = '¿Por qué el pedido quedó retenido por límite de crédito?'; preguntar(d2) })\n    d2.on('.reintentar', 'click', function () { const c = d2.state.conv; if (c && c.pregunta) { v.borrador = c.pregunta; d2.setState({ conv: null }); preguntar(d2) } })\n    d2.on('.reperfil', 'click', function () { cargarPerfil(d2) })\n    d2.on('.chip', 'click', function (e, el) { d2.state.origen = el.dataset.o })\n    d2.on('.sel', 'change', function (e, el) {\n      d2.state.mercado = el.value\n      const p = d2.state.perfil; if (p) lsSet(kMk(p.email), el.value)\n    })\n    d2.on('.help', 'click', function () { d2.state.panel = 'help' })\n    d2.on('.hist', 'click', function () { abrirHistorial(d2) })\n    d2.on('.x', 'click', function () { d2.state.panel = null })\n    d2.on('.scrim', 'click', function (e, el) { if (e.target === el) d2.state.panel = null })\n    d2.on('.hitem', 'click', function (e, el) { d2.setState({ hsel: Number(el.dataset.h), hres: 0 }) })\n    d2.on('.irvoto', 'click', function () {\n      const vb = d2.$('.vote'); if (vb && vb.scrollIntoView) vb.scrollIntoView({ block: 'center', behavior: 'smooth' })\n      setTimeout(function () { const b = d2.$('.vote .dot'); if (b) try { b.focus({ preventScroll: true }) } catch (x) { /* sin foco */ } }, 400)\n    })\n    d2.on('.dot', 'click', function (e, el) { d2.setState({ voto: Object.assign({}, d2.state.voto || {}, { nota: Number(el.dataset.g), err: '' }) }) })\n    d2.on('.vin', 'input', function (e, el) {\n      const antes = String(v.comentario || '').trim().length >= 3\n      v.comentario = el.value\n      const ahora = String(v.comentario || '').trim().length >= 3\n      if (antes !== ahora) d2.setState({ tick: Date.now() })\n    })\n    d2.on('.vsend', 'click', function () { const el = d2.$('.vin'); if (el) v.comentario = el.value; votar(d2) })\n    d2.on('.cit', 'click', function (e, el) {\n      const n = Number(el.dataset.n)\n      if (!n) return\n      if (el.closest && el.closest('.hdet')) {\n        // en el historial: resalta la fuente en la lista del propio diálogo\n        d2.setState({ hres: n })\n        setTimeout(function () { const li = d2.$('.hf li[data-n=\"' + n + '\"]'); if (li && li.scrollIntoView) li.scrollIntoView({ block: 'nearest', behavior: 'smooth' }) }, 30)\n        setTimeout(function () { if (vida(d2).activo && Number(d2.state.hres) === n) d2.setState({ hres: 0 }) }, 2600)\n        return\n      }\n      d2.setState({ resaltada: n })\n      setTimeout(function () { const card = d2.$('#fuente-' + n); if (card && card.scrollIntoView) card.scrollIntoView({ block: 'nearest', behavior: 'smooth' }) }, 30)\n      setTimeout(function () { if (vida(d2).activo && Number(d2.state.resaltada) === n) d2.setState({ resaltada: 0 }) }, 2600)\n    })\n    d2.on('.ver', 'click', function (e, el) {\n      const a = Object.assign({}, d2.state.abiertas || {})\n      a[el.dataset.n] = !a[el.dataset.n]\n      d2.state.abiertas = a\n    })\n    d2.on('.copy', 'click', function (e, el) {\n      const c = d2.state.conv\n      const pend = d2.state.pend\n      const res = c && c.res\n      const t = res ? textoCopia(res.answer, res.fuentes) : textoCopia(pend && pend.answer, pend && pend.fuentes)\n      if (!t) return\n      copiar(d2, t).then(function (ok) {\n        try { el.textContent = ok ? 'Copiado' : 'No se pudo copiar' } catch (x) { /* ya no existe */ }\n        setTimeout(function () { try { el.textContent = 'Copiar respuesta' } catch (x) { /* ya no existe */ } }, 1600)\n      })\n    })\n    d2.on('.salir', 'click', async function () {\n      try {\n        const a = d2.auth(d2.params.auth)\n        if (a && typeof a.logout === 'function') await a.logout()\n      } catch (e) { /* sigue */ }\n      try { window.location.reload() } catch (e) { /* sin ventana */ }\n    })\n    d2.on(document, 'keydown', function (e) { if (e.key === 'Escape' && d2.state.panel) d2.state.panel = null })\n  },\n\n  updated(d2) {\n    const c = d2.state.conv\n    const key = c ? (c.estado + ':' + (c.res && c.res.query_id || '')) : ''\n    const v = vida(d2)\n    if (key && key !== v.ultimaVista) {\n      v.ultimaVista = key\n      const log = d2.$('.log'); if (log) log.scrollTop = 0\n    }\n    // diálogos: el foco entra en el diálogo al abrir y vuelve al botón que lo abrió al cerrar\n    const pn = d2.state.panel || ''\n    if (pn !== (v.panelVisto || '')) {\n      const antes = v.panelVisto || ''\n      v.panelVisto = pn\n      if (pn) { const x = d2.$('.dlg .x'); if (x) try { x.focus() } catch (e) { /* sin foco */ } }\n      else if (antes) { const b = d2.$(antes === 'hist' ? '.hist' : '.help'); if (b) try { b.focus() } catch (e) { /* sin foco */ } }\n    }\n  }\n}\n"}},"api":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"api"}}}},"auth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"auth"}}}},"app":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"app"}}}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"debug":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"debug"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}},"panelUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"panelUrl"}}}},"wikisUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"wikisUrl"}}}}}}}}}},{"_id":"6aceeea737f71ecd10acd19c","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"NasviPanel","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// NasviPanel — NASVI v4, panel del supervisor (Agents Tools).\n// Todas las métricas salen del listener nasvi-v4-api-operador (op \"panel\"), que solo responde a\n// role = supervisor y solo devuelve agregados. Tres secciones: Uso, Calidad y Base de conocimiento.\n// Cada tarjeta muestra la serie del sistema anterior (legado) y la del copiloto nuevo (v4) por separado.\n// CSV por tarjeta. Sin librerías externas.\n\nconst VERSION = 'panel-4.3.2'\nconst TIPOS = { beedoo: 'Wiki AR', mx: 'Wiki MX', wiki: 'Wiki (base nueva)', faq: 'FAQ de AVI', regla: 'Regla MX' }\nconst MERCADOS = ['AR', 'MX', 'CO', 'PE', 'CL', 'EC']\nconst NOMBRES = { AR: 'Argentina', MX: 'México', CO: 'Colombia', PE: 'Perú', CL: 'Chile', EC: 'Ecuador' }\n// hora local del mercado = hora UTC + desvío (CL usa horario de verano desde septiembre)\nconst DESVIO = { AR: -3, MX: -6, CO: -5, PE: -5, CL: -3, EC: -5 }\nconst SECCIONES = [['uso', 'Uso'], ['calidad', 'Calidad'], ['base', 'Base de conocimiento']]\nconst LIMITE_MS = 90000\n\nfunction esc(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') }\nfunction attr(s) { return esc(s).replace(/\"/g, '&quot;').replace(/'/g, '&#39;') }\nfunction isDemo(d2) { return d2.param('demo') === true }\nfunction nf(n, d) { const v = Number(n); if (!isFinite(v)) return '—'; return v.toLocaleString('es', { minimumFractionDigits: d || 0, maximumFractionDigits: d || 0 }) }\nfunction pct(a, b, d) { const x = Number(a), y = Number(b); if (!y || !isFinite(x)) return '—'; return nf((x / y) * 100, d == null ? 1 : d) + '%' }\nfunction iso(dt) { return new Date(dt).toISOString().slice(0, 10) }\nfunction haceDias(n) { const d = new Date(); d.setUTCDate(d.getUTCDate() - n); return d }\nfunction urlSegura(u) { const s = String(u || '').trim(); return /^https?:\\/\\/[^\\s\"'<>]+$/i.test(s) ? s : '' }\nfunction acento(d2) {\n  const v = String(d2.param('accent', '') || '').trim()\n  return /^(#[0-9a-f]{3,8}|(rgb|hsl)a?\\([0-9.,%\\s/deg]+\\)|[a-z]{3,24})$/i.test(v) ? v : '#FF6C0E'\n}\nfunction fecha(v) {\n  const t = typeof v === 'number' ? v : Date.parse(v)\n  if (!t) return '—'\n  try { return new Date(t).toLocaleString('es', { day: '2-digit', month: '2-digit', hour: '2-digit', minute: '2-digit' }) } catch (e) { return String(v).slice(0, 16) }\n}\nconst VIDA = new WeakMap()\nfunction vida(d2) { let v = VIDA.get(d2); if (!v) { v = { activo: true, pedido: 0 }; VIDA.set(d2, v) } return v }\nfunction poner(d2, o) { if (vida(d2).activo) d2.setState(o) }\n\n// ---- API (mismo contrato que el copiloto: el e-mail de la sesión viaja y la policy lo verifica) ----\nasync function emailSesion(d2) {\n  try {\n    const a = d2.auth(d2.params.auth)\n    if (!a) return ''\n    const c = []\n    try {\n      let g = a.raw && typeof a.raw.getSelectedSession === 'function' ? a.raw.getSelectedSession() : null\n      if (g && typeof g.then === 'function') g = await g\n      if (g && g.credentials) c.push(g.credentials.email)\n    } catch (e) { /* sigue */ }\n    const u = a.user || {}, s = a.session || {}\n    c.push(u.email, s.credentials && s.credentials.email)\n    for (let i = 0; i < c.length; i++) if (typeof c[i] === 'string' && c[i].indexOf('@') > 0) return c[i].trim().toLowerCase()\n  } catch (e) { /* sin sesión */ }\n  return ''\n}\nfunction conLimite(p, ms) {\n  let t = null\n  const reloj = new Promise(function (_, rej) { t = setTimeout(function () { rej(new Error('La API no respondió a tiempo.')) }, ms) })\n  return Promise.race([Promise.resolve(p), reloj]).finally(function () { clearTimeout(t) })\n}\nfunction esResp(o) { return !!o && typeof o === 'object' && !Array.isArray(o) && ('ok' in o || 'op' in o) }\nfunction desenvolver(res) {\n  let r = res\n  for (let i = 0; i < 3; i++) {\n    if (!r || typeof r !== 'object' || Array.isArray(r) || esResp(r)) break\n    if (esResp(r.data)) { r = r.data; continue }\n    if (r.data && typeof r.data === 'object') { r = r.data; continue }\n    break\n  }\n  return (r && typeof r === 'object') ? r : {}\n}\nfunction textoError(e) {\n  const msg = String((e && e.message) || e || '')\n  if (/\\b40[13]\\b|unauthori|no permissions/i.test(msg)) return 'Sesión vencida o sin permiso. Vuelva a iniciar sesión.'\n  if (/failed to fetch|network|load failed/i.test(msg)) return 'Sin conexión con el servidor.'\n  return msg.slice(0, 200) || 'Error desconocido.'\n}\nasync function api(d2, payload) {\n  if (isDemo(d2)) return demoApi(payload)\n  const ref = d2.params && d2.params.api\n  if (!ref) throw new Error('El parámetro \"api\" no está conectado.')\n  const email = await emailSesion(d2)\n  if (!email) throw new Error('No se encontró la sesión. Vuelva a iniciar sesión.')\n  return desenvolver(await conLimite(d2.rush(ref).invoke(Object.assign({}, payload, { email: email, client_version: VERSION })), LIMITE_MS))\n}\n\n// ---- demo ----\nfunction demoApi(p) {\n  return new Promise(function (res) {\n    setTimeout(function () {\n      if (p.op === 'perfil') return res({ ok: true, perfil: { nombre: 'Supervisora Demo', email: 'sup@natura.net', supervisor: true, mercados: MERCADOS } })\n      if (p.seccion === 'uso') {\n        const dias = []\n        for (let i = 0; i < 30; i++) { const d = iso(haceDias(29 - i)); dias.push({ _id: { d: d, c: 'AR' }, n: Math.round(20 + 15 * Math.sin(i / 3)) }, { _id: { d: d, c: 'MX' }, n: Math.round(8 + 6 * Math.cos(i / 4)) }) }\n        return res({ ok: true, seccion: 'uso', legado: { por_dia: dias.filter(function (x, i) { return i < 20 }), por_hora: [{ _id: { h: '13', c: 'AR' }, n: 40 }, { _id: { h: '15', c: 'AR' }, n: 55 }, { _id: { h: '18', c: 'MX' }, n: 22 }], por_canal: [{ _id: 'chat', n: 120 }, { _id: 'voz', n: 30 }], top: [{ _id: 'ana@natura.net', nombre: 'Ana Gómez', n: 44, c: 'AR' }], activos_total: [{ n: 14 }], sin_email: [{ n: 12 }] }, registrados: { por_mercado: [{ _id: 'AR', n: 40 }, { _id: 'MX', n: 30 }], total: [{ n: 70 }] }, v4: { por_dia: dias.slice(20), por_hora: [{ _id: { h: '14', c: 'AR' }, n: 30 }], por_canal: [{ _id: 'chat', n: 80 }, { _id: 'video', n: 9 }], top: [{ _id: 'jose@natura.net', nombre: 'José Pérez', n: 31, c: 'AR' }], activos_total: [{ n: 13 }], consultas_operadores: [{ n: 520 }] }, supervisores_excluidos: true, errores: [] })\n      }\n      if (p.seccion === 'calidad') return res({ ok: true, seccion: 'calidad', legado: { votos: [{ _id: 5, n: 30 }, { _id: 4, n: 22 }, { _id: 2, n: 6 }, { _id: 1, n: 4 }], eventos: [{ _id: 'assistant_ask', n: 300 }, { _id: 'answer_not_found', n: 12 }] }, v4: { resumen: [{ n: 120, nf: 14, rated: 90, deg: 0, err: 1, txt: 6, best: 0.77 }], notas: [{ _id: 5, n: 50 }, { _id: 4, n: 25 }, { _id: 3, n: 8 }, { _id: 2, n: 4 }, { _id: 1, n: 3 }], latencia_500ms: [{ _id: 4, n: 20 }, { _id: 5, n: 40 }, { _id: 6, n: 30 }, { _id: 9, n: 10 }], score_005: [{ _id: 14, n: 10 }, { _id: 15, n: 60 }, { _id: 16, n: 36 }], citas_tipo: [{ _id: 'v4.5', n: 20, con_wiki: 6, con_faq: 18, w_of: 30, w_ci: 7, f_of: 70, f_ci: 30 }, { _id: 'v4.6', n: 12, con_wiki: 10, con_faq: 8, w_of: 40, w_ci: 18, f_of: 30, f_ci: 10 }], curaduria: [{ question: '¿Cómo cambio la dirección?', answer: 'Estimado asesor, …', comment: 'Faltó el paso del sistema', grade: 2, operator_name: 'Ana Gómez', operator_email: 'ana@natura.net', market: 'AR', createdAt: new Date().toISOString(), fuentes: [{ n: 1, titulo: 'DIRECCIÓN DE ENTREGA', url: null, citada: true }] }] }, errores: [] })\n      return res({ ok: true, seccion: 'base', legado: { beedoo_ar: [{ _id: null, n: 671, a: 49 }], beedoo_mx: [{ _id: null, n: 373, a: 24 }], faq_curada: [{ _id: 'a', n: 191 }], wikis_citadas: [{ _id: '469962', n: 40 }] }, v4: { wikis: [], faq_usadas: [{ _id: 'f1', titulo: 'PLAZOS DE ENTREGA DE PEDIDOS ELO', mk: 'AR', ofrecida: 14, citada: 9, ult: new Date().toISOString() }], wikis_usadas: [{ _id: { c: 'beedoo', id: 'w1' }, titulo: 'Proceso Documentado Reclamos Transporte - CAN Argentina › 2. Atraso de Entrega', url: null, ofrecida: 11, citada: 7, ult: new Date().toISOString() }], lagunas: [{ question: '¿Cuál es la capital de Francia?', market: 'AR', createdAt: new Date().toISOString(), operator_name: 'Ana' }], articulos: 0, nunca_citadas: [] }, regiones: { AR: 'a' }, errores: [] })\n    }, 400)\n  })\n}\n\n// ---- carga ----\nfunction filtros(d2) {\n  return { desde: d2.state.desde || iso(haceDias(29)), hasta: d2.state.hasta || iso(new Date()), mercado: d2.state.mercado || '' }\n}\nasync function cargar(d2) {\n  const f = filtros(d2)\n  if (f.desde > f.hasta) { poner(d2, { aviso: 'La fecha inicial es posterior a la final. Los números de abajo son del período anterior.', viejo: true }); return }\n  if ((Date.parse(f.hasta) - Date.parse(f.desde)) / 86400000 > 399) { poner(d2, { aviso: 'Elija un período de hasta 400 días. Los números de abajo son del período anterior.', viejo: true }); return }\n  const v = vida(d2)\n  const pedido = ++v.pedido\n  poner(d2, { cargando: { uso: true, calidad: true, base: true }, errSec: {}, aviso: '', viejo: false })\n  SECCIONES.forEach(function (s) {\n    api(d2, { op: 'panel', seccion: s[0], desde: f.desde, hasta: f.hasta, mercado: f.mercado }).then(function (r) {\n      if (pedido !== vida(d2).pedido) return\n      const datos = Object.assign({}, d2.state.datos || {})\n      const carg = Object.assign({}, d2.state.cargando || {})\n      const errs = Object.assign({}, d2.state.errSec || {})\n      carg[s[0]] = false\n      if (r.ok) datos[s[0]] = r\n      else errs[s[0]] = (r.error && r.error.message) || 'No fue posible cargar la sección.'\n      poner(d2, { datos: datos, cargando: carg, errSec: errs, actualizado: Date.now() })\n    }).catch(function (e) {\n      if (pedido !== vida(d2).pedido) return\n      const carg = Object.assign({}, d2.state.cargando || {})\n      const errs = Object.assign({}, d2.state.errSec || {})\n      carg[s[0]] = false; errs[s[0]] = textoError(e)\n      poner(d2, { cargando: carg, errSec: errs })\n    })\n  })\n}\nasync function iniciar(d2) {\n  poner(d2, { verificando: true, errPerfil: '' })\n  try {\n    const r = await api(d2, { op: 'perfil' })\n    if (!r.ok) { poner(d2, { verificando: false, errPerfil: (r.error && r.error.message) || 'No fue posible verificar el usuario.' }); return }\n    const p = r.perfil || {}\n    poner(d2, { verificando: false, perfil: p, pv: r.prompt_version || '' })\n    if (p.supervisor) cargar(d2)\n  } catch (e) { poner(d2, { verificando: false, errPerfil: textoError(e) }) }\n}\n\n// ---- transformaciones ----\nfunction arr(x) { return Array.isArray(x) ? x : [] }\nfunction n0(rows) { if (rows == null) return NaN; return Number((arr(rows)[0] || {}).n) || 0 }\nfunction diasDe(desde, hasta) {\n  const out = []\n  const a = Date.parse(desde + 'T00:00:00Z'), b = Date.parse(hasta + 'T00:00:00Z')\n  for (let t = a; t <= b && out.length < 400; t += 86400000) out.push(iso(t))\n  return out\n}\nfunction porDia(rows, dias) {\n  const m = {}\n  arr(rows).forEach(function (r) { const d = r._id && r._id.d; if (d) m[d] = (m[d] || 0) + (Number(r.n) || 0) })\n  return dias.map(function (d) { return m[d] || 0 })\n}\nfunction porMercado(rowsA, rowsB) {\n  const m = {}\n  arr(rowsA).concat(arr(rowsB)).forEach(function (r) { const c = (r._id && r._id.c) || 'sin dato'; m[c] = (m[c] || 0) + (Number(r.n) || 0) })\n  return Object.keys(m).map(function (k) { return { _id: k, n: m[k] } }).sort(function (a, b) { return b.n - a.n })\n}\nfunction porHoraLocal(rows) {\n  const out = []\n  for (let h = 0; h < 24; h++) out.push(0)\n  arr(rows).forEach(function (r) {\n    const h = Number(r._id && r._id.h), c = r._id && r._id.c\n    if (!isFinite(h)) return\n    const loc = (((h + (DESVIO[c] || 0)) % 24) + 24) % 24\n    out[loc] += Number(r.n) || 0\n  })\n  return out\n}\nfunction sumarPorId(rowsA, rowsB, etiqueta) {\n  const m = {}\n  arr(rowsA).concat(arr(rowsB)).forEach(function (r) { const k = r._id == null || r._id === '' ? etiqueta : String(r._id); m[k] = (m[k] || 0) + (Number(r.n) || 0) })\n  return Object.keys(m).map(function (k) { return { _id: k, n: m[k] } }).sort(function (a, b) { return b.n - a.n })\n}\nfunction percentil(bins, p) {\n  const rows = arr(bins).map(function (b) { return { k: Number(b._id), n: Number(b.n) || 0 } }).filter(function (b) { return isFinite(b.k) }).sort(function (a, b) { return a.k - b.k })\n  const tot = rows.reduce(function (s, b) { return s + b.n }, 0)\n  if (!tot) return null\n  let acc = 0\n  for (let i = 0; i < rows.length; i++) { acc += rows[i].n; if (acc >= tot * p) return (rows[i].k + 0.5) * 0.5 }\n  return null\n}\nfunction notaMedia(rows) {\n  let s = 0, q = 0\n  arr(rows).forEach(function (r) { const g = Number(r._id), n = Number(r.n) || 0; if (g >= 1 && g <= 5) { s += g * n; q += n } })\n  return q ? { media: s / q, n: q } : { media: null, n: 0 }\n}\nfunction codigoRegion(regiones, id) {\n  const ks = Object.keys(regiones || {})\n  for (let i = 0; i < ks.length; i++) if (String(regiones[ks[i]]) === String(id)) return ks[i]\n  return null\n}\n\n// ---- gráficos (HTML/CSS) ----\nfunction vacio(t) { return '<div class=\"empty\">' + esc(t || 'Sin datos en el período.') + '</div>' }\nfunction barrasH(rows, etiq) {\n  if (!rows || !rows.length) return vacio()\n  const max = Math.max.apply(null, rows.map(function (r) { return Number(r.n) || 0 })) || 1\n  return '<ul class=\"bars\">' + rows.map(function (r) {\n    const n = Number(r.n) || 0, w = Math.max(1.5, (n / max) * 100), lab = etiq ? etiq(r) : String(r._id)\n    return '<li data-key=\"' + attr(lab) + '\"><span class=\"bl\" title=\"' + attr(lab) + '\">' + esc(lab) + '</span><span class=\"bt\"><i style=\"width:' + w.toFixed(1) + '%\"></i></span><span class=\"bv\">' + esc(nf(n)) + '</span></li>'\n  }).join('') + '</ul>'\n}\nfunction columnasDia(dias, serieA, serieB) {\n  const tot = serieA.reduce(function (s, x) { return s + x }, 0) + serieB.reduce(function (s, x) { return s + x }, 0)\n  if (!tot) return vacio()\n  const max = Math.max.apply(null, dias.map(function (d, i) { return serieA[i] + serieB[i] })) || 1\n  const paso = Math.max(1, Math.round(dias.length / 8))\n  return '<div class=\"cols\">' + dias.map(function (d, i) {\n    const a = serieA[i], b = serieB[i]\n    const ult = i === dias.length - 1\n    const rot = ult || (i % paso === 0 && dias.length - 1 - i >= paso)\n    return '<div class=\"col\" data-key=\"' + attr(d) + '\" title=\"' + attr(d + ' — sistema anterior ' + a + ' · v4 ' + b) + '\"><div class=\"stk\"><i class=\"s2\" style=\"height:' + ((b / max) * 100).toFixed(1) + '%\"></i><i class=\"s1\" style=\"height:' + ((a / max) * 100).toFixed(1) + '%\"></i></div><span>' + (rot ? esc(d.slice(5)) : '') + '</span></div>'\n  }).join('') + '</div><ul class=\"leg\"><li><b class=\"dot s1\"></b>Sistema anterior</li><li><b class=\"dot s2\"></b>Copiloto v4</li></ul>'\n}\nfunction columnasHora(serie) {\n  const tot = serie.reduce(function (s, x) { return s + x }, 0)\n  if (!tot) return vacio()\n  const max = Math.max.apply(null, serie) || 1\n  return '<div class=\"cols\">' + serie.map(function (n, h) {\n    return '<div class=\"col\" data-key=\"h' + h + '\" title=\"' + h + ':00 — ' + attr(nf(n)) + '\"><div class=\"stk\"><i class=\"s1\" style=\"height:' + (n ? Math.max(2, (n / max) * 100) : 0).toFixed(1) + '%\"></i></div><span>' + (h % 3 === 0 ? h : '') + '</span></div>'\n  }).join('') + '</div>'\n}\nfunction distNotas(rows, rowsLeg) {\n  const v = [1, 2, 3, 4, 5].map(function (g) { return { g: g, n: arr(rows).filter(function (r) { return Number(r._id) === g }).reduce(function (s, r) { return s + (Number(r.n) || 0) }, 0) } })\n  const l = [1, 2, 3, 4, 5].map(function (g) { return { g: g, n: arr(rowsLeg).filter(function (r) { return Number(r._id) === g }).reduce(function (s, r) { return s + (Number(r.n) || 0) }, 0) } })\n  const tv = v.reduce(function (s, x) { return s + x.n }, 0), tl = l.reduce(function (s, x) { return s + x.n }, 0)\n  if (!tv && !tl) return vacio('Sin votos en el período.')\n  const fila = function (nombre, xs, t) {\n    return '<div class=\"dist\"><span class=\"dl\">' + esc(nombre) + '</span><div class=\"segbar\">' + xs.map(function (x) { return x.n ? '<i class=\"g' + x.g + '\" style=\"width:' + ((x.n / t) * 100).toFixed(2) + '%\" title=\"nota ' + x.g + ': ' + x.n + '\"></i>' : '' }).join('') + '</div><span class=\"dv\">' + esc(nf(t)) + '</span></div>'\n  }\n  return (tv ? fila('Copiloto v4', v, tv) : '') + (tl ? fila('Sistema anterior', l, tl) : '')\n    + '<ul class=\"leg\">' + [1, 2, 3, 4, 5].map(function (g) { return '<li><b class=\"dot g' + g + '\"></b>' + g + '</li>' }).join('') + '</ul>'\n}\nfunction histo(rows, rotulo, ancho) {\n  const xs = arr(rows).map(function (r) { return { k: Number(r._id), n: Number(r.n) || 0 } }).filter(function (r) { return isFinite(r.k) }).sort(function (a, b) { return a.k - b.k })\n  if (!xs.length) return vacio()\n  return barrasH(xs.map(function (x) { return { _id: rotulo(x.k), n: x.n } }), null)\n}\nfunction tabla(cols, rows, cls) {\n  if (!rows || !rows.length) return vacio()\n  return '<div class=\"tbw\"><table class=\"tb' + (cls ? ' ' + cls : '') + '\"><thead><tr>' + cols.map(function (c) { return '<th>' + esc(c[0]) + '</th>' }).join('') + '</tr></thead><tbody>'\n    + rows.map(function (r, i) { return '<tr data-key=\"r' + i + '\">' + cols.map(function (c) { return '<td>' + c[1](r) + '</td>' }).join('') + '</tr>' }).join('') + '</tbody></table></div>'\n}\n\n// ---- tarjetas ----\n// Cada tarjeta registra sus filas en d2 para el botón CSV.\nfunction tarjeta(d2, id, titulo, sub, cuerpo, csv, ancho) {\n  const reg = vida(d2).csv || (vida(d2).csv = {})\n  reg[id] = csv\n  return '<section class=\"card' + (ancho ? ' wide' : '') + '\" data-key=\"' + attr(id) + '\"><div class=\"cardhd\"><h3>' + esc(titulo) + '</h3>'\n    + (csv && csv.rows && csv.rows.length ? '<button class=\"tgl csv\" data-c=\"' + attr(id) + '\" title=\"Descargar CSV\">CSV</button>' : '') + '</div>'\n    + (sub ? '<div class=\"sub\">' + esc(sub) + '</div>' : '') + cuerpo + '</section>'\n}\nfunction mdMin(t) { return esc(t).replace(/\\*\\*([^*\\n]+)\\*\\*/g, '<strong>$1</strong>') }\n// FAQ/wikis más usadas: desempate estable (citada, ofrecida, último uso, título)\nfunction ordenUso(xs) {\n  return xs.slice().sort(function (a, b) { return (Number(b.citada) - Number(a.citada)) || (Number(b.ofrecida) - Number(a.ofrecida)) || ((Date.parse(b.ult) || 0) - (Date.parse(a.ult) || 0)) || String(a.titulo || '').localeCompare(String(b.titulo || '')) })\n}\nfunction kpi(v, l, n) { return '<div class=\"kpi\"><div class=\"v\">' + esc(v) + '</div><div class=\"l\">' + esc(l) + '</div>' + (n ? '<div class=\"n\">' + esc(n) + '</div>' : '') + '</div>' }\n\nfunction secUso(d2, r) {\n  const f0 = filtros(d2)\n  const f = { desde: r.desde || f0.desde, hasta: r.hasta || f0.hasta, mercado: r.mercado != null ? r.mercado : f0.mercado }\n  const dias = diasDe(f.desde, f.hasta)\n  const L = r.legado || {}, V = r.v4 || {}, R = r.registrados || {}\n  const sA = porDia(L.por_dia, dias), sB = porDia(V.por_dia, dias)\n  const totA = sA.reduce(function (s, x) { return s + x }, 0), totB = sB.reduce(function (s, x) { return s + x }, 0)\n  const regs = f.mercado ? arr(R.por_mercado).filter(function (x) { return x._id === f.mercado }).reduce(function (s, x) { return s + (Number(x.n) || 0) }, 0) : n0(R.total)\n  const actV = n0(V.activos_total), actL = n0(L.activos_total), consOp = n0(V.consultas_operadores), sinEmail = n0(L.sin_email)\n  vida(d2).periodo = { desde: f.desde, hasta: f.hasta }\n  const sinSup = r.supervisores_excluidos !== false\n  const horas = porHoraLocal(arr(L.por_hora).concat(arr(V.por_hora)))\n  const merc = porMercado(L.por_dia, V.por_dia)\n  const canal = sumarPorId(L.por_canal, V.por_canal, 'sin dato')\n  const top = arr(V.top).map(function (x) { return { email: x._id || '', nombre: x.nombre || '', mercado: x.c || '', n: x.n, serie: 'v4' } })\n    .concat(arr(L.top).map(function (x) { return { email: x._id || '', nombre: x.nombre || '', mercado: x.c || '', n: x.n, serie: 'legado' } }))\n    .sort(function (a, b) { return b.n - a.n }).slice(0, 15)\n  return '<div class=\"kpis\">'\n    + kpi(nf(totA + totB), 'Consultas en el período', nf(totB) + ' en el copiloto v4 · ' + nf(totA) + ' en el sistema anterior')\n    + kpi(pct(actV, regs, 1), 'Operadores activos (v4)', nf(actV) + ' de ' + nf(regs) + ' registrados (sin contar supervisores)' + (sinSup ? '' : ' · incluye supervisores (no se pudo leer la lista)'))\n    + kpi(nf(actL), 'Activos en el sistema anterior', 'con e-mail registrado y al menos una consulta' + (sinSup ? ', sin supervisores' : ' · incluye supervisores (no se pudo leer la lista)') + (sinEmail > 0 ? ' · ' + nf(sinEmail) + ' consultas sin e-mail' : ''))\n    + kpi(actV ? nf(consOp / actV, 1) : '—', 'Consultas por operador activo (v4)', sinSup ? 'sin contar a los supervisores' : 'incluye supervisores (no se pudo leer la lista)')\n    + '</div><div class=\"grid\">'\n    + tarjeta(d2, 'dia', 'Consultas por día', 'UTC · apilado: sistema anterior + copiloto v4', columnasDia(dias, sA, sB), { cols: ['dia', 'sistema_anterior', 'copiloto_v4'], rows: dias.map(function (d, i) { return [d, sA[i], sB[i]] }) }, true)\n    + tarjeta(d2, 'mercado', 'Consultas por mercado', 'ambos sistemas', barrasH(merc, function (x) { return x._id + (NOMBRES[x._id] ? ' · ' + NOMBRES[x._id] : '') }), { cols: ['mercado', 'consultas'], rows: merc.map(function (x) { return [x._id, x.n] }) })\n    + tarjeta(d2, 'canal', 'Consultas por canal', 'chat · voz · video', barrasH(canal), { cols: ['canal', 'consultas'], rows: canal.map(function (x) { return [x._id, x.n] }) })\n    + tarjeta(d2, 'hora', 'Horas de mayor actividad', 'hora local de cada mercado', columnasHora(horas), { cols: ['hora_local', 'consultas'], rows: horas.map(function (n, h) { return [h, n] }) })\n    + tarjeta(d2, 'top', 'Operadores con más consultas', 'nombre y e-mail · ' + (sinSup ? 'sin supervisores' : 'incluye supervisores') + ' · v4 y sistema anterior (este, solo registros con e-mail)',\n      tabla([['Operador', function (x) { return '<b>' + esc(x.nombre || '—') + '</b><br><span class=\"mut\">' + esc(x.email || 'sin e-mail') + '</span>' }], ['Mercado', function (x) { return esc(x.mercado) }], ['Serie', function (x) { return '<span class=\"tag tag-' + x.serie + '\">' + (x.serie === 'v4' ? 'v4' : 'anterior') + '</span>' }], ['Consultas', function (x) { return '<b>' + esc(nf(x.n)) + '</b>' }]], top),\n      { cols: ['nombre', 'email', 'mercado', 'serie', 'consultas'], rows: top.map(function (x) { return [x.nombre, x.email, x.mercado, x.serie, x.n] }) }, true)\n    + '</div>'\n}\n\nfunction secCalidad(d2, r) {\n  const L = r.legado || {}, V = r.v4 || {}\n  vida(d2).periodo = { desde: r.desde || filtros(d2).desde, hasta: r.hasta || filtros(d2).hasta }\n  const res = arr(V.resumen)[0] || {}\n  const n = Number(res.n) || 0, nfd = Number(res.nf) || 0, rated = Number(res.rated) || 0, soloTxt = Number(res.txt) || 0\n  const errIa = Number(res.err) || 0\n  const respondidas = Math.max(0, n - nfd - errIa)\n  const nm = notaMedia(V.notas), nl = notaMedia(L.votos)\n  const p50 = percentil(V.latencia_500ms, 0.5), p90 = percentil(V.latencia_500ms, 0.9)\n  const ev = {}; arr(L.eventos).forEach(function (x) { ev[x._id] = Number(x.n) || 0 })\n  const cur = arr(V.curaduria)\n  const ct = arr(V.citas_tipo)\n  const pv = d2.state.pv || ''\n  const ctPv = ct.filter(function (x) { return x._id === pv })[0] || null\n  return '<div class=\"kpis\">'\n    + kpi(nm.media == null ? '—' : nf(nm.media, 2), 'Nota media (v4)', nm.n + ' votos' + (nl.media == null ? '' : ' · anterior ' + nf(nl.media, 2) + ' (' + nl.n + ')'))\n    + kpi(pct(rated, respondidas, 0), 'Respuestas evaluadas (v4)', 'con nota del operador: ' + nf(rated) + ' de ' + nf(respondidas) + ' respuestas con fuente')\n    + kpi(pct(nfd, n, 1), 'Sin información (v4)', nf(nfd) + ' de ' + nf(n) + ' consultas no tuvieron fuente confiable')\n    + kpi(p50 == null ? '—' : '≈' + nf(p50, 1) + ' s', 'Latencia p50 (v4)', p90 == null ? '' : 'p90 ≈' + nf(p90, 1) + ' s · aproximado por franjas de 0,5 s')\n    + kpi(res.best == null ? '—' : nf(res.best, 2), 'Similitud media de la mejor fuente', 'consultas con fuente semántica (FAQ/wikis)')\n    + kpi(ctPv ? pct(ctPv.con_wiki, ctPv.n, 0) : '—', 'Respuestas que citan wiki' + (pv ? ' (' + pv + ')' : ''), ctPv ? nf(ctPv.con_wiki) + ' de ' + nf(ctPv.n) + ' · citan FAQ: ' + nf(ctPv.con_faq) : 'sin respuestas con el prompt actual en el período')\n    + '</div><div class=\"grid\">'\n    + tarjeta(d2, 'notas', 'Distribución de notas', '1 = nada útil · 5 = exactamente lo que necesitaba', distNotas(V.notas, L.votos), { cols: ['nota', 'copiloto_v4', 'sistema_anterior'], rows: [1, 2, 3, 4, 5].map(function (g) { return [g, arr(V.notas).filter(function (x) { return Number(x._id) === g }).reduce(function (s, x) { return s + x.n }, 0), arr(L.votos).filter(function (x) { return Number(x._id) === g }).reduce(function (s, x) { return s + x.n }, 0)] }) })\n    + tarjeta(d2, 'lat', 'Latencia de respuesta (v4)', 'segundos, en franjas de 0,5 s', histo(V.latencia_500ms, function (k) { return nf(k * 0.5, 1) + '–' + nf((k + 1) * 0.5, 1) + ' s' }), { cols: ['franja_s', 'consultas'], rows: arr(V.latencia_500ms).map(function (x) { return [x._id * 0.5, x.n] }) })\n    + tarjeta(d2, 'score', 'Similitud de la mejor fuente (v4)', 'franjas de 0,05 · más alto = fuente más parecida' + (soloTxt ? ' · ' + nf(soloTxt) + ' respuestas solo con fuente de texto (sin similitud)' : ''), histo(V.score_005, function (k) { return nf(k * 0.05, 2) + '–' + nf((k + 1) * 0.05, 2) }), { cols: ['franja', 'consultas'], rows: arr(V.score_005).map(function (x) { return [x._id * 0.05, x.n] }) })\n    + tarjeta(d2, 'tipos', 'Citas por tipo de fuente', 'por versión del prompt · ofrecidas = enviadas a la IA · citadas = usadas en la respuesta', tabla([['Prompt', function (x) { return esc(x._id || '—') }], ['Respuestas', function (x) { return esc(nf(x.n)) }], ['Citan wiki', function (x) { return '<b>' + esc(pct(x.con_wiki, x.n, 0)) + '</b>' }], ['Citan FAQ', function (x) { return esc(pct(x.con_faq, x.n, 0)) }], ['Wikis citadas / ofrecidas', function (x) { return esc(nf(x.w_ci) + ' / ' + nf(x.w_of)) }], ['FAQ citadas / ofrecidas', function (x) { return esc(nf(x.f_ci) + ' / ' + nf(x.f_of)) }]], ct, 'tb-t'), { cols: ['prompt', 'respuestas', 'citan_wiki', 'citan_faq', 'wikis_citadas', 'wikis_ofrecidas', 'faq_citadas', 'faq_ofrecidas'], rows: ct.map(function (x) { return [x._id, x.n, x.con_wiki, x.con_faq, x.w_ci, x.w_of, x.f_ci, x.f_of] }) }, true)\n    + tarjeta(d2, 'legado', 'Sistema anterior', 'eventos del período', '<div class=\"mini\">' + kpi(nf(ev.assistant_ask || 0), 'Preguntas', '') + kpi(nf(ev.answer_not_found || 0), 'Marcadas \"no encontrado\"', '') + '</div>', { cols: ['evento', 'cantidad'], rows: Object.keys(ev).map(function (k) { return [k, ev[k]] }) })\n    + tarjeta(d2, 'curaduria', 'Pendientes de curaduría (nota 1 o 2)', 'respuestas mal evaluadas para revisar la base', cur.length ? '<ul class=\"cur\">' + cur.map(function (c, i) {\n      return '<li data-key=\"c' + i + '\"><div class=\"ch\"><span class=\"nota n' + esc(c.grade) + '\">' + esc(c.grade) + '</span><b>' + esc(c.question) + '</b></div>'\n        + '<div class=\"mut\">' + esc((c.operator_name || '') + ' · ' + (c.operator_email || '') + ' · ' + (c.market || '') + ' · ' + fecha(c.createdAt)) + '</div>'\n        + (c.comment ? '<div class=\"com\">“' + esc(c.comment) + '”</div>' : '')\n        + '<details><summary>Ver respuesta y fuentes</summary><p class=\"ans\">' + mdMin(c.answer) + '</p><ul class=\"fl\">' + arr(c.fuentes).map(function (s) { const u = urlSegura(s.url); return '<li>[' + esc(s.n) + '] ' + (u ? '<a href=\"' + attr(u) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(s.titulo) + '</a>' : esc(s.titulo)) + (s.citada ? ' <span class=\"tag\">citada</span>' : '') + '</li>' }).join('') + '</ul></details></li>'\n    }).join('') + '</ul>' : vacio('No hay respuestas con nota 1 o 2 en el período.'), { cols: ['fecha', 'operador', 'email', 'mercado', 'nota', 'pregunta', 'comentario'], rows: cur.map(function (c) { return [c.createdAt, c.operator_name, c.operator_email, c.market, c.grade, c.question, c.comment] }) }, true)\n    + '</div>'\n}\n\nfunction secBase(d2, r) {\n  const L = r.legado || {}, V = r.v4 || {}, reg = r.regiones || {}\n  vida(d2).periodo = { desde: r.desde || filtros(d2).desde, hasta: r.hasta || filtros(d2).hasta }\n  const faq = {}\n  let otras = 0\n  arr(L.faq_curada).forEach(function (x) { const c = codigoRegion(reg, x._id); if (c) faq[c] = (faq[c] || 0) + (Number(x.n) || 0); else otras += Number(x.n) || 0 })\n  const faqRows = MERCADOS.map(function (c) { return { _id: c, n: faq[c] || 0 } })\n  const bAr = arr(L.beedoo_ar).filter(function (x) { return !x._id || (x._id.c === 'AR' && x._id.e !== true) }).reduce(function (s, x) { return { n: s.n + (Number(x.n) || 0), a: s.a + (Number(x.a) || 0) } }, { n: 0, a: 0 })\n  const bMx = arr(L.beedoo_mx)[0] || {}\n  const t1 = arr(V.wikis)\n  const t1Rows = t1.map(function (x) { return { mercado: (x._id && x._id.m) || '?', ecommerce: !!(x._id && x._id.e), trechos: x.n, articulos: x.a, ult: x.ult } })\n  const faqU = ordenUso(arr(V.faq_usadas)), wikU = ordenUso(arr(V.wikis_usadas)), lagunas = arr(V.lagunas), nunca = arr(V.nunca_citadas)\n  const legW = arr(L.wikis_citadas).filter(function (x) { return x._id != null && x._id !== '' })\n  const todos = filtros(d2).mercado ? ' · no depende del filtro de mercado' : ''\n  // lagunas: la misma pregunta repetida aparece una vez, con la cantidad y la fecha más reciente\n  const lagG = [], lagI = {}\n  lagunas.forEach(function (x) {\n    const k = String(x.question || '').trim().toLowerCase()\n    if (lagI[k] == null) { lagI[k] = lagG.length; lagG.push(Object.assign({}, x, { veces: 1 })) } else { const g = lagG[lagI[k]]; g.veces++; if ((Date.parse(x.createdAt) || 0) > (Date.parse(g.createdAt) || 0)) g.createdAt = x.createdAt }\n  })\n  return '<div class=\"kpis\">'\n    + kpi(nf(faqRows.reduce(function (s, x) { return s + x.n }, 0)), 'FAQ curadas activas', 'finalizadas, no pendientes y vigentes en los 6 mercados' + (otras ? ' · ' + nf(otras) + ' en otras regiones' : '') + todos)\n    + kpi(nf(bAr.a) + ' / ' + nf(bAr.n), 'Wikis AR (base anterior)', 'artículos / fragmentos · búsqueda por texto')\n    + kpi(nf(bMx.a) + ' / ' + nf(bMx.n), 'Wikis MX (base anterior)', 'artículos / fragmentos · búsqueda semántica')\n    + kpi(t1.length ? nf(V.articulos == null ? NaN : Number(V.articulos)) : '—', 'Base nueva de wikis (v4)', t1.length ? 'artículos importados' : 'pendiente de la carga inicial')\n    + '</div><div class=\"grid\">'\n    + tarjeta(d2, 'faq', 'FAQ curadas por mercado', 'solo las activas: finalizadas, no pendientes y vigentes' + todos, barrasH(faqRows, function (x) { return x._id + ' · ' + NOMBRES[x._id] }), { cols: ['mercado', 'faq_activas'], rows: faqRows.map(function (x) { return [x._id, x.n] }) })\n    + tarjeta(d2, 't1', 'Base nueva de wikis por mercado', 'fragmentos y artículos importados por el panel de wikis', t1Rows.length ? tabla([['Mercado', function (x) { return esc(x.mercado) + (x.ecommerce ? ' · e-commerce' : '') }], ['Artículos', function (x) { return esc(nf(x.articulos)) }], ['Fragmentos', function (x) { return esc(nf(x.trechos)) }], ['Última importación', function (x) { return esc(fecha(x.ult)) }]], t1Rows) : vacio('Todavía no hay artículos en la base nueva.'), { cols: ['mercado', 'ecommerce', 'articulos', 'fragmentos', 'ultima_importacion'], rows: t1Rows.map(function (x) { return [x.mercado, x.ecommerce, x.articulos, x.trechos, x.ult] }) })\n    + tarjeta(d2, 'faqus', 'FAQ más usadas (v4)', 'FAQ de AVI que entraron en las fuentes de una respuesta · citada = la respuesta la usó', tabla([['FAQ', function (x) { return esc(x.titulo || x._id) + '<br><span class=\"mut\">' + esc((x.mk || '') + (x.cat && [].concat(x.cat).length ? ' · ' + [].concat(x.cat).join(', ') : '')) + '</span>' }], ['Ofrecida', function (x) { return esc(nf(x.ofrecida)) }], ['Citada', function (x) { return '<b>' + esc(nf(x.citada)) + '</b>' }], ['% citada', function (x) { return esc(pct(x.citada, x.ofrecida, 0)) }], ['Último uso', function (x) { return esc(fecha(x.ult)) }]], faqU, 'tb-u'), { cols: ['faq', 'mercado', 'ofrecida', 'citada', 'pct_citada', 'ultimo_uso', 'id'], rows: faqU.map(function (x) { return [x.titulo, x.mk, x.ofrecida, x.citada, x.ofrecida ? Math.round((x.citada / x.ofrecida) * 100) : '', x.ult, x._id] }) }, true)\n    + tarjeta(d2, 'wikius', 'Wikis más usadas (v4)', 'fragmentos de wiki que entraron en las fuentes de una respuesta · citada = la respuesta la usó', tabla([['Wiki', function (x) { const u = urlSegura(x.url); return (u ? '<a href=\"' + attr(u) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(x.titulo) + '</a>' : esc(x.titulo)) + '<br><span class=\"mut\">' + esc(TIPOS[(x._id && x._id.c) || ''] || '') + '</span>' }], ['Ofrecida', function (x) { return esc(nf(x.ofrecida)) }], ['Citada', function (x) { return '<b>' + esc(nf(x.citada)) + '</b>' }], ['% citada', function (x) { return esc(pct(x.citada, x.ofrecida, 0)) }], ['Último uso', function (x) { return esc(fecha(x.ult)) }]], wikU, 'tb-u'), { cols: ['wiki', 'tipo', 'ofrecida', 'citada', 'pct_citada', 'ultimo_uso', 'url'], rows: wikU.map(function (x) { return [x.titulo, x._id && x._id.c, x.ofrecida, x.citada, x.ofrecida ? Math.round((x.citada / x.ofrecida) * 100) : '', x.ult, x.url] }) }, true)\n    + tarjeta(d2, 'lagunas', 'Lagunas: consultas sin información (v4)', 'preguntas para las que no había fuente confiable', lagG.length ? '<ul class=\"lag\">' + lagG.map(function (x, i) { return '<li data-key=\"l' + i + '\"><b>' + esc(x.question) + (x.veces > 1 ? ' <span class=\"tag\">×' + x.veces + '</span>' : '') + '</b><span class=\"mut\">' + esc((x.market || '') + ' · ' + (x.operator_name || '') + ' · ' + (x.veces > 1 ? 'última ' : '') + fecha(x.createdAt)) + '</span></li>' }).join('') + '</ul>' : vacio('Ninguna consulta sin información en el período.'), { cols: ['fecha', 'mercado', 'operador', 'pregunta'], rows: lagunas.map(function (x) { return [x.createdAt, x.market, x.operator_name, x.question] }) }, true)\n    + tarjeta(d2, 'nunca', 'Artículos de la base nueva nunca citados', 'candidatos a revisar o retirar', nunca.length ? tabla([['Artículo', function (x) { const u = urlSegura(x.url); return u ? '<a href=\"' + attr(u) + '\" target=\"_blank\" rel=\"noopener noreferrer\">' + esc(x.titulo || x._id) + '</a>' : esc(x.titulo || x._id) }], ['ID', function (x) { return esc(x._id) }]], nunca) : vacio(V.nunca_citadas == null && t1.length ? 'No disponible: falló el cálculo de artículos o citas.' : t1.length ? 'Todos los artículos fueron citados al menos una vez.' : 'Se calcula cuando la base nueva tenga artículos.'), { cols: ['article_id', 'titulo', 'url'], rows: nunca.map(function (x) { return [x._id, x.titulo, x.url] }) })\n    + tarjeta(d2, 'legw', 'Wikis más consultadas en el sistema anterior', 'evento assistant_ask · id del artículo', barrasH(legW.map(function (x) { return { _id: String(x._id), n: x.n } })), { cols: ['article_id', 'consultas'], rows: legW.map(function (x) { return [x._id, x.n] }) })\n    + '</div>'\n}\n\nfunction descargarCsv(d2, id) {\n  const c = (vida(d2).csv || {})[id]\n  if (!c || !c.rows) return\n  const celda = function (v) { let s = String(v == null ? '' : v); if (/^[=+\\-@\\t\\r]/.test(s)) s = \"'\" + s; return /[\",\\n;]/.test(s) ? '\"' + s.replace(/\"/g, '\"\"') + '\"' : s }\n  const txt = [c.cols.join(',')].concat(c.rows.map(function (r) { return r.map(celda).join(',') })).join('\\n')\n  try {\n    const blob = new Blob(['﻿' + txt], { type: 'text/csv;charset=utf-8' })\n    const url = URL.createObjectURL(blob)\n    const a = document.createElement('a')\n    const per = vida(d2).periodo || filtros(d2)\n    a.href = url; a.download = 'nasvi-' + id + '-' + per.desde + '_' + per.hasta + '.csv'\n    document.body.appendChild(a); a.click(); a.remove()\n    setTimeout(function () { URL.revokeObjectURL(url) }, 2000)\n  } catch (e) { poner(d2, { aviso: 'No fue posible generar el CSV.' }) }\n}\n\nexport default {\n  css: '*,*::before,*::after{box-sizing:border-box}'\n    + '.app{--cream:rgb(254,251,244);--surf:#fff;--ink:#162b37;--ink2:rgba(22,43,55,.64);--line:#e3ddd2;--acc:var(--a,#FF6C0E);--s1:#9aa5ad;--s2:#2a78d6;--g1:#c0392b;--g2:#e67e22;--g3:#c9b037;--g4:#7cb342;--g5:#2e7d32;display:flex;flex-direction:column;height:100%;width:100%;background:var(--cream);color:var(--ink);font:14px/1.5 \"Open Sans\",system-ui,-apple-system,\"Segoe UI\",Roboto,sans-serif;overflow:hidden}'\n    + 'button,input,select{font-family:inherit}'\n    + '.hd{flex:none;display:flex;align-items:center;gap:14px;padding:12px 22px;border-bottom:1px solid var(--line);background:var(--surf);flex-wrap:wrap}'\n    + '.brand{display:flex;flex-direction:column;line-height:1.15;flex:none}.brand b{font-size:20px;font-weight:700}.brand span{font-size:12px;color:var(--ink2)}'\n    + '.sp{flex:1 1 auto}'\n    + '.f{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink2);flex:none}'\n    + '.f select,.f input{font:inherit;padding:5px 8px;border:1px solid var(--line);border-radius:7px;background:var(--surf);color:var(--ink)}'\n    + '.btn,.nl{flex:none;border:1px solid var(--line);background:var(--surf);border-radius:8px;padding:6px 13px;font-weight:600;font-size:12px;line-height:1;color:var(--ink);cursor:pointer;text-decoration:none}'\n    + '.btn:hover,.nl:hover{border-color:var(--acc);color:var(--acc)}.btn-p{background:var(--ink);color:#fff;border-color:var(--ink)}.btn-p:hover{color:#fff;opacity:.9}'\n    + '.tabs{flex:none;display:flex;gap:4px;padding:8px 22px 0;background:var(--surf);border-bottom:1px solid var(--line)}'\n    + '.tab{border:0;border-bottom:3px solid transparent;background:transparent;padding:8px 14px;font-weight:600;font-size:13px;line-height:1;color:var(--ink2);cursor:pointer}'\n    + '.tab[aria-selected=\"true\"]{color:var(--ink);border-bottom-color:var(--acc)}'\n    + '.tab:focus-visible,.btn:focus-visible,.nl:focus-visible,.tgl:focus-visible{outline:2px solid var(--acc);outline-offset:2px}'\n    + '.body{flex:1 1 auto;min-height:0;overflow:auto;padding:16px 22px 22px}'\n    + '.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin-bottom:16px}'\n    + '.kpi{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px}'\n    + '.kpi .v{font-size:28px;font-weight:700;color:var(--acc);line-height:1.1}.kpi .l{font-size:12.5px;color:var(--ink);margin-top:4px;font-weight:600}.kpi .n{font-size:11px;color:var(--ink2);margin-top:4px}'\n    + '.mini{display:grid;grid-template-columns:1fr 1fr;gap:10px}.mini .kpi{padding:10px 12px}.mini .kpi .v{font-size:22px}'\n    + '.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:14px}'\n    + '.card{background:var(--surf);border:1px solid var(--line);border-radius:14px;padding:14px 16px;min-width:0}.card.wide{grid-column:1/-1}'\n    + '.cardhd{display:flex;align-items:baseline;gap:8px}.card h3{margin:0 0 2px;font-size:13.5px;font-weight:700}.card .sub{font-size:11px;color:var(--ink2);margin-bottom:10px}'\n    + '.tgl{margin-left:auto;border:1px solid var(--line);background:transparent;color:var(--ink2);font-weight:600;font-size:11px;line-height:1;cursor:pointer;padding:4px 8px;border-radius:6px}.tgl:hover{color:var(--acc);border-color:var(--acc)}'\n    + '.pv{flex:none;background:#fff6e6;border-bottom:1px solid #f0dcb4;color:#6b4e0e;font-size:12px;padding:7px 22px}'\n    + '.err{background:#fff0ef;border:1px solid rgba(179,38,30,.35);color:#8c1d16;border-radius:9px;padding:9px 12px;font-size:13px;margin-bottom:12px}'\n    + '.empty{color:var(--ink2);font-size:12.5px;padding:18px 0;text-align:center}'\n    + '.warn{background:#fff6e6;border:1px solid #f0dcb4;color:#6b4a00;border-radius:10px;padding:10px 14px;margin:0 0 14px;font-size:13px}'\n    + '.load{color:var(--ink2);font-size:13px;padding:30px 0;text-align:center}'\n    + '.bars{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:7px}'\n    + '.bars li{display:grid;grid-template-columns:minmax(0,170px) 1fr auto;align-items:center;gap:10px}'\n    + '.bl{font-size:12px;color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}'\n    + '.bt{background:rgba(22,43,55,.07);border-radius:4px;height:14px;overflow:hidden}.bt i{display:block;height:100%;border-radius:0 4px 4px 0;background:var(--s2)}'\n    + '.bv{font-size:12px;font-weight:700;min-width:46px;text-align:right}'\n    + '.cols{display:flex;align-items:flex-end;gap:3px;height:170px}'\n    + '.col{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;height:100%;gap:5px;min-width:0}'\n    + '.stk{flex:1;width:100%;display:flex;flex-direction:column;justify-content:flex-end}.stk i{display:block;width:100%}.stk i:first-child{border-radius:3px 3px 0 0}'\n    + '.col span{font-size:9.5px;color:var(--ink2);height:12px;white-space:nowrap}'\n    + '.s1{background:var(--s1)}.s2{background:var(--s2)}.g1{background:var(--g1)}.g2{background:var(--g2)}.g3{background:var(--g3)}.g4{background:var(--g4)}.g5{background:var(--g5)}'\n    + '.leg{list-style:none;margin:10px 0 0;padding:0;display:flex;flex-wrap:wrap;gap:14px}.leg li{display:flex;align-items:center;gap:6px;font-size:12px}'\n    + '.dot{width:10px;height:10px;border-radius:3px;display:inline-block;flex:none}'\n    + '.dist{display:grid;grid-template-columns:120px 1fr 50px;gap:10px;align-items:center;margin-bottom:8px}.dl{font-size:12px;color:var(--ink2)}.dv{font-size:12px;font-weight:700;text-align:right}'\n    + '.segbar{display:flex;height:20px;border-radius:5px;overflow:hidden;gap:2px;background:rgba(22,43,55,.05)}.segbar i{display:block;height:100%}'\n    + '.tbw{overflow:auto;max-height:420px}.tb{width:100%;border-collapse:collapse;font-size:12.5px}'\n    + '.tb th{text-align:left;color:var(--ink2);font-weight:600;padding:6px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--surf)}'\n    + '.tb td{padding:6px;border-bottom:1px solid var(--line);vertical-align:top}.tb td:first-child{overflow-wrap:anywhere;min-width:130px}.tb td:not(:first-child),.tb th{white-space:nowrap}'\n    + '.upd{margin:-16px -22px 12px}.stale .kpis,.stale .grid{opacity:.45}'\n    + '.mut{font-size:11px;color:var(--ink2)}'\n    + '.tag{font-size:10.5px;border-radius:5px;padding:1px 6px;background:#f2ede4;color:var(--ink2)}.tag-v4{background:#dde9f5;color:#1e4a70}'\n    + '.cur,.lag{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px;max-height:460px;overflow:auto}'\n    + '.cur>li,.lag>li{border:1px solid var(--line);border-radius:10px;padding:10px 12px;display:flex;flex-direction:column;gap:4px}'\n    + '.ch{display:flex;gap:8px;align-items:flex-start}.nota{flex:none;display:grid;place-items:center;width:22px;height:22px;border-radius:50%;color:#fff;font-weight:700;font-size:12px}.nota.n1{background:var(--g1)}.nota.n2{background:var(--g2)}'\n    + '.com{font-size:12.5px;font-style:italic}.ans{white-space:pre-wrap;font-size:12.5px;color:var(--ink2);margin:6px 0}.fl{margin:4px 0 0;padding-left:16px;font-size:12px}.fl a,.tb a{color:#0b57d0}'\n    + 'details summary{cursor:pointer;font-size:12px;color:var(--acc);font-weight:600}'\n    + '@media (max-width:900px){.hd{padding:10px 14px}.body{padding:12px 14px}.grid{grid-template-columns:1fr}.bars li{grid-template-columns:minmax(0,110px) 1fr auto}.upd{margin:-12px -14px 12px}}'\n    + '@media (max-width:600px){.kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.kpi{padding:10px 12px}.kpi .v{font-size:22px}.f select,.f input{font-size:16px}.tb-u td:nth-child(5),.tb-u th:nth-child(5){display:none}.tb-t td:nth-child(n+5),.tb-t th:nth-child(n+5){display:none}}',\n\n  render(d2) {\n    const p = d2.state.perfil\n    const f = filtros(d2)\n    const sec = d2.state.seccion || 'uso'\n    const datos = d2.state.datos || {}\n    const carg = d2.state.cargando || {}\n    const errs = d2.state.errSec || {}\n    vida(d2).csv = {}\n    let cuerpo = ''\n    if (d2.state.verificando || !p) cuerpo = d2.state.errPerfil ? '<div class=\"err\">' + esc(d2.state.errPerfil) + ' <button class=\"btn reintentar\">Reintentar</button></div>' : '<div class=\"load\">Verificando acceso…</div>'\n    else if (!p.supervisor) cuerpo = '<div class=\"err\">El panel es exclusivo para supervisores. Si necesita acceso, solicítelo al responsable de Agents Tools.</div>'\n    else if (errs[sec]) cuerpo = '<div class=\"err\">' + esc(errs[sec]) + ' <button class=\"btn recargar\">Reintentar</button></div>'\n    else if (carg[sec] && !datos[sec]) cuerpo = '<div class=\"load\">Calculando métricas del período…</div>'\n    else if (datos[sec]) {\n      const errsSec = arr(datos[sec].errores)\n      const esSup = function (x) { return typeof x === 'string' && x.indexOf('supervisores:') === 0 }\n      const supFalla = errsSec.some(esSup)\n      const fallas = errsSec.filter(function (x) { return x != null && x !== '' && !esSup(x) }).length\n      const totalInd = errsSec.length - (sec === 'uso' ? 1 : 0)\n      cuerpo = (carg[sec] ? '<div class=\"pv upd\">Actualizando…</div>' : '')\n        + (fallas ? '<div class=\"warn\">' + fallas + ' de ' + totalInd + ' indicadores de esta sección no se pudieron calcular; los valores afectados aparecen como \"—\" o vacíos. <button class=\"btn recargar\">Reintentar</button></div>' : '')\n        + (supFalla ? '<div class=\"warn\">No se pudo leer la lista de supervisores: los indicadores de operadores pueden incluirlos. <button class=\"btn recargar\">Reintentar</button></div>' : '')\n        + (sec === 'uso' ? secUso(d2, datos.uso) : sec === 'calidad' ? secCalidad(d2, datos.calidad) : secBase(d2, datos.base))\n    }\n    const filtrosHtml = (p && p.supervisor) ? '<div class=\"f\"><span>Mercado</span><select class=\"selMk\" aria-label=\"Mercado\"><option value=\"\">Todos</option>' + MERCADOS.map(function (c) { return '<option value=\"' + c + '\"' + (c === f.mercado ? ' selected' : '') + '>' + c + ' · ' + NOMBRES[c] + '</option>' }).join('') + '</select></div>'\n      + '<div class=\"f\"><span>De</span><input class=\"inDesde\" type=\"date\" value=\"' + attr(f.desde) + '\" aria-label=\"Desde\"/></div>'\n      + '<div class=\"f\"><span>a</span><input class=\"inHasta\" type=\"date\" value=\"' + attr(f.hasta) + '\" aria-label=\"Hasta\"/></div>'\n      + '<button class=\"btn btn-p recargar\">Actualizar</button>' : ''\n    return '<div class=\"app\" data-ready style=\"--a:' + attr(acento(d2)) + '\">'\n      + '<header class=\"hd\"><div class=\"brand\"><b>NASVI</b><span>Panel del supervisor</span></div><div class=\"sp\"></div>' + filtrosHtml\n      + '<a class=\"nl\" href=\"' + attr(d2.param('copilotoUrl', '/') || '/') + '\">Copiloto</a>'\n      + '<a class=\"nl\" href=\"' + attr(d2.param('wikisUrl', '/upload-wikis') || '/upload-wikis') + '\">Wikis</a>'\n      + '</header>'\n      + (isDemo(d2) ? '<div class=\"pv\">Modo demostración: datos ficticios.</div>' : '')\n      + (d2.state.aviso ? '<div class=\"pv\">' + esc(d2.state.aviso) + '</div>' : '')\n      + ((p && p.supervisor) ? '<nav class=\"tabs\" role=\"tablist\" aria-label=\"Secciones\">' + SECCIONES.map(function (s) { return '<button class=\"tab\" role=\"tab\" data-s=\"' + s[0] + '\" aria-selected=\"' + (s[0] === sec ? 'true' : 'false') + '\">' + s[1] + (carg[s[0]] ? ' …' : '') + '</button>' }).join('') + '</nav>' : '')\n      + '<div class=\"body' + (d2.state.viejo ? ' stale' : '') + '\">' + cuerpo + '</div></div>'\n  },\n\n  mounted(d2) {\n    const v = vida(d2)\n    d2.onUnmount(function () { v.activo = false })\n    if (d2.param('debug') === true) { try { window.__nasviPanelApi = function (payload) { return api(d2, payload) }; window.__nasviPanelD2 = d2 } catch (e) { /* sin ventana */ } }\n    d2.setState({ seccion: 'uso', datos: {}, cargando: {}, errSec: {} })\n    iniciar(d2)\n    d2.on('.tab', 'click', function (e, el) { d2.state.seccion = el.dataset.s })\n    d2.on('.tab', 'keydown', function (e, el) {\n      if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return\n      const ids = SECCIONES.map(function (s) { return s[0] })\n      const i = ids.indexOf(el.dataset.s)\n      d2.state.seccion = ids[(i + (e.key === 'ArrowRight' ? 1 : ids.length - 1)) % ids.length]\n    })\n    d2.on('.selMk', 'change', function (e, el) { d2.state.mercado = el.value; cargar(d2) })\n    d2.on('.inDesde', 'change', function (e, el) { d2.state.desde = el.value })\n    d2.on('.inHasta', 'change', function (e, el) { d2.state.hasta = el.value })\n    d2.on('.recargar', 'click', function () { cargar(d2) })\n    d2.on('.reintentar', 'click', function () { iniciar(d2) })\n    d2.on('.csv', 'click', function (e, el) { descargarCsv(d2, el.dataset.c) })\n  }\n}\n"}},"api":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"api"}}}},"auth":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"auth"}}}},"demo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"demo"}}}},"debug":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"debug"}}}},"accent":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"accent"}}}},"copilotoUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"copilotoUrl"}}}},"wikisUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"wikisUrl"}}}}}}}}}},{"_id":"6ad42d452965c84068b5b1f0","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"RS_Secuencia_de_errores_replica_R5","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// R5SecuenciaErrores — réplica (code component) del Html 6ac31912c9effd959f6b4ffc \"Muestra de Data de errores\"\n// (artboard \"Dashboard API ERROR\" 3geIAHZgXan3lXwmf7XMK). Generado por script desde el dump de ComponentInstancesDataSet.\n// NO editar a mano el cuerpo de evdRun: es el <script id=\"evdsrc\"> original con 3 trocas verificadas por sha256.\nconst EVD_MARKUP = \"<div id=\\\"evdroot\\\">\\n  <section class=\\\"sq\\\" aria-label=\\\"Secuencia de errores\\\">\\n    <header class=\\\"sq-hd\\\">\\n      <h3>Secuencia de errores</h3>\\n      <p class=\\\"sq-sum\\\" data-ref=\\\"sum\\\">Cargando…</p>\\n      <div class=\\\"sq-act\\\">\\n        <button type=\\\"button\\\" class=\\\"sq-link\\\" data-ref=\\\"order\\\">Ver más recientes primero</button>\\n      </div>\\n    </header>\\n    <p class=\\\"sq-status\\\" data-ref=\\\"status\\\" role=\\\"status\\\" aria-live=\\\"polite\\\"></p>\\n    <div class=\\\"sq-scroll\\\" data-ref=\\\"list\\\"></div>\\n  </section>\\n  <script id=\\\"evddata\\\" type=\\\"text/plain\\\"></script>\\n</div>\\n\";\nconst EVD_BASE = [{\"_id\":\"demo-err-0001\",\"message_id\":\"demo-msg-0001\",\"session\":\"demo-sess-01\",\"chat_id\":\"demo-chat-01\",\"env\":\"prd\",\"country\":\"AR\",\"time\":\"2026-10-15T14:00:00.400Z\",\"createdAt\":\"2026-10-15T14:00:00.400Z\",\"name\":\"Get Debts\",\"parameters\":{\"consultantId\":\"87654321\"},\"result\":{\"code\":504,\"message\":\"Gateway Timeout\",\"data\":{\"type\":\"INTEGRATION_TIMEOUT\"}},\"error_code\":504,\"e_message\":\"Gateway Timeout\"},{\"_id\":\"demo-err-0002\",\"message_id\":{\"_id\":\"demo-msg-0001\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:00:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"mi código es 87654321\"},\"index\":3,\"session\":\"demo-sess-01\",\"chat_id\":\"demo-chat-01\"},\"session\":\"demo-sess-01\",\"chat_id\":\"demo-chat-01\",\"env\":\"prd\",\"country\":\"AR\",\"time\":\"2026-10-15T14:00:02.400Z\",\"createdAt\":\"2026-10-15T14:00:02.400Z\",\"name\":\"Validate Consultant\",\"parameters\":\"{\\\"consultantId\\\":\\\"87654321\\\",\\\"country\\\":\\\"AR\\\"}\",\"result\":\"{\\\"code\\\":404,\\\"message\\\":\\\"Consultant not found\\\"}\",\"error_code\":404,\"e_message\":\"Consultant not found\",\"modulo\":\"demo\",\"request\":\"GET /demo/consultants\",\"valid_ok\":false},{\"_id\":\"demo-err-0003\",\"message_id\":{\"_id\":\"demo-msg-0001\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:00:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"mi código es 87654321\"}},\"session\":\"demo-sess-01\",\"chat_id\":\"demo-chat-01\",\"env\":\"prd\",\"country\":\"AR\",\"time\":\"2026-10-15T14:00:05.500Z\",\"createdAt\":\"2026-10-15T14:00:05.500Z\",\"name\":\"Get Orders\",\"parameters\":{\"country\":\"AR\"},\"result\":{\"code\":400,\"message\":\"Missing required consultantCode or cycle params\"},\"error_code\":400,\"e_message\":\"\"},{\"_id\":\"demo-err-0004\",\"message_id\":{\"_id\":\"demo-msg-0002\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:05:00.000Z\",\"type\":\"text\",\"text\":\"quiero ver mis pedidos\"},\"session\":\"demo-sess-02\",\"chat_id\":\"demo-chat-02\",\"env\":\"hml\",\"country\":\"EC\",\"time\":\"2026-10-15T14:05:01.200Z\",\"createdAt\":\"2026-10-15T14:05:01.200Z\",\"name\":\"Get Orders\",\"parameters\":{\"orderId\":\"quiero ver mis pedidos\"},\"result\":{\"code\":422,\"message\":\"Invalid orderId format\"},\"error_code\":422,\"e_message\":\"Invalid orderId format\"},{\"_id\":\"demo-err-0005\",\"message_id\":{\"_id\":\"demo-msg-0002\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:05:00.000Z\",\"type\":\"text\",\"text\":\"quiero ver mis pedidos\"},\"session\":\"demo-sess-02\",\"chat_id\":\"demo-chat-02\",\"env\":\"hml\",\"country\":\"EC\",\"time\":\"2026-10-15T14:05:03.000Z\",\"createdAt\":\"2026-10-15T14:05:03.000Z\",\"name\":\"Search Products\",\"parameters\":{\"productId\":\"perfume de regalo\"},\"result\":{\"code\":400,\"message\":\"Bad Request\"},\"error_code\":400,\"e_message\":\"Bad Request\"},{\"_id\":\"demo-err-0006\",\"message_id\":{\"_id\":\"demo-msg-0003\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:10:00.000Z\",\"type\":\"interactive\",\"interactive\":{\"type\":\"button_reply\",\"button_reply\":{\"id\":\"btn_pedidos\",\"title\":\"Mis pedidos\"}}},\"session\":\"demo-sess-03\",\"chat_id\":\"demo-chat-03\",\"env\":\"prd\",\"country\":\"MX\",\"time\":\"2026-10-15T14:10:01.800Z\",\"createdAt\":\"2026-10-15T14:10:01.800Z\",\"name\":\"Get Orders\",\"parameters\":{\"consultantId\":\"12345678&cycle=202614\"},\"result\":{\"code\":500,\"message\":\"Internal Server Error\"},\"error_code\":500,\"e_message\":\"Internal Server Error\"},{\"_id\":\"demo-err-0007\",\"message_id\":{\"_id\":\"demo-msg-0004\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:15:00.000Z\",\"type\":\"interactive\",\"interactive\":{\"type\":\"list_reply\",\"list_reply\":{\"id\":\"opt_3\",\"title\":\"Estado de mi pedido\",\"description\":\"Consulta por número de pedido\"}}},\"session\":\"demo-sess-04\",\"chat_id\":\"demo-chat-04\",\"env\":\"prd\",\"country\":\"CO\",\"time\":\"2026-10-15T14:15:02.000Z\",\"createdAt\":\"2026-10-15T14:15:02.000Z\",\"name\":\"Get Invoice PDF\",\"parameters\":{\"cycle\":\"202614\"},\"result\":{\"code\":404,\"message\":\"Resource not found\"},\"error_code\":404,\"e_message\":\"Resource not found\"},{\"_id\":\"demo-err-0008\",\"message_id\":{\"_id\":\"demo-msg-0005\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:20:00.000Z\",\"type\":\"button\",\"button\":{\"text\":\"Sí, continuar\",\"payload\":\"CONTINUAR\"}},\"session\":\"demo-sess-05\",\"chat_id\":\"demo-chat-05\",\"env\":\"prd\",\"country\":\"PE\",\"time\":\"2026-10-15T14:20:04.000Z\",\"createdAt\":\"2026-10-15T14:20:04.000Z\",\"name\":\"Create Claim\",\"parameters\":\"\\\"{\\\\\\\"claimType\\\\\\\": \\\\\\\"producto\\\\\\\"}\\\"\",\"result\":{\"code\":424,\"message\":\"{\\\"errorCode\\\":\\\"BFF-422\\\",\\\"errorMessage\\\":\\\"Request body is empty\\\"}\"},\"error_code\":424,\"e_message\":\"{\\\"errorCode\\\":\\\"BFF-422\\\",\\\"errorMessage\\\":\\\"Request body is empty\\\"}\"},{\"_id\":\"demo-err-0009\",\"message_id\":{\"_id\":\"demo-msg-0006\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:25:00.000Z\",\"type\":\"image\",\"image\":{\"caption\":\"foto del producto\",\"mime_type\":\"image/jpeg\"}},\"session\":\"demo-sess-06\",\"chat_id\":\"demo-chat-06\",\"env\":\"hml\",\"country\":\"CL\",\"time\":\"2026-10-15T14:25:02.000Z\",\"createdAt\":\"2026-10-15T14:25:02.000Z\",\"name\":\"Upload Evidence\",\"parameters\":{\"fileName\":\"foto.jpg\"},\"result\":{\"code\":401,\"message\":\"Unauthorized\"},\"error_code\":401,\"e_message\":\"Unauthorized\"},{\"_id\":\"demo-err-0010\",\"message_id\":{\"_id\":\"demo-msg-0007\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:30:00.000Z\",\"type\":\"audio\",\"audio\":{\"mime_type\":\"audio/ogg\"}},\"session\":\"demo-sess-07\",\"chat_id\":\"demo-chat-07\",\"env\":\"prd\",\"country\":\"AR\",\"time\":\"2026-10-15T16:31:40.000Z\",\"createdAt\":\"2026-10-15T16:31:40.000Z\",\"name\":\"Transcribe Audio\",\"parameters\":{\"format\":\"ogg\"},\"result\":{\"code\":403,\"message\":\"Forbidden\"},\"error_code\":403,\"e_message\":\"Forbidden\"},{\"_id\":\"demo-err-0011\",\"message_id\":{\"_id\":\"demo-msg-0008\",\"sender\":\"HUMAN\",\"time\":\"2026-10-15T14:40:00.000Z\",\"type\":\"interactive\",\"interactive\":{\"type\":\"nfm_reply\",\"nfm_reply\":{\"name\":\"flow\",\"response_json\":\"{\\\"flow_token\\\":\\\"demo\\\"}\"}}},\"session\":\"demo-sess-08\",\"chat_id\":\"demo-chat-08\",\"env\":\"prd\",\"country\":\"EC\",\"time\":\"2026-10-15T14:39:55.000Z\",\"createdAt\":\"2026-10-15T14:39:55.000Z\",\"name\":\"Send Template\",\"parameters\":{\"template\":\"demo_template\"},\"result\":{\"code\":429,\"message\":\"Too Many Requests\"},\"error_code\":429,\"e_message\":\"Too Many Requests\"},{\"_id\":\"demo-err-0012\",\"message_id\":\"demo-msg-0099\",\"session\":\"demo-sess-09\",\"chat_id\":\"demo-chat-09\",\"env\":\"prd\",\"country\":\"MX\",\"time\":\"2026-10-16T13:00:01.000Z\",\"createdAt\":\"2026-10-16T13:00:01.000Z\",\"name\":\"Get Profile\",\"parameters\":{\"fields\":\"basic\"},\"result\":{\"code\":502,\"message\":\"Bad Gateway\"},\"error_code\":502,\"e_message\":\"Bad Gateway\"},{\"_id\":\"demo-err-0013\",\"message_id\":null,\"session\":\"demo-sess-10\",\"chat_id\":\"demo-chat-10\",\"env\":\"hml\",\"country\":\"CO\",\"time\":\"2026-10-16T13:05:00.000Z\",\"createdAt\":\"2026-10-16T13:05:00.000Z\",\"name\":\"Check Credit\",\"parameters\":{\"amount\":150},\"result\":{\"code\":503,\"message\":\"Service Unavailable\"},\"error_code\":503,\"e_message\":\"Service Unavailable\"},{\"_id\":\"demo-err-0014\",\"message_id\":{\"_id\":\"demo-msg-0011\",\"sender\":\"HUMAN\",\"time\":\"2026-10-16T13:10:00.000Z\",\"type\":\"reaction\"},\"session\":\"demo-sess-11\",\"chat_id\":\"demo-chat-11\",\"env\":\"prd\",\"country\":\"PE\",\"time\":\"2026-10-16T13:10:01.000Z\",\"createdAt\":\"2026-10-16T13:10:01.000Z\",\"name\":\"Get Cycle Info\",\"parameters\":{\"cycle\":\"202615\"},\"result\":{\"code\":507,\"message\":\"Insufficient Storage\"},\"error_code\":507,\"e_message\":\"Insufficient Storage\"},{\"_id\":\"demo-err-0015\",\"message_id\":\"{\\\"_id\\\": \\\"demo-msg-0012\\\", \\\"sender\\\": \\\"HUMAN\\\", \\\"time\\\": \\\"2026-10-16T13:15:00.000Z\\\", \\\"type\\\": \\\"text\\\", \\\"text\\\": {\\\"body\\\": \\\"necesito la factura\\\"}}\",\"session\":\"demo-sess-12\",\"chat_id\":\"demo-chat-12\",\"env\":\"prd\",\"country\":\"AR\",\"time\":\"2026-10-16T13:15:02.000Z\",\"createdAt\":\"2026-10-16T13:15:02.000Z\",\"name\":\"Get Invoice\",\"parameters\":{\"format\":\"pdf\"},\"result\":{\"code\":418,\"message\":\"Unexpected\"},\"error_code\":418,\"e_message\":\"Unexpected\"},{\"_id\":\"demo-err-0016\",\"message_id\":{\"_id\":\"demo-msg-0013\",\"sender\":\"AGENT\",\"time\":\"2026-10-16T13:20:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"te paso con un asesor\"},\"agent_name\":\"Agente demo\"},\"session\":\"demo-sess-13\",\"chat_id\":\"demo-chat-13\",\"env\":\"hml\",\"country\":\"CL\",\"time\":\"2026-10-16T13:20:01.500Z\",\"createdAt\":\"2026-10-16T13:20:01.500Z\",\"name\":\"Transfer Chat\",\"parameters\":{\"queue\":\"demo\"},\"result\":{\"code\":503,\"message\":\"Queue unavailable\"},\"error_code\":\"\",\"e_message\":\"Queue unavailable\"},{\"_id\":\"demo-err-0017\",\"message_id\":{\"_id\":\"demo-msg-0014\",\"sender\":\"HUMAN\",\"time\":\"2026-10-16T13:25:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"hola\"}},\"session\":\"demo-sess-14\",\"chat_id\":\"demo-chat-14\",\"env\":\"prd\",\"country\":\"EC\",\"time\":\"2026-10-16T13:25:00.900Z\",\"createdAt\":\"2026-10-16T13:25:00.900Z\",\"name\":\"Greeting Flow\",\"parameters\":{},\"result\":{\"message\":\"sin detalle\"},\"error_code\":\"\",\"e_message\":\"sin detalle\"},{\"_id\":\"demo-err-0018\",\"message_id\":{\"_id\":\"demo-msg-0015\",\"sender\":\"HUMAN\",\"time\":\"2026-10-16T13:30:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"¿y mi pedido?\"}},\"session\":\"demo-sess-15\",\"chat_id\":\"demo-chat-15\",\"env\":\"prd\",\"country\":\"MX\",\"time\":\"2026-10-16T13:30:09.000Z\",\"createdAt\":\"2026-10-16T13:30:09.000Z\",\"name\":\"Track Shipment\",\"parameters\":{\"carrier\":\"demo\"},\"result\":{\"code\":408,\"message\":\"Request time-out\"},\"error_code\":408,\"e_message\":\"Request time-out\"},{\"_id\":\"demo-err-0019\",\"message_id\":{\"_id\":\"demo-msg-0016\",\"sender\":\"HUMAN\",\"time\":\"2026-10-16T13:35:00.000Z\",\"type\":\"text\",\"text\":{\"body\":\"pedido 00012345\"}},\"session\":\"demo-sess-16\",\"chat_id\":\"demo-chat-16\",\"env\":\"prd\",\"country\":\"CO\",\"time\":\"2026-10-16T13:35:02.100Z\",\"createdAt\":\"2026-10-16T13:35:02.100Z\",\"name\":\"Get Order Detail\",\"parameters\":{\"orderNumber\":\"00012345\"},\"result\":{\"code\":400,\"message\":\"missing orderNumber param\"},\"error_code\":400,\"e_message\":\"missing orderNumber param\"}];\nconst EVD_EXEMPLO = EVD_BASE.concat(Array.from({ length: 42 }, function (_, i) {\n  const n = String(i + 1).padStart(2, '0'), c = [500, 503, 401, 429, 502, 403][i % 6]\n  const t = new Date(Date.UTC(2026, 9, 16, 15, 0, 0) + i * 47000).toISOString()\n  return { _id: 'demo-err-f' + n, message_id: { _id: 'demo-msg-f' + n, type: 'text', text: { body: 'mensaje de prueba ' + n }, sender: 'HUMAN', time: new Date(Date.parse(t) - 1500).toISOString() },\n    session: 'demo-sess-f' + n, chat_id: 'demo-chat-f' + n, env: i % 2 ? 'prd' : 'hml', country: ['AR', 'EC', 'MX', 'CO', 'PE', 'CL'][i % 6],\n    time: t, createdAt: t, name: ['Get Orders', 'Get Debts', 'Check Credit'][i % 3], parameters: { cycle: '2026' + n }, result: { code: c, message: 'Error sintético ' + c }, error_code: c, e_message: 'Error sintético ' + c }\n}));\nconst EVD_INST = new WeakMap();\n\nfunction evdRun(__D2, setTimeout, setInterval, ResizeObserver) {//<<EVD_SRC\n(function(){\n'use strict';\nconst EVD_CSS=\"/* Secuencia de errores · bloque para \\\"Dash Error of Apis\\\" (D2). Ocupa el tamaño que tenga el bloque. */\\n#evdroot{\\n  --ink:#333335; --ink2:#5B5C5F; --dim:#8C8D90; --faint:#B4B5B8;\\n  --line:#E4E4E4; --hair:#EFEFEF; --surf:#FFFFFF;\\n  --naranja:#F4801E; --naranja2:#D9611C;\\n  --e5:#D21E4E; --e4:#D96A0B; --mark:#FFE9C7;\\n  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,\\\"Liberation Mono\\\",monospace;\\n  --sans:Montserrat,\\\"Natura Sans\\\",Poppins,ui-sans-serif,system-ui,\\\"Segoe UI\\\",Roboto,sans-serif;\\n  --ease:cubic-bezier(.2,.7,.3,1);\\n  display:block; width:100%; max-width:100%; box-sizing:border-box;\\n  font:400 12.5px/1.5 var(--sans); color:var(--ink); text-align:left;\\n}\\n#evdroot *{box-sizing:border-box;min-width:0}\\n#evdroot [hidden]{display:none !important}\\n#evdroot h3,#evdroot p,#evdroot dl,#evdroot dd{margin:0}\\n#evdroot button{font-family:var(--sans)}\\n#evdroot :focus-visible{outline:2px solid var(--naranja);outline-offset:2px;border-radius:2px}\\n\\n/* contenedor con el mismo marco que \\\"Volumen de Errores\\\" */\\n#evdroot .sq{display:flex;flex-direction:column;width:100%;background:var(--surf);border:1px solid #DADADA;border-radius:6px;box-shadow:0 1px 3px rgba(0,0,0,.06);overflow:hidden}\\n#evdroot.sq-fixed,#evdroot.sq-fixed .sq{height:100%}\\n#evdroot.sq-fixed .sq-scroll{flex:1 1 auto;overflow:auto;overscroll-behavior:contain}\\n\\n#evdroot .sq-hd{display:flex;align-items:baseline;gap:6px 16px;flex-wrap:wrap;padding:14px 18px 12px;border-bottom:1px solid var(--hair)}\\n#evdroot .sq-hd h3{font-size:15px;font-weight:700;font-style:italic;color:#4A4A4C}\\n#evdroot .sq-sum{font-size:11.5px;color:var(--dim);flex:1 1 220px}\\n#evdroot .sq-sum b{color:var(--ink2);font-weight:600;font-variant-numeric:tabular-nums}\\n#evdroot .sq-act{display:flex;gap:14px}\\n#evdroot .sq-link{background:none;border:0;padding:2px 0;font-size:11.5px;font-weight:600;color:var(--naranja2);cursor:pointer;white-space:nowrap}\\n#evdroot .sq-link:hover{text-decoration:underline;text-underline-offset:3px}\\n#evdroot .sq-link:disabled{color:var(--faint);cursor:default;text-decoration:none}\\n#evdroot .sq-link.ok{color:#2E7D5B}\\n\\n#evdroot .sq-status{margin:12px 18px 0;font-size:12px;color:var(--e5)}\\n#evdroot .sq-status:empty{display:none}\\n#evdroot .sq-empty{padding:28px 18px;color:var(--dim);font-size:12px}\\n\\n/* línea de tiempo: hora | mensaje al margen | llamadas */\\n#evdroot .sq-scroll{padding:4px 0 10px}\\n#evdroot .sq-day{position:sticky;top:0;z-index:2;padding:10px 18px 6px;background:#fff;border-bottom:1px solid var(--hair);margin-bottom:4px;font-size:11px;font-weight:700;color:var(--ink2)}\\n#evdroot .sq-ev{display:grid;grid-template-columns:1fr;padding:0 18px;animation:sq-in .32s var(--ease) both;animation-delay:calc(var(--i,0) * 35ms)}\\n@keyframes sq-in{from{opacity:0;transform:translateY(5px)}to{opacity:1;transform:none}}\\n#evdroot[data-w=\\\"m\\\"] .sq-ev{grid-template-columns:minmax(190px,34%) 1fr;column-gap:0}\\n#evdroot[data-w=\\\"l\\\"] .sq-ev{grid-template-columns:58px minmax(220px,270px) 1fr;column-gap:0}\\n#evdroot .sq-time{display:none;padding-top:13px;padding-right:12px;font-size:11.5px;font-weight:600;color:var(--ink2);font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}\\n#evdroot[data-w=\\\"l\\\"] .sq-time{display:block}\\n\\n#evdroot .sq-msg{padding:10px 16px 12px 0}\\n#evdroot[data-w=\\\"m\\\"] .sq-msg>div,#evdroot[data-w=\\\"l\\\"] .sq-msg>div{position:sticky;top:30px}\\n#evdroot .sq-t2{font-size:11.5px;font-weight:600;color:var(--ink2);font-variant-numeric:tabular-nums;margin-bottom:2px}\\n#evdroot[data-w=\\\"l\\\"] .sq-t2{display:none}\\n#evdroot .sq-who{font-size:10.5px;color:var(--dim)}\\n#evdroot .sq-q{display:block;margin:2px 0 6px;font-size:14px;font-weight:600;line-height:1.35;color:var(--ink);overflow-wrap:anywhere;white-space:pre-wrap}\\n#evdroot .sq-q.none{font-size:12px;font-weight:400;font-style:italic;color:var(--dim)}\\n#evdroot .sq-mdl{display:grid;grid-template-columns:max-content 1fr;gap:1px 10px;font-size:10.5px;color:var(--ink2)}\\n#evdroot .sq-mdl dt{color:var(--dim)}\\n#evdroot .sq-mdl dd{overflow-wrap:anywhere}\\n#evdroot .sq-mdl dd.id{font-family:var(--mono);font-size:10px}\\n#evdroot details.sq-mraw{margin-top:6px}\\n#evdroot details.sq-mraw>summary{display:inline;cursor:pointer;font-size:10.5px;color:var(--dim);list-style:none}\\n#evdroot details.sq-mraw>summary::-webkit-details-marker{display:none}\\n#evdroot details.sq-mraw>summary:hover{color:var(--naranja2)}\\n\\n#evdroot .sq-body{position:relative;padding:2px 0 16px 18px;border-left:1px solid var(--line)}\\n#evdroot[data-w=\\\"m\\\"] .sq-body,#evdroot[data-w=\\\"l\\\"] .sq-body{padding-top:0}\\n#evdroot .sq-ev:last-child .sq-body{border-left-color:transparent;background:linear-gradient(var(--line),var(--line)) 0 0/1px 22px no-repeat}\\n#evdroot .sq-node{position:absolute;left:-4px;top:16px;width:7px;height:7px;border-radius:50%;background:#fff;border:1.5px solid var(--ink2)}\\n#evdroot[data-w=\\\"s\\\"] .sq-node{top:15px}\\n#evdroot .sq-body>.sq-call:first-of-type{margin-top:10px}\\n\\n/* cada llamada que falló */\\n#evdroot .sq-call{position:relative;margin-top:12px;padding-left:14px}\\n#evdroot .sq-call::before{content:\\\"\\\";position:absolute;left:0;top:9px;width:8px;height:1px;background:var(--faint)}\\n#evdroot .sq-call-hd{display:flex;align-items:baseline;gap:4px 10px;flex-wrap:wrap}\\n#evdroot .sq-api{font-size:12.5px;font-weight:700;color:var(--ink)}\\n#evdroot .sq-code{font-size:12.5px;font-weight:700;font-variant-numeric:tabular-nums}\\n#evdroot .sq-code.k5{color:var(--e5)}\\n#evdroot .sq-code.k4{color:var(--e4)}\\n#evdroot .sq-code.kx{color:var(--ink2)}\\n#evdroot .sq-after{font-size:10.5px;color:var(--dim);font-variant-numeric:tabular-nums}\\n#evdroot .sq-copy{margin-left:auto}\\n\\n#evdroot .sq-io{display:grid;grid-template-columns:1fr;gap:10px;margin-top:8px}\\n#evdroot[data-w=\\\"l\\\"] .sq-io{grid-template-columns:1fr 1fr;gap:0}\\n#evdroot[data-w=\\\"l\\\"] .sq-out{border-left:1px solid var(--hair);padding-left:16px}\\n#evdroot[data-w=\\\"l\\\"] .sq-in{padding-right:16px}\\n#evdroot .sq-cap{font-size:10.5px;font-weight:700;color:var(--ink2);margin-bottom:3px}\\n#evdroot .sq-cap span{font-weight:400;color:var(--dim)}\\n#evdroot .sq-dl{display:grid;grid-template-columns:minmax(80px,max-content) 1fr;gap:2px 12px;font-size:11.5px}\\n#evdroot .sq-dl dt{color:var(--dim);overflow-wrap:anywhere}\\n#evdroot .sq-dl dd{font-family:var(--mono);font-size:11px;color:var(--ink);overflow-wrap:anywhere;white-space:pre-wrap}\\n#evdroot .sq-dl dd.txt{font-family:var(--sans);font-size:11.5px;font-weight:600}\\n#evdroot .sq-dl dd.long{max-height:140px;overflow:auto}\\n#evdroot .sq-dl mark{background:var(--mark);color:#8A4500;padding:0 3px;border-radius:2px;font-weight:700}\\n#evdroot .sq-dl dd.miss{font-family:var(--sans);font-style:italic;color:var(--e5)}\\n\\n#evdroot .sq-why{margin-top:8px;font-size:11.5px;color:var(--ink2);max-width:78ch}\\n#evdroot .sq-why strong{color:var(--ink);font-weight:700}\\n\\n#evdroot details.sq-raw{margin-top:6px}\\n#evdroot details.sq-raw>summary{display:inline;cursor:pointer;font-size:10.5px;color:var(--dim);list-style:none}\\n#evdroot details.sq-raw>summary::-webkit-details-marker{display:none}\\n#evdroot details.sq-raw>summary:hover{color:var(--naranja2)}\\n#evdroot .sq-pre{margin:6px 0 0;padding:8px 10px;background:#FAFAFA;border:1px solid var(--hair);border-radius:4px;font:400 11px/1.5 var(--mono);color:var(--ink);white-space:pre-wrap;overflow-wrap:anywhere;max-height:240px;overflow:auto}\\n\\n#evdroot .sq-more{padding:6px 18px 0}\\n\\n#evdroot[data-w=\\\"s\\\"] .sq-more{padding-left:18px}\\n#evdroot .sq-why.gen strong{font-weight:600;color:var(--ink2)}\\n\\n@media (prefers-reduced-motion:reduce){#evdroot *{animation:none !important;transition:none !important}}\\n\";\nconst root=__D2.root;\nif(!root||root.getAttribute('data-ready'))return;\nroot.setAttribute('data-ready','1');\nif(!__D2.host.querySelector('#evdstyle')){const st=document.createElement('style');st.id='evdstyle';st.textContent=EVD_CSS;__D2.host.insertBefore(st,__D2.host.firstChild);}\nconst $=n=>root.querySelector('[data-ref=\"'+n+'\"]');\n/* ---------- utilidades ---------- */\nconst esc=s=>String(s==null?'':s).replace(/[&<>\"']/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\nconst isObj=v=>v&&typeof v==='object'&&!Array.isArray(v);\nconst nf=new Intl.NumberFormat('es-CO');\nconst dtf=new Intl.DateTimeFormat('es-CO',{day:'2-digit',month:'short',year:'numeric',hour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false});\nconst fmtDate=s=>{const d=new Date(s);return isNaN(d)?String(s||''):dtf.format(d).replace(/\\./g,'');};\nconst kOf=c=>{c=+c;return c>=500?'k5':(c>=400?'k4':'kx');};\nconst IC={\n  msg:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 12a8 8 0 0 1-11.6 7.1L4 20l1-4.6A8 8 0 1 1 21 12z\"/></svg>',\n  up:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M5 12h14M13 6l6 6-6 6\"/></svg>',\n  down:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M19 12H5M11 6l-6 6 6 6\"/></svg>',\n  tip:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 11v5M12 8h.01\"/></svg>',\n  copy:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15V6a2 2 0 0 1 2-2h9\"/></svg>'\n};\n\n/* ---------- CSV ---------- */\nfunction parseCSV(text){\n  if(text.charCodeAt(0)===0xFEFF)text=text.slice(1);\n  const first=text.slice(0,text.indexOf('\\n')>-1?text.indexOf('\\n'):text.length);\n  let delim=',',best=-1;\n  [',',';','\\t'].forEach(d=>{let n=0,q=false;for(const ch of first){if(ch==='\"')q=!q;else if(!q&&ch===d)n++;}if(n>best){best=n;delim=d;}});\n  const rows=[];let row=[],cell='',q=false,i=0;const L=text.length;\n  while(i<L){\n    const ch=text[i];\n    if(q){\n      if(ch==='\"'){if(text[i+1]==='\"'){cell+='\"';i+=2;continue;}q=false;i++;continue;}\n      cell+=ch;i++;continue;\n    }\n    if(ch==='\"'){q=true;i++;continue;}\n    if(ch===delim){row.push(cell);cell='';i++;continue;}\n    if(ch==='\\r'){i++;continue;}\n    if(ch==='\\n'){row.push(cell);rows.push(row);row=[];cell='';i++;continue;}\n    cell+=ch;i++;\n  }\n  if(cell!==''||row.length){row.push(cell);rows.push(row);}\n  return rows.filter(r=>r.some(c=>c!==''));\n}\nfunction maybeJSON(v){\n  if(typeof v!=='string')return v;\n  const t=v.trim();\n  if((t[0]==='{'&&t[t.length-1]==='}')||(t[0]==='['&&t[t.length-1]===']')){try{return JSON.parse(t);}catch(e){}}\n  return v;\n}\nfunction deepParse(v,depth){\n  depth=depth||0;if(depth>4)return v;\n  if(typeof v==='string'){const p=maybeJSON(v);return p===v?v:deepParse(p,depth+1);}\n  if(Array.isArray(v))return v.map(x=>deepParse(x,depth+1));\n  if(isObj(v)){const o={};for(const k in v)o[k]=deepParse(v[k],depth+1);return o;}\n  return v;\n}\nfunction setPath(o,parts,val){\n  let cur=o;\n  for(let i=0;i<parts.length-1;i++){\n    const k=parts[i];\n    if(!isObj(cur[k]))cur[k]=(cur[k]==null||cur[k]==='')?{}:{_valor:cur[k]};\n    cur=cur[k];\n  }\n  const last=parts[parts.length-1];\n  if(isObj(cur[last])&&isObj(val))Object.assign(cur[last],val);\n  else if(isObj(cur[last])&&!isObj(val))cur[last]._valor=val;\n  else cur[last]=val;\n}\nfunction mergeDeep(a,b){\n  if(!isObj(a))return b;if(!isObj(b))return a;\n  const o=Object.assign({},a);\n  for(const k in b)o[k]=(isObj(o[k])&&isObj(b[k]))?mergeDeep(o[k],b[k]):(o[k]==null||o[k]===''?b[k]:o[k]);\n  return o;\n}\n\n/* ---------- normalización ---------- */\nfunction msgText(m){\n  if(!isObj(m))return null;\n  const pick=(...xs)=>{for(const x of xs)if(x!=null&&x!=='')return x;return null;};\n  const t=String(m.type||'').toLowerCase();\n  const txt=isObj(m.text)?m.text.body:(typeof m.text==='string'?m.text:null);\n  const it=isObj(m.interactive)?m.interactive:{};\n  const br=pick(m.button_reply&&m.button_reply.title,it.button_reply&&it.button_reply.title);\n  const lr=pick(m.list_reply&&m.list_reply.title,it.list_reply&&it.list_reply.title);\n  const media={audio:'Audio',image:'Imagen',video:'Video',document:'Documento',sticker:'Sticker'};\n  if(t==='text'||txt)return {text:pick(txt,''),kind:'texto'};\n  if(br)return {text:br,kind:'botón'};\n  if(lr)return {text:lr,kind:'opción de lista'};\n  if(isObj(m.button)&&m.button.text)return {text:m.button.text,kind:'botón'};\n  if(media[t]||Object.keys(media).some(k=>m[k])){const k=media[t]?t:Object.keys(media).find(k=>m[k]);const cap=isObj(m[k])&&m[k].caption;return {text:'['+media[k]+']'+(cap?' '+cap:''),kind:media[k].toLowerCase()};}\n  if(isObj(m.interactive)){return {text:JSON.stringify(m.interactive),kind:'interactivo'};}\n  return null;\n}\nfunction normalize(rows){\n  const head=rows[0].map(h=>h.trim());\n  const objs=[];\n  for(let r=1;r<rows.length;r++){\n    const o={};\n    head.forEach((h,i)=>{const v=rows[r][i];if(v==null||v==='')return;setPath(o,h.split('.'),maybeJSON(v));});\n    objs.push(o);\n  }\n  return toRecs(objs);\n}\nfunction toRecs(objs){\n  const recs=[];\n  for(let r=0;r<objs.length;r++){\n    const o=isObj(objs[r])?objs[r]:{};\n    let params=deepParse(o.parameters);\n    let result=deepParse(o.result);\n    let msg=o.message_id!=null?o.message_id:o.message;if(isObj(msg))msg=Object.assign({},msg);\n    if(typeof msg==='string'||typeof msg==='number')msg={_id:String(msg),_soloId:true};\n    if(isObj(msg)){if(msg._valor){msg._id=msg._id||msg._valor;delete msg._valor;}msg=deepParse(msg);if(!msg._soloId&&!msgText(msg)&&Object.keys(msg).every(k=>k==='_id'))msg._soloId=true;}\n    const rd=isObj(result)&&isObj(result.data)?result.data:{};\n    let code=o.error_code!=null&&o.error_code!==''?o.error_code:(isObj(result)?result.code:'');\n    const em=o.e_message!=null&&o.e_message!==''?o.e_message:(rd.message||rd.error||(isObj(result)?result.message:'')||'');\n    recs.push({\n      id:o._id||('fila '+(r+1)),row:r+1,\n      session:o.session||(isObj(msg)?msg.session:'')||'',\n      chat:o.chat_id||(isObj(msg)?msg.chat_id:'')||'',\n      env:o.env||'',country:o.country||'',\n      time:o.time||o.createdAt||'',\n      name:o.name||'(sin nombre)',\n      params:params==null?{}:params,result:result==null?{}:result,\n      code:String(code==null?'':code),emsg:(()=>{const p=deepParse(em);if(typeof p==='string')return p;if(isObj(p)&&(p.errorMessage||p.message))return (p.errorCode?p.errorCode+': ':'')+(p.errorMessage||p.message);return JSON.stringify(p);})(),\n      msg:isObj(msg)?msg:null\n    });\n  }\n  return recs;\n}\nfunction groupRecs(recs){\n  const map=new Map();\n  recs.forEach(r=>{\n    const m=r.msg;const mid=m&&(m._id||m.id);\n    const key=mid?'m:'+mid:'e:'+r.id+':'+r.row;\n    if(!map.has(key))map.set(key,{key,msg:null,calls:[]});\n    const g=map.get(key);g.calls.push(r);\n    if(m&&(!g.msg||Object.keys(m).length>Object.keys(g.msg).length))g.msg=g.msg?mergeDeep(m,g.msg):m;\n  });\n  const out=[...map.values()];\n  out.forEach(g=>{\n    g.calls.sort((a,b)=>String(a.time).localeCompare(String(b.time)));\n    const f=g.calls[0];\n    g.session=f.session||(g.msg&&g.msg.session)||'';g.chat=f.chat||(g.msg&&g.msg.chat_id)||'';\n    g.country=f.country;g.env=f.env;\n    g.mt=g.msg?msgText(g.msg):null;\n    g.time=(g.msg&&g.msg.time)||f.time;\n  });\n  out.sort((a,b)=>String(b.time).localeCompare(String(a.time)));\n  return out;\n}\n\n/* ---------- causas ----------\n   CAUSAS: reglas del equipo para errores que ya conocemos. Se revisan antes que las automáticas.\n   Cada regla: api (texto o regex del nombre), codigo, texto (regex sobre el mensaje de error y los parámetros) y causa.\n   Ejemplo: {api:'Get Debts',codigo:504,texto:'',causa:'El servicio de deudas de MX se cae en el cierre de ciclo; avisar a Cobranzas.'} */\nconst CAUSAS=[];\nconst GENERICO={\n  400:'la API rechazó la petición porque un dato llegó mal o incompleto. Revisa los valores de la Entrada.',\n  401:'la llamada no llevó credenciales válidas (token vencido o mal configurado). No depende del usuario.',\n  403:'la API reconoció la llamada pero no le da permiso. Revisar el acceso configurado para ese ambiente o país.',\n  404:'la API no encontró lo que se pidió con esos parámetros.',\n  405:'se llamó la ruta con un método que no acepta (por ejemplo GET en vez de POST).',\n  409:'la petición choca con el estado actual del dato (por ejemplo, ya existe o cambió).',\n  415:'la API no entendió el formato del cuerpo enviado.',\n  422:'la API entendió la petición pero un valor no cumple el formato que espera.',\n  424:'la API que llamamos falló porque otra API de la que depende respondió con error.',\n  429:'se hicieron demasiadas llamadas seguidas y la API empezó a limitar. Revisar reintentos o volumen.',\n  500:'falla interna del servicio. Si pasa con varios usuarios distintos, es del lado de la API y no del flujo.',\n  502:'la puerta de enlace no recibió una respuesta válida del servicio.',\n  503:'el servicio no estaba disponible (caído o en mantenimiento).',\n  504:'el servicio tardó demasiado y no respondió a tiempo.'\n};\n/* ---------- pistas automáticas ---------- */\nfunction flatParams(p){const out={};(function w(o,pre){if(!isObj(o))return;for(const k in o){const v=o[k];if(isObj(v)&&Object.keys(v).length&&pre.split('.').length<2&&!/message|body/i.test(k))w(v,pre+k+'.');else out[pre+k]=v;}})(p,'');return out;}\nfunction analyze(c,g){\n  const tips=[],warn={},miss=[];\n  const p=isObj(c.params)?c.params:{};\n  const r=isObj(c.result)?c.result:{};\n  const d=isObj(r.data)?r.data:(isObj(maybeJSON(r.data))?maybeJSON(r.data):{});\n  const code=+c.code||+r.code||0;\n  const all=[c.emsg,r.message,d.message,d.error,d.errorMessage,d.description].filter(x=>typeof x==='string').join(' | ');\n  const userTxt=g.mt&&g.mt.text?String(g.mt.text).trim():'';\n  // parámetros faltantes\n  const mm=all.match(/missing\\s+(?:required\\s+)?([\\w\\s,]+?)\\s+params?/i);\n  if(mm){\n    const keys=mm[1].split(/\\s*(?:,|\\bor\\b|\\band\\b|\\by\\b|\\bo\\b)\\s*/i).map(s=>s.trim()).filter(Boolean);\n    const lack=keys.filter(k=>p[k]==null||p[k]==='');\n    if(lack.length){lack.forEach(k=>{miss.push(k);});tips.push('Faltó enviar <b>'+lack.map(esc).join('</b> o <b>')+'</b> en los parámetros. La API los pide y la llamada salió sin ellos.');}\n    else tips.push('La API dice que faltan parámetros, pero <b>'+keys.map(esc).join(', ')+'</b> sí se enviaron. Revisar el formato del valor.');\n  }\n  // valores con texto pegado\n  for(const k in p){\n    const v=p[k];if(typeof v!=='string')continue;\n    if(!/id$/i.test(k))continue;\n    if(/[&?=]/.test(v)){warn[k]=1;tips.push('El valor de <b>'+esc(k)+'</b> trae texto extra (“'+esc(v)+'”). Parece que otro parámetro quedó pegado al mismo valor.');}\n    else if(/[a-záéíóúñ]{3,}/i.test(v)&&/\\s/.test(v.trim())){warn[k]=1;\n      const same=userTxt&&userTxt.toLowerCase()===v.trim().toLowerCase();\n      tips.push(same?'Se envió como <b>'+esc(k)+'</b> el texto que escribió el usuario (“'+esc(v)+'”) en lugar de un número. El flujo no validó la respuesta antes de llamar a la API.':'El valor de <b>'+esc(k)+'</b> es texto (“'+esc(v)+'”) y no un identificador.');}\n  }\n  // no encontrado\n  if(code===404||/not\\s*found/i.test(all)){\n    const k=Object.keys(p).find(k=>/id$/i.test(k)&&p[k]!=null&&all.toLowerCase().indexOf(k.toLowerCase())>-1)||Object.keys(p).find(k=>/id$/i.test(k));\n    if(k){warn[k]=1;\n      const same=userTxt&&String(p[k]).replace(/\\D/g,'')===userTxt.replace(/\\D/g,'')&&userTxt.replace(/\\D/g,'').length>3;\n      tips.push('La API no encontró el <b>'+esc(k)+'</b> “'+esc(p[k])+'”.'+(same?' Es exactamente lo que escribió el usuario: revisar si lo digitó bien o si no está registrado en ese país.':''));}\n    else tips.push('La API no encontró el recurso que se pidió con estos parámetros.');\n  }\n  // timeout\n  const tout=code===504||code===408||/time[\\s-]?out|INTEGRATION_TIMEOUT/i.test(all+' '+(d.type||''));\n  if(tout)tips.push('El servicio tardó demasiado y no respondió a tiempo. No depende de lo que escribió el usuario: si se repite, hay que reportarlo al equipo dueño de la API.');\n  else if(code>=500&&Object.keys(warn).length)tips.push('La API respondió '+code+', pero la causa más probable es el valor enviado en <b>'+Object.keys(warn).map(esc).join(', ')+'</b>, no una caída del servicio.');\n  // error de una API de destino\n  const inner=[r.message,r.data].map(maybeJSON).find(x=>isObj(x)&&(x.errorMessage||x.errorCode));\n  if(inner)tips.push('La API de destino respondió '+esc(inner.errorCode||'')+': “'+esc(inner.errorMessage||'')+'”.'+(/body/i.test(inner.errorMessage||'')?' El cuerpo de la petición llegó vacío o incompleto.':''));\n  // reglas propias del equipo (van primero)\n  const own=[];\n  CAUSAS.forEach(rg=>{\n    try{\n      if(rg.api&&!new RegExp(rg.api,'i').test(c.name||''))return;\n      if(rg.codigo&&String(rg.codigo)!==String(code))return;\n      if(rg.texto&&!new RegExp(rg.texto,'i').test(all+' '+JSON.stringify(p)))return;\n      own.push(esc(rg.causa));\n    }catch(e){}\n  });\n  // si nada encaja: solo lo que suele significar el código, dicho como tal\n  const gen=(!tips.length&&!own.length&&GENERICO[code])?GENERICO[code]:(!tips.length&&!own.length&&code>=500?GENERICO[500]:(!tips.length&&!own.length&&code>=400?GENERICO[400]:''));\n  return {tips:own.concat(tips),gen,code,warn,miss};\n}\n\n/* ---------- copiar para desarrollo ---------- */\nfunction callText(g,c){\n  const L=[];\n  L.push('Error en '+c.name+' ('+(c.code||'sin código')+(c.emsg?': '+c.emsg:'')+')');\n  L.push('Fecha: '+fmtDate(c.time)+' (UTC '+c.time+')');\n  L.push('País / ambiente: '+(c.country||'-')+' / '+(c.env||'-'));\n  if(c.chat)L.push('Chat ID: '+c.chat);\n  if(c.session)L.push('Sesión: '+c.session);\n  if(g.mt&&g.mt.text!=='')L.push('Mensaje que lo disparó ('+(g.msg.sender||'')+', '+g.mt.kind+'): \"'+g.mt.text+'\"'+(g.msg.time?' a las '+fmtDate(g.msg.time):''));\n  else if(g.msg&&g.msg._id)L.push('ID del mensaje: '+g.msg._id);\n  L.push('Parámetros enviados:');L.push(valStr(c.params)||'(vacío)');\n  L.push('Respuesta de la API:');L.push(valStr(c.result)||'(vacío)');\n  const a=analyze(c,g);if(!a.tips.length&&a.gen)L.push('Qué suele significar un '+a.code+': '+a.gen);if(a.tips.length)L.push('Causa probable: '+a.tips.map(t=>t.replace(/<[^>]+>/g,'').replace(/&(amp|lt|gt|quot|#39);/g,(m,x)=>({amp:'&',lt:'<',gt:'>',quot:'\"','#39':\"'\"}[x]))).join(' '));\n  L.push('ID del error: '+c.id);\n  return L.join('\\n');\n}\nfunction groupText(g,calls){return calls.map(c=>callText(g,c)).join('\\n\\n');}\nfunction copyText(txt,btn){\n  const done=()=>{if(!btn)return;const old=btn.innerHTML;btn.classList.add('ok');btn.textContent='Copiado';setTimeout(()=>{btn.classList.remove('ok');btn.innerHTML=old;},1200);};\n  const fallback=()=>{const ta=document.createElement('textarea');ta.value=txt;ta.setAttribute('readonly','');ta.style.cssText='position:absolute;left:-9999px;top:0';root.appendChild(ta);ta.select();let ok=false;try{ok=document.execCommand('copy');}catch(e){}root.removeChild(ta);ok?done():status('El navegador no dejó copiar. Abre \"Ver JSON completo\" y copia a mano.');};\n  try{if(navigator.clipboard&&window.isSecureContext){navigator.clipboard.writeText(txt).then(done,fallback);return;}}catch(e){}\n  fallback();\n}\n\n/* Extrae los objetos {…} de primer nivel de un texto, aunque vengan pegados o separados por comas o saltos de línea */\nfunction splitObjects(t){\n  const out=[];let depth=0,start=-1,inStr=false,escp=false;\n  for(let i=0;i<t.length;i++){\n    const ch=t[i];\n    if(inStr){if(escp)escp=false;else if(ch==='\\\\')escp=true;else if(ch==='\"')inStr=false;continue;}\n    if(ch==='\"'){inStr=true;continue;}\n    if(ch==='{'){if(depth===0)start=i;depth++;}\n    else if(ch==='}'){depth--;if(depth===0&&start>-1){try{out.push(JSON.parse(t.slice(start,i+1)));}catch(e){}start=-1;}if(depth<0)depth=0;}\n  }\n  return out;\n}\n/* Datos como JSON: arreglo de errores, objeto con un arreglo dentro, texto doblemente serializado o una línea por error */\nfunction parseJSONData(txt){\n  const t=String(txt||'').trim();\n  if(!t)return [];\n  if(/^\\[object /i.test(t))throw new Error('D2 envió el objeto sin convertirlo a texto (\"[object Object]\"). En el StringConcat, envuelve los datos en un JSON stringify antes de concatenarlos.');\n  let v;\n  try{v=JSON.parse(t);}catch(e){\n    /* D2 a veces concatena los objetos de la lista sin corchetes: {..},{..} */\n    try{v=JSON.parse('['+t+']');}catch(e2){\n      v=splitObjects(t);\n      if(!v.length)throw new Error('Los datos no son un JSON válido. Empiezan así: '+t.slice(0,90)+(t.length>90?'…':''));\n    }\n  }\n  for(let k=0;k<2&&typeof v==='string';k++){try{v=JSON.parse(v);}catch(e){break;}}\n  if(isObj(v)){const key=['data','records','items','rows','errors','result','value'].find(k=>Array.isArray(v[k]));v=key?v[key]:[v];}\n  if(!Array.isArray(v))throw new Error('Esperaba una lista de errores y llegó otra cosa: '+t.slice(0,90));\n  return v.map(x=>typeof x==='string'?maybeJSON(x):x).filter(isObj);\n}\n/* ---------- secuencia ---------- */\nconst PAGE=40;\nlet DATA=[],GROUPS=[],shown=0,ASC=true;\nconst tf=new Intl.DateTimeFormat('es-CO',{hour:'2-digit',minute:'2-digit',second:'2-digit',hour12:false});\nconst df=new Intl.DateTimeFormat('es-CO',{weekday:'long',day:'numeric',month:'long'});\nconst dayKey=s=>{const d=new Date(s);return isNaN(d)?'':d.getFullYear()+'-'+d.getMonth()+'-'+d.getDate();};\nconst hhmmss=s=>{const d=new Date(s);return isNaN(d)?'':tf.format(d);};\nconst dayTxt=s=>{const d=new Date(s);if(isNaN(d))return 'Sin fecha';const t=df.format(d);return t.charAt(0).toUpperCase()+t.slice(1);};\nfunction valStr(v){if(v==null)return '';if(typeof v==='object')return JSON.stringify(v,null,2);return String(v);}\n\nfunction dl(rows){\n  if(!rows.length)return '<dl class=\"sq-dl\"><dt>—</dt><dd class=\"miss\">sin datos</dd></dl>';\n  return '<dl class=\"sq-dl\">'+rows.map(r=>{\n    const v=valStr(r.v);const long=v.indexOf('\\n')>-1;\n    const cls=[r.cls||'',long?'long':''].join(' ').trim();\n    return '<dt>'+esc(r.k)+'</dt><dd'+(cls?' class=\"'+cls+'\"':'')+'>'+(r.mark?'<mark>'+esc(v)+'</mark>':esc(v))+'</dd>';\n  }).join('')+'</dl>';\n}\nfunction inRows(c,a){\n  const p=c.params;\n  if(!isObj(p))return p==null||p===''?[]:[{k:'valor',v:p}];\n  const f=flatParams(p);\n  const rows=Object.keys(f).map(k=>({k,v:f[k],mark:!!a.warn[k]}));\n  a.miss.forEach(k=>rows.push({k,v:'no se envió',cls:'miss'}));\n  return rows;\n}\nfunction outRows(c){\n  const r=isObj(c.result)?c.result:{};const rows=[];const seen=new Set();\n  const head=[r.code!=null?r.code:c.code,typeof r.message==='string'?r.message:''].filter(x=>x!==''&&x!=null).join(' · ');\n  if(head)rows.push({k:'estado',v:head,cls:'txt'});\n  const add=(o,pre)=>{if(!isObj(o))return;const key=JSON.stringify(o);if(seen.has(key))return;seen.add(key);for(const k in o){const v=o[k];rows.push({k:pre+k,v,cls:typeof v==='string'&&/message|error/i.test(k)?'txt':''});}};\n  if(isObj(r.message))add(r.message,'');\n  if(isObj(r.data))add(r.data,'');else if(r.data!=null&&r.data!==''&&typeof r.data!=='object')rows.push({k:'data',v:r.data});\n  for(const k in r)if(!['code','message','data','isData2Error'].includes(k))rows.push({k,v:r[k]});\n  if(rows.length<2&&c.emsg&&!rows.some(x=>x.v===c.emsg))rows.push({k:'mensaje',v:c.emsg,cls:'txt'});\n  return rows;\n}\nfunction after(g,c){\n  const a=Date.parse(g.msg&&g.msg.time),b=Date.parse(c.time);\n  if(isNaN(a)||isNaN(b))return '';\n  const s=(b-a)/1000;if(s<0||s>3600)return '';\n  return (s<1?'menos de 1&nbsp;s':nf.format(Math.round(s*10)/10)+'&nbsp;s')+' después';\n}\nfunction callHTML(g,c,ci){\n  const a=analyze(c,g);const k=kOf(c.code);\n  const resLabel=isObj(c.result)&&typeof c.result.message==='string'?'':'';\n  return '<div class=\"sq-call\">'+\n    '<div class=\"sq-call-hd\"><span class=\"sq-api\">'+esc(c.name)+'</span><span class=\"sq-code '+k+'\">'+esc(c.code||'s/c')+'</span><span class=\"sq-after\" title=\"'+esc(c.time)+'\">'+after(g,c)+'</span>'+\n    '<button type=\"button\" class=\"sq-link sq-copy\" data-copy=\"'+esc(g.key)+'\" data-ci=\"'+ci+'\">Copiar</button></div>'+\n    '<div class=\"sq-io\">'+\n      '<div class=\"sq-in\"><div class=\"sq-cap\">Entrada <span>lo que se le envió a la API</span></div>'+dl(inRows(c,a))+'</div>'+\n      '<div class=\"sq-out\"><div class=\"sq-cap\">Salida <span>lo que respondió</span></div>'+dl(outRows(c))+resLabel+'</div>'+\n    '</div>'+\n    (a.tips.length?'<p class=\"sq-why\"><strong>Causa probable:</strong> '+a.tips.join(' ')+'</p>':(a.gen?'<p class=\"sq-why gen\"><strong>Qué suele significar un '+esc(a.code)+':</strong> '+esc(a.gen)+'</p>':''))+\n    '<details class=\"sq-raw\"><summary>Ver JSON completo</summary><pre class=\"sq-pre\">'+esc('parameters: '+valStr(c.params)+'\\n\\nresult: '+valStr(c.result)+'\\n\\nerror _id: '+c.id+'\\nsession: '+c.session+'\\nchat_id: '+c.chat)+'</pre></details>'+\n  '</div>';\n}\nfunction msgRows(g){\n  const m=g.msg,mt=g.mt,rows=[];\n  if(!m)return rows;\n  const it=isObj(m.interactive)?m.interactive:{};\n  const opt=[m.list_reply,it.list_reply,m.button_reply,it.button_reply].find(isObj);\n  rows.push({k:'tipo',v:mt&&mt.kind?mt.kind:(m.type||'')});\n  if(opt){if(opt.id!=null)rows.push({k:'id de opción',v:opt.id,id:1});if(opt.description)rows.push({k:'descripción',v:opt.description});if(opt.payload)rows.push({k:'payload',v:opt.payload,id:1});}\n  if(isObj(m.button)&&m.button.payload)rows.push({k:'payload',v:m.button.payload,id:1});\n  ['image','audio','video','document','sticker'].forEach(k=>{if(isObj(m[k])){if(m[k].caption)rows.push({k:'texto',v:m[k].caption});if(m[k].mime_type)rows.push({k:'formato',v:m[k].mime_type});}});\n  if(m.sender)rows.push({k:'enviado por',v:m.sender==='HUMAN'?'Usuario':m.sender});\n  if(m.agent_name)rows.push({k:'agente',v:m.agent_name});\n  if(m.index!=null&&m.index!=='')rows.push({k:'n.º en el chat',v:m.index});\n  rows.push({k:'país',v:(g.country||'')+(g.env?' · '+g.env:'')});\n  if(m._id)rows.push({k:'id mensaje',v:m._id,id:1});\n  if(g.chat)rows.push({k:'chat',v:g.chat,id:1});\n  if(g.session)rows.push({k:'sesión',v:g.session,id:1});\n  return rows.filter(r=>r.v!==''&&r.v!=null);\n}\nfunction evHTML(g,i){\n  const mt=g.mt;let said;\n  if(mt&&mt.text!=='')said='<span class=\"sq-q\">“'+esc(mt.text)+'”</span>';\n  else if(g.msg&&g.msg._soloId)said='<span class=\"sq-q none\">Solo llegó el ID del mensaje</span>';\n  else if(g.msg)said='<span class=\"sq-q none\">Mensaje sin texto ('+esc(g.msg.type||'tipo desconocido')+')</span>';\n  else said='<span class=\"sq-q none\">El registro no trae el mensaje que lo disparó</span>';\n  const who=g.msg?((g.msg.sender==='HUMAN'||!g.msg.sender?'El usuario':esc(g.msg.sender))+(mt&&mt.kind==='texto'?' escribió':(mt?' eligió':' envió'))):'Mensaje que lo disparó';\n  const rows=g.msg?msgRows(g):[{k:'país',v:(g.country||'')+(g.env?' · '+g.env:'')},{k:'chat',v:g.chat,id:1},{k:'sesión',v:g.session,id:1}].filter(r=>r.v);\n  let raw='';\n  if(g.msg&&!g.msg._soloId){const m=Object.assign({},g.msg);['createdAt','updatedAt','__v','_soloId'].forEach(k=>delete m[k]);raw='<details class=\"sq-mraw\"><summary>Ver mensaje completo</summary><pre class=\"sq-pre\">'+esc(JSON.stringify(m,null,2))+'</pre></details>';}\n  return '<div class=\"sq-ev\" style=\"--i:'+(i%PAGE)+'\">'+\n    '<div class=\"sq-time\" title=\"'+esc(g.time)+'\">'+esc(hhmmss(g.time))+'</div>'+\n    '<aside class=\"sq-msg\"><div>'+\n      '<div class=\"sq-t2\">'+esc(hhmmss(g.time))+'</div>'+\n      '<span class=\"sq-who\">'+who+'</span>'+said+\n      '<dl class=\"sq-mdl\">'+rows.map(r=>'<dt>'+esc(r.k)+'</dt><dd'+(r.id?' class=\"id\"':'')+'>'+esc(r.v)+'</dd>').join('')+'</dl>'+raw+\n    '</div></aside>'+\n    '<div class=\"sq-body\"><span class=\"sq-node\" aria-hidden=\"true\"></span>'+\n      g.calls.map((c,ci)=>callHTML(g,c,ci)).join('')+\n    '</div></div>';\n}\nfunction ordered(){return ASC?GROUPS.slice().reverse():GROUPS;}\nfunction render(){\n  shown=0;$('list').innerHTML='';\n  if(!DATA.length){$('list').innerHTML='<p class=\"sq-empty\">No hay errores con los filtros del tablero.</p>';return;}\n  more();\n}\nfunction more(){\n  const list=$('list');const old=list.querySelector('.sq-more');if(old)old.remove();\n  const arr=ordered();const next=arr.slice(shown,shown+PAGE);\n  let h='';let prevDay=shown?dayKey(arr[shown-1].time):null;\n  next.forEach((g,i)=>{const dk=dayKey(g.time);if(dk!==prevDay){h+='<div class=\"sq-day\">'+esc(dayTxt(g.time))+'</div>';prevDay=dk;}h+=evHTML(g,i);});\n  list.insertAdjacentHTML('beforeend',h);\n  shown+=next.length;\n  const rest=arr.length-shown;\n  if(rest>0)list.insertAdjacentHTML('beforeend','<div class=\"sq-more\"><button type=\"button\" class=\"sq-link\" data-ref=\"more\">Mostrar '+Math.min(rest,PAGE)+' más de '+nf.format(rest)+' que faltan</button></div>');\n}\nfunction summary(){\n  const n=DATA.length,m=GROUPS.length;\n  const ts=DATA.map(r=>Date.parse(r.time)).filter(x=>!isNaN(x));\n  let rng='';\n  if(ts.length){const a=new Date(Math.min(...ts)).toISOString(),b=new Date(Math.max(...ts)).toISOString();rng=dayKey(a)===dayKey(b)?', entre las '+hhmmss(a)+' y las '+hhmmss(b):', del '+fmtDate(a)+' al '+fmtDate(b);}\n  $('sum').innerHTML='<b>'+nf.format(n)+'</b> '+(n===1?'error':'errores')+' disparados por <b>'+nf.format(m)+'</b> '+(m===1?'mensaje':'mensajes')+rng;\n  $('order').hidden=m<2;\n  $('order').textContent=ASC?'Ver más recientes primero':'Ver en orden de llegada';\n}\nfunction status(msg){$('status').textContent=msg||'';}\n\n/* ---------- eventos ---------- */\nroot.addEventListener('click',e=>{\n  const t=e.target.closest('button');if(!t||!root.contains(t))return;\n  const ref=t.dataset.ref;\n  if(ref==='more'){more();return;}\n  if(ref==='order'){ASC=!ASC;summary();render();return;}\n  if(t.dataset.copy!=null){\n    const g=GROUPS.find(g=>g.key===t.dataset.copy);if(!g)return;\n    copyText(t.dataset.ci!=null?callText(g,g.calls[+t.dataset.ci]):groupText(g,g.calls),t);\n  }\n});\n\n/* ---------- datos que entrega D2 en el StringConcat ---------- */\n(function(){\n  const box=root.querySelector('#evddata');\n  let arr=[];\n  try{arr=parseJSONData(box?box.textContent:'');}catch(e){status(e.message);$('sum').textContent='No se pudieron leer los datos.';$('order').hidden=true;return;}\n  DATA=toRecs(arr);GROUPS=groupRecs(DATA);\n  summary();render();\n})();\n\n/* ---------- tamaño: ocupa el bloque que le des en D2 y hace scroll por dentro ---------- */\n(function(){\n  let host=root.parentElement;\n  while(host&&String(host.className||'').indexOf('data2-player-block')<0)host=host.parentElement;\n  const fit=()=>{\n    const w=root.clientWidth||0;\n    root.setAttribute('data-w',w>=900?'l':(w>=560?'m':'s'));\n    if(host){\n      const off=root.getBoundingClientRect().top-host.getBoundingClientRect().top;\n      const h=Math.floor(host.clientHeight-Math.max(0,off));\n      if(h>=220){root.classList.add('sq-fixed');root.style.height=h+'px';}\n      else{root.classList.remove('sq-fixed');root.style.height='';}\n    }\n  };\n  fit();[200,800].forEach(ms=>setTimeout(fit,ms));\n  if(typeof ResizeObserver==='function'){const ro=new ResizeObserver(()=>fit());ro.observe(root);if(host)ro.observe(host);}\n  else window.addEventListener('resize',fit);\n})();\n\n})();\n  //EVD_SRC>>\n}\n\nfunction evdDrain(offs) { offs.splice(0).forEach(function (f) { try { f() } catch (e) { } }) }\nfunction evdKit(offs) {\n  const T = new Set(), I = new Set()\n  offs.push(function () { T.forEach(function (id) { clearTimeout(id) }); I.forEach(function (id) { clearInterval(id) }); T.clear(); I.clear() })\n  function st(fn, ms) { const a = [].slice.call(arguments, 2); const id = setTimeout(function () { T.delete(id); fn.apply(null, a) }, ms); T.add(id); return id }\n  function si(fn, ms) { const a = [].slice.call(arguments, 2); const id = setInterval(function () { fn.apply(null, a) }, ms); I.add(id); return id }\n  const RO0 = typeof ResizeObserver === 'function' ? ResizeObserver : null\n  const RO = RO0 ? class extends RO0 { constructor(cb) { super(cb); const me = this; offs.push(function () { try { me.disconnect() } catch (e) { } }) } } : undefined\n  return { setTimeout: st, setInterval: si, ResizeObserver: RO }\n}\nfunction evdText(v) {\n  if (v == null) return ''\n  if (typeof v === 'string') return v\n  try { return JSON.stringify(v) } catch (e) { }\n  try { const stack = []; return JSON.stringify(v, function (k, x) { if (x && typeof x === 'object') { while (stack.length && stack[stack.length - 1] !== this) stack.pop(); if (stack.indexOf(x) >= 0) return undefined; stack.push(x) } return x }) } catch (e) { return '' }\n}\nfunction evdInput(d2) { return d2.param('exemplo') === true ? EVD_EXEMPLO : d2.param('datos') }\nfunction evdSig(s) { let h = 5381; for (let i = 0; i < s.length; i++) h = ((h << 5) + h + s.charCodeAt(i)) | 0; return s.length + '-' + (h >>> 0).toString(36) }\nfunction evdBoot(d2) {\n  const host = d2.$('.evd-host'); if (!host) return\n  const txt = evdText(evdInput(d2)), sig = evdSig(txt)\n  let st = EVD_INST.get(d2)\n  if (st && st.sig === sig && st.host === host && host.firstChild) return\n  if (!st) { st = { offs: [] }; EVD_INST.set(d2, st); d2.onUnmount(function () { evdDrain(st.offs); EVD_INST.delete(d2) }) }\n  evdDrain(st.offs)\n  st.sig = sig; st.host = host\n  host.innerHTML = EVD_MARKUP\n  const box = host.querySelector('#evddata'); if (box) box.textContent = txt\n  const k = evdKit(st.offs)\n  evdRun({ root: host.querySelector('#evdroot'), host: host }, k.setTimeout, k.setInterval, k.ResizeObserver)\n}\n\nexport default {\n  css: `.evd-wrap{display:block;width:100%;height:100%;box-sizing:border-box}\n.evd-host{display:block;width:100%;height:100%;overflow:auto;box-sizing:border-box}`,\n  render(d2) {\n    const sig = evdSig(evdText(evdInput(d2)))\n    return `<div class=\"evd-wrap\" data-sig=\"${sig}\"><div class=\"evd-host data2-player-block\" data-d2-static></div></div>`\n  },\n  mounted(d2) { evdBoot(d2) },\n  updated(d2) { evdBoot(d2) }\n}\n"}},"datos":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"datos"}}}},"exemplo":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"exemplo"}}}}}}}}}},{"_id":"6ad42e9f8e848bb6ddf7ef8a","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","component":"RS_DocumentationFormer_replica_R6","package":"natura","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"// R6DocumentationFormer — réplica (code component) del Html 6aa1e9b95126077c0cd22b91 \"Document automitazion\"\n// (artboard \"DocuFormer\" XZLNUHVJRUeiwpLbphHV8, ruta AiPortal /autodocument). Generado por script desde el dump.\n// NO editar a mano el cuerpo de dfRun: es el <script id=\"dfsrc\"> original con 9 trocas verificadas por sha256.\nconst DF_MARKUP = \"<div id=\\\"dfroot\\\">\\n  <div class=\\\"df-bar\\\">\\n    <div class=\\\"df-logo\\\">D</div>\\n    <h1>DocumentationFormer</h1>\\n    <span class=\\\"df-sub\\\" data-dev=\\\"Convierte un componente de D2 —o cualquier JSON— en documentación técnica lista para leer\\\" data-ana=\\\"Convierte una idea escrita en palabras en una propuesta funcional con pasos, escenarios y ticket\\\">Convierte un componente de D2 —o cualquier JSON— en documentación técnica lista para leer</span>\\n    <div class=\\\"df-spacer\\\"></div>\\n    <label class=\\\"df-mode\\\"><span>Perfil</span>\\n      <select data-ref=\\\"mode\\\">\\n        <option value=\\\"dev\\\">Desarrollador · documentar lo que ya existe</option>\\n        <option value=\\\"ana\\\">Analista · convertir una idea en flujo y ticket</option>\\n      </select>\\n    </label>\\n    <span class=\\\"df-pill\\\" data-ref=\\\"rushPill\\\">rush/5-Pt1YBl7MUnf1P4gOdj2</span>\\n  </div>\\n  <div class=\\\"df-main\\\">\\n    <section class=\\\"df-col\\\">\\n      <div class=\\\"df-card\\\">\\n        <div class=\\\"df-hd\\\"><span class=\\\"df-step\\\">1</span><span data-dev=\\\"Objeto, Series o Function exportado de D2\\\" data-ana=\\\"La idea: qué quieres construir, con tus palabras\\\">Objeto, Series o Function exportado de D2</span>\\n          <div class=\\\"df-spacer\\\"></div>\\n          <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnFormat\\\" type=\\\"button\\\" data-only=\\\"dev\\\">Validar</button>\\n          <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnClear\\\" type=\\\"button\\\">Limpiar</button>\\n        </div>\\n        <div class=\\\"df-bd\\\">\\n          <div class=\\\"df-drop\\\" data-ref=\\\"drop\\\">\\n            <button class=\\\"df-btn df-primary\\\" data-ref=\\\"btnPick\\\" type=\\\"button\\\" data-dev=\\\"Elegir archivo .json o .txt\\\" data-ana=\\\"Subir notas, acta o borrador (.txt)\\\">Elegir archivo .json o .txt</button>\\n            <span data-dev=\\\"Recomendado para objetos grandes. Se lee completo, se reconocen tablas, APIs y componentes, y se compacta antes de enviar. También puedes arrastrar el archivo aquí.\\\" data-ana=\\\"Si la idea ya está escrita en un acta, un correo o unas notas de reunión, súbela tal cual: no hace falta ordenarla antes. También puedes arrastrar el archivo aquí.\\\"><b>Recomendado para objetos grandes.</b> Se lee completo, se reconocen tablas, APIs y componentes, y se compacta antes de enviar. También puedes arrastrar el archivo aquí.</span>\\n            <input type=\\\"file\\\" data-ref=\\\"file\\\" accept=\\\".json,.txt,application/json,text/plain\\\">\\n          </div>\\n          <div class=\\\"df-row\\\" style=\\\"justify-content:space-between\\\" data-only=\\\"dev\\\">\\n            <span style=\\\"font-size:11px;color:var(--muted)\\\">Al pegar (Ctrl+V):</span>\\n            <div class=\\\"df-tabs\\\" data-ref=\\\"pasteMode\\\">\\n              <button class=\\\"on\\\" data-mode=\\\"replace\\\" type=\\\"button\\\" title=\\\"Cada pegado reemplaza el contenido\\\">Reemplazar</button>\\n              <button data-mode=\\\"append\\\" type=\\\"button\\\" title=\\\"Cada pegado se añade al final: para cuando el portapapeles corta el JSON\\\">Añadir al final (por partes)</button>\\n            </div>\\n            <span class=\\\"df-stat\\\" data-ref=\\\"bufInfo\\\">vacío</span>\\n          </div>\\n          <textarea class=\\\"df-json\\\" data-ref=\\\"json\\\" spellcheck=\\\"false\\\" data-anaph=\\\"Escribe aquí la idea, como te salga. No hace falta que esté ordenada ni completa: de eso se encarga el documento.\\n\\nEjemplo:\\nQueremos que cuando una consultora escriba por WhatsApp pidiendo el estado de su pedido, el asistente le responda solo con los pedidos de los ultimos 3 meses. Si no tiene pedidos, que le ofrezca hablar con un asesor. El dato viene del sistema de pedidos, no se si por API o por la tabla que ya usamos. Tambien queremos registrar cuantas veces preguntan esto para saber si vale la pena automatizar mas cosas.\\\" placeholder='Pega aquí el JSON del componente (o usa el botón de archivo), p. ej.\\n[\\n  { \\\"type\\\": \\\"prop\\\", \\\"value\\\": { \\\"component\\\": \\\"data2-core-flow@Series\\\", \\\"params\\\": { ... } } }\\n]'></textarea>\\n          <div class=\\\"df-stats\\\" data-ref=\\\"stats\\\"></div>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"df-card\\\">\\n        <div class=\\\"df-hd\\\"><span class=\\\"df-step\\\">2</span>Ficha del documento <span style=\\\"font-weight:400;color:var(--dim);font-size:11px\\\">(opcional)</span></div>\\n        <div class=\\\"df-bd\\\">\\n          <div class=\\\"df-grid2\\\">\\n            <label class=\\\"df-f\\\"><span data-dev=\\\"Nombre del componente / caso de uso\\\" data-ana=\\\"Nombre del caso de uso o servicio\\\">Nombre del componente / caso de uso</span><input type=\\\"text\\\" data-ref=\\\"mName\\\" placeholder=\\\"p. ej. GET_INVOICE · ReplyEndpoint\\\"></label>\\n            <label class=\\\"df-f\\\">Solicitante / Cluster<input type=\\\"text\\\" data-ref=\\\"mCluster\\\" placeholder=\\\"p. ej. AVI – FULL Data2\\\"></label>\\n            <label class=\\\"df-f\\\"><span data-dev=\\\"Dev responsable\\\" data-ana=\\\"Analista responsable\\\">Dev responsable</span><input type=\\\"text\\\" data-ref=\\\"mDev\\\" placeholder=\\\"p. ej. Juan Camilo G Naffah\\\"></label>\\n            <label class=\\\"df-f\\\">Sprint<input type=\\\"text\\\" data-ref=\\\"mSprint\\\" placeholder=\\\"p. ej. 40\\\"></label>\\n            <label class=\\\"df-f\\\"><span data-dev=\\\"Periodo de desarrollo\\\" data-ana=\\\"Fecha objetivo / periodo\\\">Periodo de desarrollo</span><input type=\\\"text\\\" data-ref=\\\"mPeriod\\\" placeholder=\\\"p. ej. Feb-9-2026 – Feb-27-2026\\\"></label>\\n            <label class=\\\"df-f\\\"><span data-dev=\\\"Fecha último deploy\\\" data-ana=\\\"Prioridad\\\">Fecha último deploy</span><input type=\\\"text\\\" data-ref=\\\"mDeploy\\\" placeholder=\\\"p. ej. 19-03-2026\\\"></label>\\n          </div>\\n          <details class=\\\"df-adv\\\">\\n            <summary>Opciones avanzadas · prompt, compactación, endpoint</summary>\\n            <div class=\\\"df-bd2\\\">\\n              <div class=\\\"df-bd2\\\" data-only=\\\"dev\\\" style=\\\"padding:0;gap:10px\\\">\\n              <label class=\\\"df-chk\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optCompact\\\" checked> Compactar JSON antes de enviar (recomendado: ~25× más pequeño, conserva todas las referencias)</label>\\n              <label class=\\\"df-chk\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optDropDisabled\\\"> Eliminar nodos <code>disabled:true</code> (si no, se marcan y el prompt pide no documentarlos como activos)</label>\\n              <label class=\\\"df-f\\\">Componentes de log que se deben ignorar (IDs separados por coma)\\n                <input type=\\\"text\\\" data-ref=\\\"optLogs\\\" value=\\\"natura@3UcTJBMDap5uV1yKV_uLr, __LoggerService\\\">\\n              </label>\\n              </div>\\n              <label class=\\\"df-f\\\">Endpoint Rush (POST · body.text = prompt + JSON)\\n                <input type=\\\"text\\\" data-ref=\\\"optUrl\\\" value=\\\"https://natura.data2.link/rush/5-Pt1YBl7MUnf1P4gOdj2\\\">\\n              </label>\\n              <label class=\\\"df-f\\\"><span data-dev=\\\"Prompt especializado, editable. Se antepone al JSON junto con el inventario detectado\\\" data-ana=\\\"Prompt del perfil Analista, editable. Se antepone a la idea que escribas\\\">Prompt especializado, editable. Se antepone al JSON junto con el inventario detectado</span>\\n                <textarea class=\\\"df-prompt\\\" data-ref=\\\"prompt\\\" spellcheck=\\\"false\\\"></textarea>\\n              </label>\\n              <div class=\\\"df-row\\\">\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnResetPrompt\\\" type=\\\"button\\\">Restaurar prompt por defecto</button>\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnCopyPayload\\\" type=\\\"button\\\">Copiar payload completo</button>\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnCopyCompact\\\" type=\\\"button\\\" data-only=\\\"dev\\\">Copiar JSON compactado</button>\\n              </div>\\n            </div>\\n          </details>\\n        </div>\\n      </div>\\n\\n      <div class=\\\"df-card\\\">\\n        <div class=\\\"df-hd\\\"><span class=\\\"df-step\\\">3</span>Opcionales <span style=\\\"font-weight:400;color:var(--dim);font-size:11px\\\" data-ana=\\\"(contexto, caso a simular, diagramas y diccionario de términos)\\\">(contexto, entrada de ejemplo, piezas del flujo, diagramas y nombres)</span></div>\\n        <div class=\\\"df-bd\\\">\\n\\n          <div class=\\\"df-opt\\\">\\n            <label class=\\\"df-toggle\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optCtxOn\\\"><i></i><span data-dev=\\\"Contexto del autor · cuéntale con tus palabras qué es esto y qué quieres del documento\\\" data-ana=\\\"Contexto adicional · lo que rodea a la idea y no cabe en ella\\\">Contexto del autor · cuéntale con tus palabras qué es esto y qué quieres del documento</span></label>\\n            <div class=\\\"df-opt-bd\\\" data-ref=\\\"ctxBox\\\" hidden>\\n              <p class=\\\"df-help\\\" data-ana=\\\"Aquí va lo que enmarca la idea: quién la pidió y por qué ahora, cómo se resuelve hoy, qué parte quieres desarrollar y cuál dejar fuera, qué restricciones existen, o qué escenario concreto quieres ver simulado. Cuanto más pongas, menos huecos quedan por rellenar en el documento.\\\">Escribe lo que el JSON no puede decir: para qué sirve el flujo, cómo crees que funciona, qué parte importa y cuál no, si quieres documentar solo un tramo, si quieres que simule un escenario, o cómo se conecta con otras piezas y componentes. El JSON sigue mandando sobre lo que el código hace: si algo no coincide con lo que escribas, el documento lo aclara en una sección de diferencias en vez de callarlo.</p>\\n              <textarea class=\\\"df-ctx\\\" data-ref=\\\"ctxText\\\" spellcheck=\\\"false\\\" placeholder=\\\"p. ej. Esto es el flujo de facturas del asistente de AVI. Creo que primero valida la sesión en la tabla de sesión y luego llama a replyEndpointHml para responder por WhatsApp.\\nSolo me interesa documentar desde que entra el mensaje hasta que se arma la lista de facturas; lo de después ya está documentado aparte.\\nEsta pieza se conecta con el componente de consulta de pedidos porque el id de pedido que saca aquí es el que aquel usa.\\nSi puedes, simula qué pasaría si la consultora no tiene facturas ese mes.\\\"></textarea>\\n              <div class=\\\"df-stats\\\" data-ref=\\\"ctxStats\\\"></div>\\n            </div>\\n          </div>\\n\\n          <div class=\\\"df-opt\\\">\\n            <label class=\\\"df-toggle\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optInputOn\\\"><i></i><span data-ana=\\\"Caso concreto · un ejemplo real que quieres ver simulado paso a paso\\\">Entrada de ejemplo · evalúa por dónde entraría un objeto real en este flujo</span></label>\\n            <div class=\\\"df-opt-bd\\\" data-ref=\\\"inputBox\\\" hidden>\\n              <p class=\\\"df-help\\\" data-ana=\\\"Escribe un caso concreto con datos de ejemplo: quién lo hace, con qué valores y qué espera obtener. Se desarrolla como el primer escenario del documento, paso a paso, hasta lo que recibe la persona al final.\\\">Pega el objeto JSON que llegaría al componente (el <code>body</code>, el <code>query</code>, un payload de prueba…). La documentación añadirá una sección con el recorrido exacto de esa entrada: qué condiciones se evalúan, con qué valores, qué rama se toma y qué recibiría el usuario.</p>\\n              <textarea class=\\\"df-input\\\" data-ref=\\\"inputJson\\\" spellcheck=\\\"false\\\" placeholder='{\\n  \\\"body\\\": { \\\"message\\\": { \\\"text\\\": \\\"necesito la factura del pedido 12345\\\" } },\\n  \\\"query\\\": { \\\"country\\\": \\\"CO\\\", \\\"consultantId\\\": \\\"123456\\\", \\\"env\\\": \\\"prod\\\" }\\n}'></textarea>\\n              <div class=\\\"df-stats\\\" data-ref=\\\"inputStats\\\"></div>\\n            </div>\\n          </div>\\n\\n          <div class=\\\"df-opt\\\" data-only=\\\"dev\\\">\\n            <label class=\\\"df-toggle\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optMultiOn\\\"><i></i><span>Varios componentes, un solo flujo</span></label>\\n            <div class=\\\"df-opt-bd\\\" data-ref=\\\"multiBox\\\" hidden>\\n              <p class=\\\"df-help\\\">El JSON del paso 1 es la <b>pieza principal</b>, el sujeto del documento. Aquí añades las piezas que continúan ese mismo flujo (otra Series, otro componente, un sub-flujo) y que <b>no necesitan documentación propia</b>. Sale un único documento que recorre todo seguido, indicando en cada salto en qué componente de D2 estás parado.</p>\\n              <div data-ref=\\\"pieces\\\"></div>\\n              <div class=\\\"df-row\\\">\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnPieceAdd\\\" type=\\\"button\\\">+ Añadir componente</button>\\n                <span class=\\\"df-stat\\\" data-ref=\\\"pieceCount\\\">ninguna pieza añadida</span>\\n              </div>\\n            </div>\\n          </div>\\n\\n          <div class=\\\"df-opt\\\">\\n            <label class=\\\"df-toggle\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optDiagramOn\\\" checked><i></i><span>Dibujar los diagramas aquí mismo</span></label>\\n            <div class=\\\"df-opt-bd\\\" data-ref=\\\"diagramBox\\\">\\n              <p class=\\\"df-help\\\">Activado, la vista previa dibuja el diagrama con el renderizador propio del bloque. Desactivado, se muestra solo el bloque <code>mermaid</code> para que lo pegues en <b>mermaid.live</b>, Confluence o cualquier visor. El código Mermaid está disponible siempre, en los dos modos.</p>\\n            </div>\\n          </div>\\n\\n          <div class=\\\"df-opt\\\">\\n            <label class=\\\"df-toggle\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optAliasOn\\\"><i></i><span data-ana=\\\"Diccionario · términos, sistemas y componentes que aparecen en la idea\\\">Diccionario de nombres · cómo quieres que se llame cada ID en la documentación</span></label>\\n            <div class=\\\"df-opt-bd\\\" data-ref=\\\"aliasBox\\\" hidden>\\n              <p class=\\\"df-help\\\" data-ana=\\\"Anota aquí los términos, sistemas o componentes que menciona la idea, cómo quieres que se llamen en el documento y, sobre todo, para qué sirve cada uno. Esa última columna es la que evita que el documento se invente el propósito de las cosas.\\\">Los nombres que pongas aquí mandan sobre cualquier nombre que el analizador deduzca. Ejemplo: <code>natura@OnRI2nG6M_5pIjmcilHty</code> → <code>replyEndpointHml</code>.</p>\\n              <div class=\\\"df-table\\\">\\n                <div class=\\\"df-thead\\\"><span data-ana=\\\"Término, sistema o ID\\\">ID o reference</span><span>Nombre en la documentación</span><span>Tipo (opcional)</span><span>¿Para qué se usa? · notas</span><span></span></div>\\n                <div data-ref=\\\"aliasRows\\\"></div>\\n              </div>\\n              <p class=\\\"df-help\\\">La columna <b>¿Para qué se usa?</b> es contexto de primera mano: se integra en la redacción, viaja a las tablas del documento y al glosario. Si escribes ahí que algo está <b>deprecado</b>, en desuso o es temporal, el documento lo dice cada vez que ese elemento aparece.</p>\\n              <div class=\\\"df-row\\\">\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnAliasAdd\\\" type=\\\"button\\\">+ Añadir fila</button>\\n                <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnAliasFill\\\" type=\\\"button\\\" title=\\\"Rellena la tabla con los IDs que el analizador encontró en el JSON\\\" data-only=\\\"dev\\\">Traer IDs detectados</button>\\n                <span class=\\\"df-stat\\\" data-ref=\\\"aliasCount\\\">0 nombres</span>\\n              </div>\\n              <label class=\\\"df-chk\\\" data-only=\\\"dev\\\"><input type=\\\"checkbox\\\" data-ref=\\\"optAliasReplace\\\" checked> Red de seguridad: si el documento devuelve algún ID suelto, reemplazarlo por su nombre (el glosario y las columnas de referencia se respetan)</label>\\n            </div>\\n          </div>\\n\\n        </div>\\n      </div>\\n\\n      <div class=\\\"df-card\\\">\\n        <div class=\\\"df-hd\\\"><span class=\\\"df-step\\\">4</span><span data-ana=\\\"Generar la propuesta\\\">Generar documentación</span>\\n          <div class=\\\"df-spacer\\\"></div>\\n          <span class=\\\"df-kbd\\\">Ctrl + Enter</span>\\n        </div>\\n        <div class=\\\"df-bd\\\">\\n          <div class=\\\"df-row\\\">\\n            <button class=\\\"df-btn df-primary\\\" data-ref=\\\"btnRun\\\" type=\\\"button\\\" data-ana=\\\"Generar propuesta y ticket\\\">Generar documentación</button>\\n            <button class=\\\"df-btn\\\" data-ref=\\\"btnCancel\\\" type=\\\"button\\\" disabled>Cancelar</button>\\n            <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnPing\\\" type=\\\"button\\\" title=\\\"Envía un texto mínimo al rush para verificar que llega (aparece en Executions)\\\">Probar conexión</button>\\n            <div class=\\\"df-status\\\"><span class=\\\"df-dot\\\" data-ref=\\\"dot\\\"></span><span data-ref=\\\"statusText\\\">Listo. Carga el JSON para empezar.</span></div>\\n          </div>\\n          <div class=\\\"df-log\\\" data-ref=\\\"log\\\"></div>\\n\\n          <div class=\\\"df-ai\\\">\\n            <div class=\\\"df-ai-hd\\\">\\n              <b>¿Prefieres usarlo en otra IA?</b>\\n              <span data-dev=\\\"Arma aquí el prompt completo —con el JSON compactado, el inventario, el contexto, las piezas y el diccionario ya dentro— para pegarlo en ChatGPT, Claude, Gemini o donde quieras. No se envía nada al rush, así que no consume tokens de D2.\\\" data-ana=\\\"Arma aquí el prompt completo —con la idea, el contexto, el caso a simular y el diccionario ya dentro— para pegarlo en ChatGPT, Claude, Gemini o donde quieras. No se envía nada al rush, así que no consume tokens de D2.\\\">Arma aquí el prompt completo —con el JSON compactado, el inventario, el contexto, las piezas y el diccionario ya dentro— para pegarlo en ChatGPT, Claude, Gemini o donde quieras. No se envía nada al rush, así que no consume tokens de D2.</span>\\n            </div>\\n            <div class=\\\"df-row\\\">\\n              <button class=\\\"df-btn\\\" data-ref=\\\"btnAiBuild\\\" type=\\\"button\\\">Preparar prompt para otra IA</button>\\n              <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnAiCopy\\\" type=\\\"button\\\" disabled>Copiar todo</button>\\n              <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnAiPart\\\" type=\\\"button\\\" hidden>Copiar por partes</button>\\n              <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnAiDownload\\\" type=\\\"button\\\" disabled>Descargar .txt</button>\\n              <span class=\\\"df-stat\\\" data-ref=\\\"aiInfo\\\">sin preparar</span>\\n            </div>\\n          </div>\\n        </div>\\n      </div>\\n    </section>\\n\\n    <section class=\\\"df-col\\\">\\n      <div class=\\\"df-card\\\">\\n        <div class=\\\"df-hd\\\">\\n          <div class=\\\"df-tabs\\\" data-ref=\\\"outTabs\\\">\\n            <button class=\\\"on\\\" data-tab=\\\"preview\\\" type=\\\"button\\\">Vista previa</button>\\n            <button data-tab=\\\"md\\\" type=\\\"button\\\">Markdown</button>\\n            <button data-tab=\\\"raw\\\" type=\\\"button\\\">Respuesta cruda</button>\\n            <button data-tab=\\\"prompt\\\" type=\\\"button\\\" title=\\\"El prompt completo, con todo ya reemplazado, para pegarlo en otra IA\\\">Prompt para otra IA</button>\\n          </div>\\n          <div class=\\\"df-spacer\\\"></div>\\n          <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnCopyMd\\\" type=\\\"button\\\" disabled>Copiar .md</button>\\n          <button class=\\\"df-btn df-ghost\\\" data-ref=\\\"btnDownload\\\" type=\\\"button\\\" disabled>Descargar .md</button>\\n        </div>\\n        <div class=\\\"df-bd\\\">\\n          <div class=\\\"df-out\\\">\\n            <div class=\\\"df-pane df-md on\\\" data-ref=\\\"preview\\\"><p style=\\\"color:var(--muted)\\\" data-ana=\\\"La propuesta aparecerá aquí: flujo paso a paso, caminos de error, escenarios simulados, diagrama y el ticket listo para pegar en Jira.\\\">La documentación aparecerá aquí: secciones, tablas de datos e integraciones, y el diagrama de flujo del componente.</p></div>\\n            <pre class=\\\"df-pane df-raw\\\" data-ref=\\\"mdRaw\\\"></pre>\\n            <pre class=\\\"df-pane df-raw\\\" data-ref=\\\"rawResp\\\"></pre>\\n            <pre class=\\\"df-pane df-raw\\\" data-ref=\\\"promptOut\\\"></pre>\\n          </div>\\n        </div>\\n      </div>\\n    </section>\\n  </div>\\n\\n</div>\";\nconst DF_INST = new WeakMap();\nconst DF_ENSAIO_MS = 2600;\nconst DF_ENSAIO_MD = \"# Flujo de ejemplo — Documentación técnica\\n\\n> Documento **sintético** generado en el navegador en modo *ensayo*: no se llamó al rush ni al asistente.\\n\\n## 0. Ficha del desarrollo\\n| Campo | Valor |\\n|---|---|\\n| PERIODO DE DESARROLLO | Por definir |\\n| DEV RESPONSABLE | [[COMPLETAR: nombre del responsable]] |\\n\\n## 1. Resumen\\nEl flujo recibe el mensaje de la consultora, valida el código y responde con el estado del pedido. Usa la tabla `current_chat_session_ds` y la API ***Get Orders***; el paso viejo de reintento quedó ~~activo~~ deshabilitado.\\n\\n---\\n\\n## 7. Recorrido del flujo, paso a paso\\n1. **P-01 · Se recibe el mensaje.** El texto llega en `body.message.text`.\\n2. **P-02 · Se valida el código.** Si no es numérico, se pide otra vez.\\n   - Caso borde: código vacío.\\n3. **P-03 · Se consulta la API.** Se envía `consultantId` y se guarda `orders_top3`.\\n\\n```json\\n{\\\"consultantId\\\": \\\"00000000\\\", \\\"cycle\\\": \\\"202614\\\"}\\n```\\n\\n## 11. Diagrama de flujo (ignorando logs)\\n```mermaid\\nflowchart TD\\n  N1[\\\"Recibe el mensaje\\\"] --> D1{\\\"¿El código es numérico?\\\"}\\n  D1 -- \\\"sí\\\" --> T1[[\\\"Consulta Get Orders\\\"]]\\n  D1 -- \\\"no\\\" --> N2(\\\"Pide el código otra vez\\\")\\n  N2 -.-> N1\\n  T1 --> N3([\\\"Responde con el estado del pedido\\\"])\\n```\\n1. Recibe el mensaje. 2. Valida el código. 3. Consulta la API o pide el código otra vez. 4. Responde.\\n\\n## 15. Glosario de referencias\\n| Nombre usado en este documento | ID / reference exacto | Tipo |\\n|---|---|---|\\n| Get Orders | `demoHttpRequest01` | HttpRequest / API |\\n\\nMás detalles en [mermaid.live](https://mermaid.live).\\n\\n## 18. Huecos por completar\\n| # | Sección | Qué falta |\\n|---|---|---|\\n| 1 | 0 | [[COMPLETAR: nombre del responsable]] |\\n\";\nconst DF_ENSAIO_JSON = \"{\\n  \\\"component\\\": \\\"data2-core-flow@Series\\\",\\n  \\\"displayName\\\": \\\"demoFlujoPedidos (sintético)\\\",\\n  \\\"params\\\": {\\n    \\\"actions\\\": [\\n      {\\n        \\\"component\\\": \\\"data2-core-types@Getter\\\",\\n        \\\"displayName\\\": \\\"lee la sesión demo_session_ds\\\",\\n        \\\"params\\\": {\\n          \\\"module\\\": {\\n            \\\"component\\\": \\\"data2-core-types@InteractiveModuleReference\\\",\\n            \\\"params\\\": {\\n              \\\"reference\\\": \\\"demoSessionDs\\\"\\n            }\\n          },\\n          \\\"prop\\\": {\\n            \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n            \\\"params\\\": {\\n              \\\"content\\\": \\\"cursor.current.consultant_id\\\"\\n            }\\n          }\\n        }\\n      },\\n      {\\n        \\\"component\\\": \\\"data2-core-flow@Step\\\",\\n        \\\"params\\\": {\\n          \\\"resultName\\\": {\\n            \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n            \\\"params\\\": {\\n              \\\"content\\\": \\\"orders_top3\\\"\\n            }\\n          },\\n          \\\"action\\\": {\\n            \\\"component\\\": \\\"data2-core-connect@HttpRequest\\\",\\n            \\\"reference\\\": \\\"demoHttpRequest01\\\",\\n            \\\"displayName\\\": \\\"Get Orders (demo)\\\",\\n            \\\"params\\\": {\\n              \\\"url\\\": {\\n                \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                \\\"params\\\": {\\n                  \\\"content\\\": \\\"https://example.invalid/orders\\\"\\n                }\\n              },\\n              \\\"method\\\": {\\n                \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                \\\"params\\\": {\\n                  \\\"content\\\": \\\"GET\\\"\\n                }\\n              }\\n            }\\n          }\\n        }\\n      },\\n      {\\n        \\\"component\\\": \\\"data2-core-flow@If\\\",\\n        \\\"params\\\": {\\n          \\\"compare\\\": [\\n            {\\n              \\\"component\\\": \\\"data2-core-types@Getter\\\",\\n              \\\"params\\\": {\\n                \\\"module\\\": {\\n                  \\\"component\\\": \\\"data2-core-types@InteractiveModuleReference\\\",\\n                  \\\"params\\\": {\\n                    \\\"reference\\\": \\\"demoSessionDs\\\"\\n                  }\\n                },\\n                \\\"prop\\\": {\\n                  \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                  \\\"params\\\": {\\n                    \\\"content\\\": \\\"data.records\\\"\\n                  }\\n                }\\n              }\\n            }\\n          ],\\n          \\\"then\\\": {\\n            \\\"component\\\": \\\"natura@demoComponenteFicticio\\\",\\n            \\\"params\\\": {\\n              \\\"message\\\": {\\n                \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                \\\"params\\\": {\\n                  \\\"content\\\": \\\"Tu pedido está en camino\\\"\\n                }\\n              }\\n            }\\n          },\\n          \\\"else\\\": {\\n            \\\"component\\\": \\\"data2-core-types@Setter\\\",\\n            \\\"params\\\": {\\n              \\\"module\\\": {\\n                \\\"component\\\": \\\"data2-core-types@InteractiveModuleReference\\\",\\n                \\\"params\\\": {\\n                  \\\"reference\\\": \\\"demoSessionDs\\\"\\n                }\\n              },\\n              \\\"prop\\\": {\\n                \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                \\\"params\\\": {\\n                  \\\"content\\\": \\\"cursor.current.status\\\"\\n                }\\n              },\\n              \\\"value\\\": {\\n                \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n                \\\"params\\\": {\\n                  \\\"content\\\": \\\"sin_pedidos\\\"\\n                }\\n              }\\n            }\\n          }\\n        }\\n      },\\n      {\\n        \\\"component\\\": \\\"data2-core-types@Interaction\\\",\\n        \\\"disabled\\\": true,\\n        \\\"params\\\": {\\n          \\\"module\\\": {\\n            \\\"component\\\": \\\"data2-core-types@InteractiveModuleReference\\\",\\n            \\\"params\\\": {\\n              \\\"reference\\\": \\\"__LoggerService\\\"\\n            }\\n          },\\n          \\\"prop\\\": \\\"log\\\",\\n          \\\"args\\\": [\\n            {\\n              \\\"component\\\": \\\"data2-core-primitives@String\\\",\\n              \\\"params\\\": {\\n                \\\"content\\\": \\\"Log --> fin\\\"\\n              }\\n            }\\n          ]\\n        }\\n      }\\n    ]\\n  }\\n}\";\n\nfunction dfToRes(r, transport) { return { status: 200, statusText: 'OK', text: typeof r === 'string' ? r : JSON.stringify(r == null ? '' : r), transport: transport } }\nfunction dfErrToRes(e, transport) {\n  const st = +(e && (e.status || e.statusCode || (e.response && e.response.status))) || 0\n  if (!st) throw e\n  const b = e.body !== undefined ? e.body : (e.data !== undefined ? e.data : (e.response && e.response.data))\n  return { status: st, statusText: String((e && e.message) || 'Error'), text: typeof b === 'string' ? b : JSON.stringify(b == null ? { message: String((e && e.message) || e) } : b), transport: transport }\n}\nfunction dfEnsaio() { return { id: 'ensaio-local', object: 'chat.completion', model: 'ensaio', choices: [{ index: 0, message: { role: 'assistant', content: DF_ENSAIO_MD }, finish_reason: 'stop' }] } }\nasync function dfPost(d2, k, doPost, url, body, onNote) {\n  if (d2.param('ensaio') !== false) {\n    if (onNote) onNote('Modo ensayo: ninguna petición salió del navegador (respuesta sintética local).')\n    await new Promise(function (r) { k.setTimeout(r, DF_ENSAIO_MS) })\n    return dfToRes(dfEnsaio(), 'ensaio (sin red)')\n  }\n  if (d2.context && d2.context.isBuilder) throw new Error('Envío al rush bloqueado en el builder: use ensaio:true aquí y la app publicada para enviar.')\n  let h = null\n  try { if (d2.params && d2.params.docRush) h = d2.rush('docRush') } catch (e) { h = null; if (onNote) onNote('d2.rush no disponible: ' + ((e && e.message) || e)) }\n  if (!h) {\n    if (d2.param('envioDirecto') !== true) throw new Error('Sin docRush ligado: el envío directo (doPost) está deshabilitado. Ligue docRush o active envioDirecto.')\n    return doPost(url, body, onNote)\n  }\n  if (onNote) onNote('Envío por d2.rush(docRush) con la sesión del visitante: el campo \"Endpoint\" no se usa.')\n  try { return dfToRes(await h.invoke(JSON.parse(body)), 'd2.rush().invoke') }\n  catch (e) { return dfErrToRes(e, 'd2.rush().invoke') }\n}\n\nfunction dfRun(__D2, setTimeout, setInterval, ResizeObserver) {//<<DF_SRC\n(function(){\n'use strict';\nconst DF_CSS=\"/* DocumentationFormer · Natura Design System (tema claro, bloque embebido: lienzo transparente) */\\n#dfroot{\\n  --naranja:#F4801E; --naranja-hover:#D9611C; --ambar:#F9A33F;\\n  --ink:#58595B; --ink2:#6D6E71; --dim:#939598;\\n  --line:#E6E6E6; --div:#EFEFEF; --surf:#FFFFFF; --soft:#FAFAFA;\\n  --ok:#2E7D5B; --ok-bg:#E7F4EC; --warn:#B26A00; --warn-bg:#FDF1DF; --err:#C0392B; --err-bg:#FBEAE8;\\n  --verde:#3F8F6F; --morado:#8E5B7E; --dorado:#E8A33D;\\n  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,\\\"Liberation Mono\\\",monospace;\\n  --sans:Montserrat,\\\"Natura Sans\\\",ui-sans-serif,system-ui,\\\"Segoe UI\\\",Roboto,sans-serif;\\n  --ease:cubic-bezier(.2,.7,.3,1);\\n  font:400 13px/1.55 var(--sans); color:var(--ink); background:transparent;\\n  width:100%; box-sizing:border-box; container-type:inline-size; text-align:left;\\n}\\n#dfroot *{box-sizing:border-box;min-width:0}\\n#dfroot [hidden]{display:none !important}\\n#dfroot p,#dfroot li,#dfroot span,#dfroot label,#dfroot summary,#dfroot h1{color:inherit}\\n\\n/* ---- cabecera ---- */\\n#dfroot .df-bar{display:flex;align-items:center;gap:10px;padding:0 4px 12px;margin-bottom:16px;border-bottom:2px solid var(--naranja)}\\n#dfroot .df-logo{width:26px;height:26px;border-radius:7px;background:linear-gradient(135deg,var(--ambar),#F0801E);display:grid;place-items:center;font-weight:700;font-size:13px;color:#fff;flex:0 0 auto}\\n#dfroot .df-bar h1{font-size:20px;font-weight:700;margin:0;color:var(--ink);letter-spacing:-.01em}\\n#dfroot .df-bar .df-sub{font-size:11px;color:var(--dim)}\\n#dfroot .df-spacer{flex:1}\\n#dfroot .df-pill{font-size:10.5px;padding:4px 10px;border:1px solid var(--line);border-radius:6px;color:var(--ink2);font-family:var(--mono);background:var(--surf);white-space:nowrap}\\n\\n/* ---- layout ---- */\\n#dfroot .df-main{display:grid;grid-template-columns:1fr;gap:16px}\\n@container (min-width:1000px){#dfroot .df-main{grid-template-columns:minmax(360px,40%) 1fr;align-items:start}}\\n#dfroot .df-col{display:flex;flex-direction:column;gap:16px;min-width:0;container-type:inline-size}\\n\\n/* ---- tarjetas ---- */\\n#dfroot .df-card{background:var(--surf);border:1px solid var(--line);border-radius:8px;box-shadow:0 1px 2px rgba(0,0,0,.04);display:flex;flex-direction:column;overflow:hidden}\\n#dfroot .df-hd{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--div);font-size:13px;font-weight:600;color:var(--ink2);flex-wrap:wrap}\\n#dfroot .df-hd .df-step{width:20px;height:20px;border-radius:5px;background:var(--warn-bg);color:var(--naranja-hover);font-size:11px;font-weight:700;display:grid;place-items:center;flex:0 0 auto}\\n#dfroot .df-bd{padding:16px;display:flex;flex-direction:column;gap:12px}\\n\\n/* ---- formularios ---- */\\n#dfroot textarea,#dfroot input[type=text]{width:100%;background:var(--surf);color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:9px 12px;font:400 12.5px/1.5 var(--sans);outline:none;margin:0;transition:border-color .16s var(--ease)}\\n#dfroot input[type=text]{height:38px}\\n#dfroot textarea{font-family:var(--mono);font-size:12px}\\n#dfroot textarea:focus,#dfroot input:focus{border-color:var(--naranja)}\\n#dfroot textarea::placeholder,#dfroot input::placeholder{color:var(--dim)}\\n#dfroot textarea.df-json{min-height:190px;height:230px;resize:vertical}\\n#dfroot textarea.df-prompt{min-height:160px;max-height:320px;resize:vertical}\\n#dfroot label.df-f{display:flex;flex-direction:column;gap:5px;font-size:11px;color:var(--dim)}\\n#dfroot .df-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}\\n#dfroot .df-grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}\\n@container (max-width:440px){#dfroot .df-grid2{grid-template-columns:1fr}}\\n\\n/* ---- botones ---- */\\n#dfroot button.df-btn{cursor:pointer;border:1px solid var(--line);background:var(--surf);color:var(--ink2);border-radius:6px;padding:9px 16px;font:600 12px var(--sans);display:inline-flex;align-items:center;gap:6px;line-height:1.3;transition:border-color .16s var(--ease),color .16s var(--ease),filter .16s var(--ease)}\\n#dfroot button.df-btn:hover{border-color:var(--naranja);color:var(--naranja-hover)}\\n#dfroot button.df-btn:focus-visible{outline:2px solid var(--naranja);outline-offset:2px}\\n#dfroot button.df-primary{background:linear-gradient(135deg,var(--ambar),#F0801E);border-color:transparent;color:#fff}\\n#dfroot button.df-primary:hover{filter:brightness(1.05);color:#fff;border-color:transparent}\\n#dfroot button.df-btn:disabled{opacity:.45;cursor:not-allowed;filter:none}\\n#dfroot button.df-ghost{background:transparent;border-color:transparent;color:var(--ink2);padding:7px 10px}\\n#dfroot button.df-ghost:hover{background:var(--soft);border-color:var(--line)}\\n#dfroot .df-chk{display:inline-flex;align-items:flex-start;gap:8px;font-size:12px;color:var(--ink2);cursor:pointer;user-select:none;line-height:1.45}\\n#dfroot .df-chk input{accent-color:var(--naranja);margin:2px 0 0}\\n\\n/* ---- chips de estado ---- */\\n#dfroot .df-stats{display:flex;gap:6px;flex-wrap:wrap}\\n#dfroot .df-stat{font-size:11px;font-weight:600;padding:4px 10px;border-radius:6px;background:var(--soft);border:1px solid var(--line);color:var(--ink2);font-variant-numeric:tabular-nums}\\n#dfroot .df-stat b{color:var(--ink);font-weight:700}\\n#dfroot .df-stat.ok{background:var(--ok-bg);border-color:#CBE7D8;color:var(--ok)}\\n#dfroot .df-stat.ok b{color:var(--ok)}\\n#dfroot .df-stat.warn{background:var(--warn-bg);border-color:#F5DFBB;color:var(--warn)}\\n#dfroot .df-stat.warn b{color:var(--warn)}\\n#dfroot .df-stat.err{background:var(--err-bg);border-color:#F2CFCB;color:var(--err)}\\n#dfroot .df-stat.err b{color:var(--err)}\\n\\n/* ---- desplegable de opciones ---- */\\n#dfroot details.df-adv{border-top:1px solid var(--div);padding-top:12px}\\n#dfroot details.df-adv summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--ink2);user-select:none;list-style:none}\\n#dfroot details.df-adv summary::-webkit-details-marker{display:none}\\n#dfroot details.df-adv summary:before{content:\\\"▸ \\\";color:var(--naranja)}\\n#dfroot details.df-adv[open] summary:before{content:\\\"▾ \\\"}\\n#dfroot details.df-adv summary:hover{color:var(--naranja-hover)}\\n#dfroot details.df-adv .df-bd2{display:flex;flex-direction:column;gap:12px;padding-top:14px}\\n\\n/* ---- segmentos / pestañas ---- */\\n#dfroot .df-tabs{display:flex;gap:4px;flex-wrap:wrap}\\n#dfroot .df-tabs button{cursor:pointer;border:1px solid var(--line);background:var(--surf);padding:6px 14px;border-radius:6px;color:var(--ink2);font:600 11.5px var(--sans);transition:.16s var(--ease)}\\n#dfroot .df-tabs button:hover{border-color:var(--naranja);color:var(--naranja-hover)}\\n#dfroot .df-tabs button.on{background:linear-gradient(135deg,var(--ambar),#F0801E);border-color:transparent;color:#fff}\\n\\n/* ---- carga de archivo ---- */\\n#dfroot .df-drop{position:relative;border:1px dashed #DADADA;border-radius:8px;padding:14px;font-size:11.5px;color:var(--dim);display:flex;align-items:center;gap:12px;flex-wrap:wrap;background:var(--soft);transition:.16s var(--ease)}\\n#dfroot .df-drop.over{border-color:var(--naranja);background:var(--warn-bg);color:var(--ink2)}\\n#dfroot .df-drop b{color:var(--ink2)}\\n#dfroot .df-drop input[type=file]{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden}\\n\\n/* ---- estado y registro ---- */\\n#dfroot .df-status{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--ink2);min-height:20px}\\n#dfroot .df-dot{width:8px;height:8px;border-radius:50%;background:var(--dim);flex:0 0 auto}\\n#dfroot .df-dot.busy{background:var(--naranja);animation:dfpulse 1s infinite}\\n#dfroot .df-dot.ok{background:var(--ok)}#dfroot .df-dot.err{background:var(--err)}\\n@keyframes dfpulse{0%,100%{opacity:.3}50%{opacity:1}}\\n#dfroot .df-log{font-family:var(--mono);font-size:11px;line-height:1.5;max-height:230px;overflow:auto;display:flex;flex-direction:column;gap:1px;background:var(--soft);border:1px solid var(--div);border-radius:6px;padding:8px}\\n#dfroot .df-log:empty{display:none}\\n#dfroot .df-log div{display:flex;gap:8px;padding:3px 6px;border-radius:4px;color:var(--ink2)}\\n#dfroot .df-log .t{color:var(--dim);flex:0 0 auto;font-variant-numeric:tabular-nums}\\n#dfroot .df-log .m{white-space:pre-wrap;word-break:break-word}\\n#dfroot .df-log .ok{background:var(--ok-bg);color:var(--ok)}\\n#dfroot .df-log .err{background:var(--err-bg);color:var(--err)}\\n#dfroot .df-log .warn{background:var(--warn-bg);color:var(--warn)}\\n#dfroot .df-log .busy{color:var(--naranja-hover)}\\n#dfroot .df-kbd{font-family:var(--mono);font-size:10px;border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:2px 5px;color:var(--dim);background:var(--surf)}\\n\\n/* ---- salida ---- */\\n#dfroot .df-out{max-height:80vh;min-height:340px;overflow:auto;background:var(--surf)}\\n#dfroot .df-out>.df-pane{display:none}\\n#dfroot .df-out>.df-pane.on{display:block}\\n#dfroot pre.df-raw{margin:0;padding:16px;white-space:pre-wrap;word-break:break-word;font:12px/1.6 var(--mono);color:var(--ink2)}\\n\\n/* ---- documento renderizado ---- */\\n#dfroot .df-md{padding:24px 28px 48px;max-width:900px;font-size:13.5px;line-height:1.7;color:var(--ink)}\\n#dfroot .df-md>p:first-child{color:var(--dim)}\\n#dfroot .df-md h1{font-size:26px;font-weight:700;margin:.2em 0 .7em;padding-bottom:.4em;border-bottom:2px solid var(--naranja);color:var(--ink)}\\n#dfroot .df-md h2{font-size:19px;font-weight:700;margin:1.9em 0 .6em;color:var(--ink);padding-bottom:.3em;border-bottom:1px solid var(--line)}\\n#dfroot .df-md h3{font-size:15px;font-weight:700;margin:1.5em 0 .5em;color:var(--naranja-hover)}\\n#dfroot .df-md h4{font-size:13.5px;font-weight:700;margin:1.2em 0 .4em;color:var(--ink2)}\\n#dfroot .df-md h5,#dfroot .df-md h6{font-size:12.5px;font-weight:600;margin:1em 0 .3em;color:var(--ink2)}\\n#dfroot .df-md p{margin:.6em 0}\\n#dfroot .df-md ul,#dfroot .df-md ol{padding-left:1.5em;margin:.5em 0}\\n#dfroot .df-md li{margin:.25em 0}\\n#dfroot .df-md li::marker{color:var(--naranja)}\\n#dfroot .df-md strong{color:var(--ink);font-weight:700}\\n#dfroot .df-md code{font-family:var(--mono);font-size:11.8px;background:var(--soft);border:1px solid var(--line);border-radius:4px;padding:1.5px 5px;color:var(--naranja-hover)}\\n#dfroot .df-md pre{background:var(--soft);border:1px solid var(--line);border-radius:8px;padding:14px;overflow:auto;margin:.8em 0}\\n#dfroot .df-md pre code{background:none;border:none;padding:0;color:var(--ink2);font-size:12px;line-height:1.6}\\n#dfroot .df-md table{border-collapse:collapse;margin:.9em 0;width:100%;font-size:12.5px;display:block;overflow-x:auto;border:1px solid var(--line);border-radius:8px}\\n#dfroot .df-md th,#dfroot .df-md td{border-bottom:1px solid var(--div);border-right:1px solid var(--div);padding:9px 12px;text-align:left;vertical-align:top;color:var(--ink)}\\n#dfroot .df-md th{background:var(--soft);color:var(--ink2);font-weight:600;font-size:11.5px;letter-spacing:.02em;white-space:nowrap}\\n#dfroot .df-md tr:last-child td{border-bottom:none}\\n#dfroot .df-md th:last-child,#dfroot .df-md td:last-child{border-right:none}\\n#dfroot .df-md tbody tr:hover td{background:#FCFCFC}\\n#dfroot .df-md blockquote{margin:.9em 0;padding:.7em 1.1em;border-left:3px solid var(--naranja);background:var(--warn-bg);color:var(--ink2);border-radius:0 6px 6px 0}\\n#dfroot .df-md hr{border:none;border-top:1px solid var(--line);margin:2em 0}\\n#dfroot .df-md a{color:var(--naranja-hover)}\\n\\n/* ---- diagramas ---- */\\n#dfroot .df-md .df-diagram{background:var(--surf);border:1px solid var(--line);border-radius:8px;margin:1.1em 0;padding:14px 14px 8px;box-shadow:0 1px 2px rgba(0,0,0,.04)}\\n#dfroot .df-md .df-diagram-scroll{overflow:auto;max-width:100%}\\n#dfroot .df-md .df-diagram svg{max-width:100%;height:auto;display:block;margin:0 auto}\\n#dfroot .df-md .df-diagram-src{margin-top:10px;border-top:1px solid var(--div);padding-top:8px}\\n#dfroot .df-md .df-diagram-src summary{cursor:pointer;font-size:11px;color:var(--dim);font-family:var(--mono);list-style:none}\\n#dfroot .df-md .df-diagram-src summary::-webkit-details-marker{display:none}\\n#dfroot .df-md .df-diagram-src summary:before{content:\\\"▸ \\\";color:var(--naranja)}\\n#dfroot .df-md .df-diagram-src[open] summary:before{content:\\\"▾ \\\"}\\n#dfroot .df-md .df-diagram-src summary:hover{color:var(--ink2)}\\n#dfroot .df-md .df-diagram pre{margin:.6em 0 0}\\n#dfroot .df-md .mmfail{font-size:11.5px;color:var(--warn);background:var(--warn-bg);border-radius:6px;padding:8px 10px;margin-bottom:8px}\\n#dfroot .df-legend{display:flex;gap:12px;flex-wrap:wrap;font-size:10.5px;color:var(--dim);padding:8px 2px 0;border-top:1px solid var(--div);margin-top:8px}\\n#dfroot .df-legend span{display:inline-flex;align-items:center;gap:5px}\\n#dfroot .df-legend i{width:9px;height:9px;border-radius:2px;display:inline-block;border:1.4px solid}\\n\\n@media (prefers-reduced-motion: reduce){#dfroot *{animation:none !important;transition:none !important}}\\n\\n/* ---- bloques opcionales ---- */\\n#dfroot .df-opt+.df-opt{border-top:1px solid var(--div);padding-top:14px;margin-top:2px}\\n#dfroot .df-toggle{display:flex;align-items:center;gap:10px;cursor:pointer;user-select:none;font-size:12.5px;font-weight:600;color:var(--ink2);line-height:1.4}\\n#dfroot .df-toggle input{position:absolute;opacity:0;width:0;height:0}\\n#dfroot .df-toggle i{flex:0 0 auto;width:36px;height:20px;border-radius:999px;background:#DCDCDC;position:relative;transition:background .18s var(--ease)}\\n#dfroot .df-toggle i:after{content:\\\"\\\";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.18);transition:transform .18s var(--ease)}\\n#dfroot .df-toggle input:checked+i{background:linear-gradient(135deg,var(--ambar),#F0801E)}\\n#dfroot .df-toggle input:checked+i:after{transform:translateX(16px)}\\n#dfroot .df-toggle input:focus-visible+i{outline:2px solid var(--naranja);outline-offset:2px}\\n#dfroot .df-opt-bd{display:flex;flex-direction:column;gap:10px;padding:12px 0 2px 46px}\\n@container (max-width:440px){#dfroot .df-opt-bd{padding-left:0}}\\n#dfroot .df-help{margin:0;font-size:11.5px;color:var(--dim);line-height:1.55}\\n#dfroot .df-help code{font-family:var(--mono);font-size:11px;background:var(--soft);border:1px solid var(--line);border-radius:4px;padding:1px 5px;color:var(--naranja-hover)}\\n#dfroot textarea.df-input{min-height:120px;height:150px;resize:vertical}\\n#dfroot textarea.df-ctx{min-height:110px;height:140px;resize:vertical;font-family:var(--sans);font-size:12.5px;line-height:1.6}\\n\\n/* ---- usar el prompt en otra IA ---- */\\n#dfroot .df-ai{border-top:1px solid var(--div);padding-top:12px;display:flex;flex-direction:column;gap:9px}\\n#dfroot .df-ai-hd{display:flex;flex-direction:column;gap:3px}\\n#dfroot .df-ai-hd b{font-size:12px;font-weight:600;color:var(--ink2)}\\n#dfroot .df-ai-hd span{font-size:11.5px;color:var(--dim);line-height:1.55}\\n\\n/* ---- tabla editable de nombres ---- */\\n#dfroot .df-table{border:1px solid var(--line);border-radius:6px;overflow:hidden;background:var(--surf)}\\n#dfroot .df-thead,#dfroot .df-trow{display:grid;grid-template-columns:1.15fr 1fr .6fr 1.6fr 34px;gap:0;align-items:stretch}\\n#dfroot .df-thead{background:var(--soft);border-bottom:1px solid var(--line)}\\n#dfroot .df-thead span{padding:8px 10px;font-size:11px;font-weight:600;color:var(--ink2);border-right:1px solid var(--div)}\\n#dfroot .df-thead span:last-child{border-right:none}\\n#dfroot .df-trow{border-bottom:1px solid var(--div)}\\n#dfroot .df-trow:last-child{border-bottom:none}\\n#dfroot .df-trow input{height:36px;border:none;border-right:1px solid var(--div);border-radius:0;font-family:var(--mono);font-size:11.5px;padding:0 10px;background:transparent}\\n#dfroot .df-trow input:focus{border-color:var(--div);box-shadow:inset 0 0 0 1.5px var(--naranja)}\\n#dfroot .df-trow .df-del{border:none;background:transparent;color:var(--dim);cursor:pointer;font-size:15px;line-height:1;padding:0;display:grid;place-items:center;transition:color .16s var(--ease)}\\n#dfroot .df-trow .df-del:hover{color:var(--err)}\\n@container (max-width:760px){#dfroot .df-thead{display:none}#dfroot .df-trow{grid-template-columns:1fr 34px;border-bottom:2px solid var(--line);padding:2px 0}#dfroot .df-trow input{grid-column:1;border-right:none;border-bottom:1px solid var(--div);height:34px}#dfroot .df-trow input:last-of-type{border-bottom:none}#dfroot .df-trow .df-del{grid-column:2;grid-row:1/5;align-self:start;padding-top:8px}}\\n#dfroot .df-trow input[data-k=use]{font-family:var(--sans);font-size:11.5px}\\n#dfroot .df-thead span{overflow:hidden;text-overflow:ellipsis}\\n@container (max-width:760px){#dfroot .df-trow input{font-size:12px}#dfroot .df-trow input[data-k=id]{font-weight:600}}\\n\\n/* ---- selector de perfil (dev / analista) ---- */\\n#dfroot .df-mode{display:flex;align-items:center;gap:7px;font-size:11px;color:var(--dim);white-space:nowrap}\\n#dfroot .df-mode select{height:32px;border:1px solid var(--line);border-radius:6px;background:var(--surf);color:var(--ink);font:600 11.5px/1 var(--sans);padding:0 26px 0 10px;outline:none;cursor:pointer;appearance:none;-webkit-appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--ink2) 50%),linear-gradient(135deg,var(--ink2) 50%,transparent 50%);background-position:calc(100% - 14px) 14px,calc(100% - 9px) 14px;background-size:5px 5px,5px 5px;background-repeat:no-repeat}\\n#dfroot .df-mode select:focus{border-color:var(--naranja)}\\n#dfroot[data-mode=ana] .df-logo{background:var(--ink);}\\n#dfroot .df-fill{background:#FDF1DF;border:1px dashed var(--naranja);border-radius:4px;padding:1px 6px;color:var(--naranja-hover);font-weight:600;font-size:.94em}\\n#dfroot .df-md .df-diagram-code{padding:10px 14px 6px}\\n#dfroot .df-md .df-diagram-code .df-diagram-src{margin-top:0;border-top:none;padding-top:0}\\n#dfroot .df-mm-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding:8px 0 2px;font-size:11px;color:var(--dim)}\\n#dfroot .df-mm-head button{font-size:11px;padding:5px 10px}\\n\\n/* ---- piezas de un flujo repartido ---- */\\n#dfroot .df-piece{border:1px solid var(--line);border-radius:8px;background:var(--soft);padding:10px;margin-bottom:10px}\\n#dfroot .df-piece-hd{display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap}\\n#dfroot .df-piece-n{width:22px;height:22px;border-radius:5px;background:var(--warn-bg);color:var(--naranja-hover);font-size:11px;font-weight:700;display:grid;place-items:center;flex:0 0 auto}\\n#dfroot .df-piece-hd input[type=text]{flex:1 1 180px;height:34px;background:var(--surf)}\\n#dfroot .df-piece-hd .df-btn{padding:7px 12px;font-size:11px;background:var(--surf)}\\n#dfroot .df-piece .df-del{border:none;background:transparent;color:var(--dim);cursor:pointer;font-size:17px;line-height:1;padding:0 4px}\\n#dfroot .df-piece .df-del:hover{color:var(--err)}\\n#dfroot .df-piece textarea{min-height:96px;height:110px;resize:vertical;background:var(--surf)}\\n#dfroot .df-piece input[type=file]{position:absolute;width:1px;height:1px;opacity:0}\\n\";\n/* ============================================================\n   1) PROMPT ESPECIALIZADO (por defecto)\n   Placeholders: {{NOMBRE}} {{META_TABLE}} {{NOTACION}} {{LOGS}} {{INVENTARIO}}\n   ============================================================ */\nconst DEFAULT_PROMPT = `Eres un Ingeniero de Documentación Técnica senior especializado en la plataforma Data2 (D2). Recibirás el JSON exportado de un componente de D2 (un Object, una Series, una Function, Switch/If anidados, Parallel, Steps…, con varias capas). Tu tarea es producir su DOCUMENTACIÓN COMPLETA, ULTRADETALLADA y sobre todo ENTENDIBLE, en Markdown.\nSi lo que recibes NO es un componente de D2 sino otro tipo de JSON —una configuración, un payload, un registro de datos, un fragmento suelto o un objeto de otra herramienta— documéntalo igual y con la misma exigencia: adapta las secciones al contenido real, marca con \"No aplica\" las que no tengan sentido para ese material, y céntrate en explicar qué es, qué representa cada campo, de dónde salen y adónde van los datos, y cómo se relaciona con el resto del sistema.\n\nComponente a documentar: {{NOMBRE}}\n{{CONTEXTO}}{{MULTI}}{{DICCIONARIO}}\n{{CRITERIO}}\n################ CÓMO LEER EL JSON ANTES DE ESCRIBIR (CUATRO PASADAS) ################\nNo empieces por la sección 1. Un JSON de D2 está escrito en el orden en que se construyó, no en el orden en que se ejecuta, y documentarlo de arriba abajo produce un texto desordenado que no explica nada. Haz mentalmente estas cuatro pasadas y escribe solo después:\n\nPASADA 1 — EL MAPA. Localiza la raíz del componente y su punto de entrada: qué recibe (\\x60body\\x60, \\x60query\\x60, \\x60env\\x60, params de Function) y qué devuelve al final (la Response, el mensaje al usuario, el valor de retorno). Identifica si el componente tiene un solo camino o varios modos de operación, y cuál es la condición que elige entre ellos. Con esto ya sabes de dónde a dónde va el documento.\n\nPASADA 2 — EL ORDEN REAL. Recorre el flujo en el orden en que D2 lo ejecuta —Series secuencial, Parallel concurrente salvo \\x60concurrency\\x60, If compare y luego then/else, Switch expression contra cada Case en orden y si ninguno coincide defaultCase— y anota cada bifurcación con sus salidas. Cada rama que encuentres es una promesa: todas se documentan, también la que \"no hace nada\".\n\nPASADA 3 — EL INVENTARIO. Clasifica cada cosa que el flujo toca según la tabla de la clave \\x60\"component\"\\x60 (tablas y stores, APIs, componentes del workspace, nodos nativos) y ponle a cada una su nombre definitivo. Hazlo ANTES de narrar: así el documento llama a cada cosa igual de principio a fin, en vez de estrenar un nombre nuevo en cada sección.\n\nPASADA 4 — EL HILO DEL DATO. Para cada dato importante, reconstruye su vida: dónde nace, qué lo transforma, dónde se guarda y quién lo lee después. Aquí es donde aparecen las conexiones con otras piezas y las razones de cada salto. Si un dato se escribe y nadie lo lee dentro de este componente, eso es justamente una conexión con el exterior y hay que decirlo.\n\nSolo cuando tengas las cuatro pasadas, escribe el documento en el orden de la estructura.\n\n################ REGLA DE ORO: DOCUMENTA POR NOMBRES, NO POR IDs ################\nEl lector es una persona que va a abrir D2 y seguir el flujo. No le sirve \"se llama al módulo ewDp8c4XuPQHsmcZkYlwj\". Le sirve \"se abre la tabla de sesión current_chat_session_ds, se escribe el campo invoice_list y se guarda\".\nPor eso, para CADA cosa que el flujo toque debes decir tres cosas: QUÉ es, CÓMO SE LLAMA y QUÉ SE LE HIZO.\n1. QUÉ ES: tabla/DataSource, Variable Store, HttpRequest (API), componente del workspace, servicio de archivos, controlador de cursor… Dedúcelo por las props e interacciones que usa (ver \"Cómo leer cada nodo\").\n2. CÓMO SE LLAMA: usa, en este orden de preferencia, (a) el nombre real si aparece en el JSON —displayName del nodo o de su padre, un nombre tipo \\x60algo_ds\\x60, un resultName, el título de un Case—, (b) el nombre del inventario que te doy más abajo, (c) si de verdad no hay nombre, un alias descriptivo que tú inventes y marques como tal: \"tabla de sesión (alias; sin nombre en el JSON)\". El ID exacto va entre paréntesis la primera vez que lo mencionas: la tabla de sesión \\x60current_chat_session_ds\\x60 (\\x60ewDp8c4XuPQHsmcZkYlwj\\x60). Después basta el nombre. EXCEPCIÓN: si el elemento aparece en el DICCIONARIO DE NOMBRES, se usa solo el nombre, sin el ID al lado ni siquiera la primera vez; su ID vive en la columna Reference de las tablas y en el glosario.\n3. QUÉ SE LE HIZO: leer un campo, escribir un campo con qué valor y de dónde sale ese valor, filtrar, cargar páginas, guardar, crear, llamar a la API con qué parámetros, invocar un componente con qué entradas.\nSi un resultado se guarda en un Step con \\x60resultName\\x60, a partir de ahí llámalo por ese nombre (p. ej. \"el resultado \\x60semantic_faqs\\x60\") en todo el documento y también en el diagrama. Lo mismo con los nombres de los Case de un Switch.\n\n################ CÓMO IDENTIFICAR CADA COSA POR SU CLAVE \"component\" ################\nAntes de describir nada, clasifícalo por la forma exacta del valor de \\x60\"component\"\\x60. Esta tabla no admite interpretación:\n\n| Forma del valor de \"component\" | Qué ES | Cómo lo documentas |\n|---|---|---|\n| \\x60data2-core-<lo-que-sea>@X\\x60 (p. ej. \\x60data2-core-flow@Series\\x60, \\x60data2-core-functions@ArrayMap\\x60, \\x60data2-core-primitives@String\\x60) | Nodo nativo de D2: control de flujo, función, primitivo, operador | Como parte de la lógica del propio componente |\n| \\x60<tenant>@<ID>\\x60 — cualquier prefijo que NO empiece por \\x60data2-\\x60, típicamente \\x60natura@<ID>\\x60 (p. ej. \\x60natura@eY8F_Ly57TXrjtWsMnCIi\\x60, \\x60natura@OnRI2nG6M_5pIjmcilHty\\x60) | **UNA LLAMADA A OTRO COMPONENTE del workspace.** Punto. | Sección 6 \"Componentes que invoca\": reference exacto + todas sus entradas + qué se hace con su salida |\n| \\x60data2-core-connect@HttpRequest\\x60, \\x60http@Request\\x60, o un \\x60sendRequest\\x60 sobre un módulo | Una API / llamada HTTP | Sección 5 \"Integraciones y APIs\" |\n| \\x60data2-core-types@Getter/Setter/Interaction\\x60 sobre un \\x60InteractiveModuleReference\\x60 | Uso de un módulo: tabla/DataSource, Variable Store, storage, servicio | Sección 4 \"Datos: tablas, datasets y stores\" |\n\nREGLA INNEGOCIABLE SOBRE \\x60<tenant>@<ID>\\x60: si ves un \\x60\"component\"\\x60 con esa forma (el caso habitual es \\x60natura@\\x60 seguido de un ID aleatorio), es SIEMPRE una invocación a otro componente construido en el workspace. NUNCA lo llames API, endpoint, servicio externo, microservicio, función nativa de D2, librería, integración ni \"componente desconocido\". Aunque el ID sea opaco, aunque no tenga \\x60displayName\\x60, aunque no sepas qué hace por dentro: es un componente y así se documenta. En ese caso escribe exactamente \"llamada al componente \\x60natura@<ID>\\x60 (sin nombre visible en el JSON; para saber qué hace hay que abrirlo en D2)\" y documenta igualmente TODAS sus entradas —los \\x60params\\x60 que le pasan— con el origen de cada valor, porque eso es justo lo que necesita quien vaya a seguir el flujo hacia adentro. En el diagrama va con la forma \\x60[[ ]]\\x60, nunca con la de API.\n\n################ CÓMO LEER CADA NODO (traducción a lenguaje humano) ################\n- Getter sobre un módulo → \"lee <campo> de <nombre del módulo>\". Si el campo es \\x60data.records\\x60 o \\x60cursor.current.*\\x60, ese módulo es una TABLA/DataSource: dilo.\n- Setter sobre un módulo → \"escribe <campo> = <valor>\"; explica de dónde sale el valor (literal, campo de otra tabla, resultado de un Step, respuesta de una API, variable de iteración).\n- Interaction → traduce la acción: \\x60edit\\x60 = abre el registro para editar; \\x60save\\x60 = confirma los cambios en la tabla; \\x60create\\x60 = inserta; \\x60delete\\x60 = elimina; \\x60filter\\x60 = filtra la tabla por unos criterios (di cuáles); \\x60loadAllPages\\x60/\\x60loadPage\\x60 = trae los registros; \\x60sendRequest\\x60 = ejecuta la llamada HTTP; \\x60uploadFromFiles\\x60 = sube un archivo a una carpeta. Un \\x60edit\\x60 … \\x60save\\x60 alrededor de varios Setter es UNA escritura en la tabla: nárralo así, no como tres pasos sueltos.\n- HttpRequest (o \\x60sendRequest\\x60 sobre uno) → es una API. Di qué la dispara, qué se le manda (query, body, headers que sí aparezcan en el JSON), y qué se toma de la respuesta (\\x60prevResult.<path>\\x60) y hacia dónde va ese dato. Si la URL no está en el JSON, escribe \"URL definida dentro del HttpRequest, no visible en este JSON\".\n- Componente del workspace (\\x60natura@…\\x60 o cualquier \\x60<tenant>@<ID>\\x60 que no empiece por \\x60data2-\\x60) → SIEMPRE es una llamada a otro componente, nunca una API. Di su reference exacto, su nombre visible si lo hay, TODAS sus entradas con el origen de cada valor, y qué se hace con su salida. Este punto es crítico: quien siga el flujo va a abrir ese componente, y necesita saber con qué datos entra.\n- Step con resultName → es un paso con nombre: titúlalo con ese nombre.\n- ArrayMap/ArrayFilter/ArrayFind/ArraySlice/Sort/Group → explica en una frase qué hace con los datos (\"recorre los pedidos y se queda con los 3 más recientes\"), y debajo el detalle exacto (array de entrada, variable de iteración, expresión, límites).\n- If/Switch → escribe la condición en lenguaje entendible y, entre backticks, la condición literal.\n- Parallel → di si es concurrente o secuencial (\\x60concurrency: 1\\x60 = secuencial) y por qué importa.\n- AwaitReady → \"espera a que <módulo> esté listo/responda\".\n\n################ CÓMO SE VE UN PASO BIEN DOCUMENTADO ################\nAsí NO (describe el nodo, no el hecho; no dice de dónde sale el valor ni para qué sirve):\n> Se ejecuta un Setter sobre la prop \\x60invoice_list\\x60 del módulo \\x60ewDp8c4XuPQHsmcZkYlwj\\x60 con el valor de \\x60prevResult\\x60. Luego se llama a \\x60natura@OnRI2nG6M_5pIjmcilHty\\x60.\n\nAsí SÍ (dice qué pasa, con qué nombre, de dónde viene el dato, por qué y qué habilita después):\n> **P-07 · Se guarda la lista de facturas en la sesión.** La respuesta de la API de facturación —ya filtrada a las tres más recientes en el paso anterior (\\x60invoices_top3\\x60)— se escribe en el campo \\x60invoice_list\\x60 de la tabla de sesión \\x60current_chat_session_ds\\x60 (\\x60ewDp8c4XuPQHsmcZkYlwj\\x60) mediante \\x60edit\\x60 + \\x60save\\x60. Se guarda aquí, y no se manda directo, porque el componente que arma la respuesta lo lee de esa misma fila para poder reintentar sin volver a llamar a la API. Si la lista llegara vacía, este paso escribe un array vacío y la rama del paso P-09 es la que avisa a la consultora.\n\nY así se documenta la llamada que viene después:\n> **P-08 · Se entrega el control a \\x60replyEndpointHml\\x60.** Se invoca ese componente pasándole \\x60consultantId\\x60 (leído de la sesión) y \\x60invoice_list\\x60 (lo que se acaba de guardar). Es el componente que construye y envía el mensaje de WhatsApp: a partir de aquí el recorrido continúa dentro de él, y lo que devuelva se usa solo para registrar si el envío salió bien.\n\nLa diferencia no es el largo: es que la segunda versión responde las seis preguntas y la primera no responde ninguna.\n\n{{REDACCION}}\n################ REGLAS ABSOLUTAS ################\n1. RESPONDE SOLO CON EL DOCUMENTO EN MARKDOWN. Sin saludo, sin preámbulo, sin envolver todo en un bloque de código, sin comentarios finales.\n2. IGNORA LOS LOGS POR COMPLETO. Los logs solo muestran datos y no son parte de la lógica. Considera log a: {{LOGS}}. No los menciones, no los cuentes como pasos, no los dibujes. Todo lo demás SÍ se documenta.\n3. NO INVENTES, PERO TAMPOCO TE QUEJES. Todo debe estar respaldado por el JSON. Lo que no sea deducible NO se comenta ni se excusa: se deja como un hueco para que el autor lo rellene, con la forma exacta \\x60[[COMPLETAR: qué falta aquí]]\\x60 (ver \"Cómo se escribe\"). Lo que deduzcas con fundamento va como \"Inferido: …\". Los nombres que tú inventes se marcan con \"(alias)\".\n4. LITERALES EXACTOS: textos de mensajes al usuario entre comillas tal cual; paths (\\x60body.message.text\\x60, \\x60prevResult.0.data\\x60, \\x60cursor.current.status\\x60); valores comparados (\\x60\"Not specified\"\\x60, \\x60\"N/A\"\\x60, true/false); números (límites, slices, concurrency); y los reference/ID.\n5. SÉ EXHAUSTIVO. Nada de \"etc.\" ni \"entre otros\". Si un Switch tiene 12 Case, van los 12. Si un Series tiene 9 acciones, van las 9 en orden. Si una lista interactiva tiene 3 filas, van las 3 con su id y título. La completitud manda sobre la brevedad.\n6. TONO: explica primero en una frase clara qué pasa y para qué, y después el detalle técnico. Frases cortas. Nada de jerga innecesaria: en vez de \"se ejecuta un Setter sobre la prop X del módulo Y\" escribe \"se guarda X en la tabla Y (Setter)\". El objetivo es que un analista funcional entienda el flujo y un dev pueda reproducirlo.\n7. ORDEN DE EJECUCIÓN REAL: Series = secuencial; Parallel = concurrente salvo \\x60concurrency\\x60; If = compare y luego then/else; Switch = expression contra cada Case en orden y si ninguno coincide, defaultCase; Step guarda su salida en resultName; \\x60prevResult\\x60 es la salida de la acción inmediatamente anterior.\n8. NODOS DESHABILITADOS: \\x60disabled: true\\x60 no se ejecuta. No lo documentes como flujo activo; agrúpalos al final.\n9. IDIOMA: español técnico y claro. Nombres de componentes, props, funciones y valores en su idioma original y en \\x60código\\x60.\n10. FORMATO: Markdown estándar. Tablas para inventarios, listas numeradas para secuencias, encabezados jerárquicos.\n11. DIAGRAMA OBLIGATORIO en Mermaid (\\x60\\x60\\x60mermaid con flowchart TD) que refleje el funcionamiento ACTUAL ignorando logs. Reglas: ids de nodo alfanuméricos sin espacios (N1, D1, T1…); etiquetas SIEMPRE entre comillas dobles; sin paréntesis, llaves ni comillas sueltas dentro de las etiquetas (usa <br/> para saltos); en las etiquetas usa SIEMPRE los NOMBRES, nunca los IDs (\"Guarda invoice_list en current_chat_session_ds\", no \"Setter en ewDp8…\"); si el elemento tiene nombre en el diccionario, la etiqueta lleva solo ese nombre, sin el ID pegado. Formas: decisiones \\x60D1{\"¿…?\"}\\x60, procesos \\x60N1[\"…\"]\\x60, llamada a otro componente \\x60C1[[\"chatReplyGetInvoice\"]]\\x60 (todo \\x60<tenant>@<ID>\\x60 va con esta forma, jamás con la de API; en la etiqueta va el nombre, no el ID), lectura/escritura de tabla \\x60T1[(\"current_chat_session_ds: escribe invoice_list\")]\\x60, llamada a API \\x60A1[/\"API Get Invoice List\"/]\\x60, mensaje al usuario \\x60M1>\"…\"]\\x60, inicio y fin \\x60E([\"Fin\"])\\x60. Aristas etiquetadas con |Sí| / |No| / |case X|. Usa \\x60subgraph \"Nombre\"\\x60 … \\x60end\\x60 para agrupar sub-flujos. Si el flujo es grande, un diagrama macro y luego uno por sub-flujo, cada uno en su bloque. Después de cada diagrama, la misma lógica como lista numerada textual.\n\n################ ESTRUCTURA OBLIGATORIA DEL DOCUMENTO ################\nSigue esta estructura y numeración. Si una sección no aplica, escribe \"No aplica para este componente\" y explica por qué en una línea.\n\n# {{NOMBRE}} — Documentación técnica\n\n## 0. Ficha del desarrollo\n{{META_TABLE}}\n\n## 1. Resumen\nEmpieza con una sola frase que cualquiera pueda repetir: qué hace este componente y para quién. Después, 1–3 párrafos con el propósito, quién lo invoca, qué recibe, qué devuelve y dónde encaja dentro del proceso mayor al que pertenece. Si el flujo se bifurca en escenarios distintos, enumera los MODOS DE OPERACIÓN y el criterio exacto que activa cada uno. Cierra con una línea \"De un vistazo\": entrada principal → las 3 o 4 etapas grandes → salida, con los nombres reales.\n\n## 2. Perfiles y condiciones de acceso\nPerfiles permitidos si el JSON evalúa roles. Y responde explícitamente: ¿se aplica impersonación?, ¿hay transbordo o transferencia a un agente?, ¿requiere autenticación? (con qué tokens y de qué módulo se leen). Cada respuesta con su evidencia.\n\n## 3. Entradas del componente\nTabla: | Entrada | Path exacto | Tipo inferido | Obligatoria | Para qué se usa | Valores especiales / validaciones |. Incluye \\x60query.*\\x60, \\x60body.*\\x60, \\x60env\\x60, params de Function y variables de iteración (\\x60item\\x60, \\x60index\\x60, \\x60x\\x60, \\x60y\\x60…).\n\n## 4. Datos: tablas, datasets y stores\nLa sección que responde \"¿de dónde salen y a dónde van los datos?\".\nTabla: | Nombre (o alias) | Reference | Tipo | Campos que se LEEN | Campos que se ESCRIBEN (= valor y origen) | Acciones (filter / loadAllPages / edit+save / create…) | En qué punto del flujo |.\nDespués, un párrafo por cada tabla explicando en lenguaje llano su papel: qué guarda, quién la escribe y quién la lee más adelante.\n\n## 5. Integraciones y APIs\nPara cada HttpRequest o \\x60sendRequest\\x60: nombre, reference, qué paso lo dispara, con qué datos se arma la petición (y de dónde sale cada dato), qué se toma de la respuesta y cómo se normaliza. Si varía por país o por entorno, indícalo con el Switch que lo decide.\n\n## 6. Componentes que invoca (reference + entradas)\nAquí va TODO \\x60\"component\"\\x60 con forma \\x60<tenant>@<ID>\\x60 que aparezca en el JSON (los \\x60natura@…\\x60), sin excepción y sin colarlos en la sección de APIs. Una subsección \"### 6.x <nombre visible o alias>\" por cada componente del workspace invocado, con: Reference exacto · Punto(s) del flujo donde se invoca · Tabla | Entrada | Valor / origen | · Qué se hace con su salida. Si se invoca en varios puntos con entradas distintas, documenta cada invocación por separado. Esta sección es la que permite que alguien siga el flujo hacia dentro sin perderse.\n\n## 6.b Cómo se conecta esto con el resto (cadena de causas)\nLa sección que explica el PORQUÉ de cada salto, no solo el qué. Para cada conexión del componente con otra pieza —otro componente del workspace, otra Series o Function, una tabla compartida, una API, un flujo que lo invoca o al que entrega el control— escribe un párrafo corto con esta forma: \"<esta pieza> se conecta con <la otra> porque aquí <lo que se hace o se calcula aquí>, y eso es lo que <la otra> necesita para <lo que hace a continuación>; después ocurre <X> y luego <Y>\". Encadena: di qué produce cada lado, qué dato concreto viaja entre los dos (nómbralo: el \\x60resultName\\x60, el campo de la tabla, el param exacto) y qué pasaría si ese dato no llegara.\nAcompáñalo de una tabla: | Desde (punto de este flujo) | Hacia (pieza / componente / tabla / API) | Qué viaja (dato concreto) | Por qué se necesita allí | Qué ocurre después |.\nIncluye también las conexiones INDIRECTAS por datos compartidos: si aquí se escribe un campo en una tabla que otro flujo lee más tarde, eso es una conexión y hay que decirlo (\"se deja escrito \\x60invoice_list\\x60 para que el flujo que responde al usuario lo encuentre\"). Lo que sepas por el contexto del autor y no esté en el JSON va marcado con \"según el contexto del autor\". Lo que no puedas establecer, dilo: \"no se evidencia quién consume este dato dentro del JSON entregado\".\n\n## 7. Recorrido del flujo, paso a paso\nLa sección que se lee de corrido para entender el flujo sin conocer D2. Pasos numerados P-01, P-02… (entre 10 y 25), en el orden real de ejecución. Cada paso empieza por lo que ocurre, con su nombre real, nunca por el tipo de nodo, y contesta en pocas frases las seis preguntas: qué lo dispara, qué necesita, qué decide, qué cambia, qué produce y quién lo usa después, y qué pasa si falla. Cuando el recorrido llegue a una bifurcación, dilo en el paso y remite a los pasos donde continúa cada rama (\"si no hay pedidos, sigue en P-14\"). Los pasos tienen que encadenarse: el lector no debería preguntarse nunca por qué viene después lo que viene. Ignora los logs.\n\n## 8. Detalle técnico del flujo (Dev)\nLa sección más larga. Organízala en bloques \"### A) …\", \"### B) …\" siguiendo la estructura real del JSON (cada If/Switch/Series/Parallel relevante es un bloque o sub-bloque \"#### A.1)\"), y TITULA CADA BLOQUE CON SU NOMBRE REAL (displayName, resultName o el Case correspondiente). En cada bloque:\n- La condición exacta, primero en palabras y luego literal.\n- Las acciones en orden, numeradas: qué hace, sobre qué objeto (con su nombre), con qué datos y de dónde salen, y qué produce (\\x60prevResult\\x60 o \\x60resultName\\x60).\n- Para mensajes al usuario: tipo (text, interactive list, buttons, document, audio, cta_url), texto literal, filas/botones con id y título, link y filename.\n- Para Rush Response: statusCode y cuerpo devuelto.\n- La razón de diseño cuando se pueda deducir (p. ej. \"se piden 10 pero se muestran 3 para tolerar fallos de PDF\").\n\n## 9. Variables y resultados intermedios\nTabla: | Nombre (resultName / prop / prevResult.path) | Dónde se produce | Qué contiene | Dónde se consume |.\n\n## 10. Mensajes al usuario\nTabla: | # | Punto del flujo | Tipo | Texto literal / estructura | Condición para enviarse |.\n\n## 11. Diagrama de flujo (ignorando logs)\nBloque(s) \\x60\\x60\\x60mermaid según la regla 11 de las reglas absolutas, cada uno seguido de su versión textual numerada.\n\n## 12. Escenarios ejemplificados\nAl menos 2 escenarios concretos (\"Escenario A — El usuario escribe: …\") recorriendo paso a paso qué se ejecuta, qué valores toman las variables y qué recibe el usuario. Cubre el camino feliz y al menos un camino alterno o de error.\n\n## 13. Errores, casos borde y validaciones\nEntradas vacías o \\x60undefined\\x60, listas vacías, fallos de API, tokens ausentes, \\x60defaultCase\\x60 alcanzado… citando el nodo que lo maneja.\n\n## 14. Nodos deshabilitados\nLista de nodos con \\x60disabled: true\\x60 y qué harían si se activaran (o \"Ninguno\").\n\n## 15. Glosario de referencias\nEs la tabla de equivalencias del documento y la única sección donde conviven nombre e ID. Debe permitir que cualquiera busque en D2 algo que leyó en el texto.\nTabla con TODO lo referenciado: | Nombre usado en este documento | ID / reference exacto | Tipo | Origen del nombre (diccionario del equipo / displayName del JSON / alias inferido) | Descripción breve |.\nNo omitas ninguna referencia, ni siquiera las que solo aparecen una vez.\n\n## 18. Huecos por completar\nSIEMPRE va, y SIEMPRE es la última sección del documento. Las secciones 16 (recorrido de una entrada de ejemplo) y 17 (diferencias entre el contexto y el código) solo existen si este mensaje las pide más abajo; cuando existan, van antes de esta y esta conserva el número 18. Recoge, una por una, todas las marcas \\x60[[COMPLETAR: …]]\\x60 que dejaste en el texto.\nTabla: | # | Sección | Qué falta | Por qué hace falta para entender o mantener el flujo | Dónde se consigue (equipo, componente que hay que abrir, persona) |.\nSi no quedó ningún hueco, escribe una sola línea: \"Sin huecos: todo lo documentado está respaldado por el JSON o por el contexto entregado.\"\n\n{{ENTRADA}}\n\n{{INVENTARIO}}\n\n{{NOTACION}}\n\n{{CHEQUEO}}\n################ JSON DEL COMPONENTE A DOCUMENTAR ################\nDocumenta únicamente este componente. Recuerda: primero las cuatro pasadas, después el documento; solo Markdown, por nombres, sin interlocutor, con el hilo del dato visible y sin logs.\n`;\n\n/* Bloque de forma, común a los dos perfiles. Se inserta en {{REDACCION}} */\nconst REDACCION = `################ CÓMO SE ESCRIBE (FORMA DEL ENTREGABLE) ################\nLo que produces es un DOCUMENTO que alguien va a pegar en Confluence y editar, no una conversación ni una respuesta a una persona.\n\n1. SIN INTERLOCUTOR. No te dirijas a nadie y no hables de ti. Nada de \"como puedes ver\", \"te recomiendo\", \"si me das más datos\", \"espero que te sirva\", \"a continuación te explico\", \"no tengo información suficiente\", \"no puedo determinar\", \"el JSON no incluye…\", \"sería necesario revisar…\". Ni saludo, ni cierre, ni ofrecimientos, ni preguntas al lector. Empieza directamente por el título del documento.\n2. SIN META-COMENTARIOS. No expliques cómo analizaste, ni qué te costó, ni qué asumiste \"para poder continuar\". El documento habla del flujo, no del trabajo de documentarlo.\n3. LO QUE FALTA SE DEJA COMO HUECO, NO COMO EXCUSA. Cuando un dato no esté disponible, no lo comentes: deja el espacio para que el autor lo escriba, con esta forma exacta y en la misma frase donde haría falta:\n   \\x60[[COMPLETAR: para qué sirve este componente en el negocio]]\\x60\n   \\x60[[COMPLETAR: quién consume este dato después]]\\x60\n   Se escribe como parte natural de la frase: \"La tabla \\x60current_chat_session_ds\\x60 guarda la sesión de la conversación y se usa para [[COMPLETAR: qué decisión de negocio depende de este campo]].\" Nunca como una disculpa aparte.\n4. LA REGLA DEL HUECO. Un hueco se deja SOLO cuando el dato no está en el material entregado y no es deducible. Si está, se escribe; si es deducible con fundamento, se escribe como \"Inferido: …\". Nunca un hueco para evitar el trabajo de mirar el JSON. Dentro de una tabla el hueco va en la celda, sin romper la fila. Dentro de un bloque Mermaid NUNCA se usa esta marca: allí el nodo se etiqueta \"POR DEFINIR: …\".\n5. FRASES AFIRMATIVAS. Escribe \"el flujo guarda X en la tabla Y\", no \"parece que el flujo guardaría\". La incertidumbre se marca con \"Inferido:\" o con un hueco, no con lenguaje vago repartido por todo el texto.\n6. EL DOCUMENTO SE PEGA Y SE EDITA. Markdown estándar: encabezados, tablas con cabecera, listas numeradas, \\x60código\\x60 para literales, bloques \\x60\\x60\\x60 para JSON y Mermaid. Nada de HTML, ni de emojis, ni de formato que Confluence no sepa pegar.\n7. TODO HUECO SE RECOGE AL FINAL, en la última sección del documento, para que el autor los resuelva de una sentada.\n\n`;\n\n/* Criterio de entendimiento, común a los dos perfiles. Se inserta en {{CRITERIO}} */\nconst CRITERIO = `################ QUÉ SIGNIFICA ENTENDER UN FLUJO (LEE ESTO ANTES DE ESCRIBIR NADA) ################\nUn documento sirve cuando el lector, sin abrir nada más y sin preguntarle a nadie, puede responder estas seis preguntas en CADA punto del recorrido:\n1. QUÉ LO DISPARA: qué tiene que pasar antes para que este paso ocurra (una condición, la llegada de un mensaje, el resultado del paso anterior).\n2. QUÉ NECESITA: qué datos, qué estado previo, qué permisos o qué respuesta de otro sistema hacen falta para que funcione.\n3. QUÉ DECIDE: si hay una bifurcación, la condición exacta y qué pasa por CADA salida, no solo por la que parece la principal.\n4. QUÉ CAMBIA: qué queda escrito, enviado, creado, borrado o notificado. El efecto real sobre el mundo.\n5. QUÉ PRODUCE Y QUIÉN LO USA DESPUÉS: el dato o resultado que deja, con su nombre, y el punto exacto donde se consume.\n6. QUÉ PASA SI FALLA: si el dato no llega, si el servicio no responde, si la condición no se cumple.\nSi al terminar una sección alguna de las seis queda sin respuesta para un paso, esa sección no está terminada: complétala o deja el hueco correspondiente.\n\nEL HILO DEL DATO. Nunca describas un elemento como una isla. Todo lo que aparezca en el documento tiene que estar enganchado al recorrido: de dónde viene, qué lo transforma y adónde va. Un dato se sigue desde que nace hasta que se usa por última vez: \"llega en \\x60body.message.text\\x60 → se limpia y se guarda como \\x60consulta_normalizada\\x60 → con eso se filtra la tabla de pedidos → el resultado alimenta el mensaje que recibe la consultora\". Cuando pierdas el hilo de un dato, no lo abandones: escribe hasta dónde llega y deja el hueco de lo que falta.\n\nLA CADENA DE CAUSAS. Explica siempre el PORQUÉ del enlace, no solo el orden. \"Primero A y luego B\" no dice nada; \"B necesita el identificador que A acaba de calcular, por eso va después\" sí. Cada vez que el recorrido salte a otra pieza, a otra tabla o a otro servicio, la frase debe contener la razón del salto y qué viaja en él.\n\n################ JERARQUÍA DE FUENTES: QUIÉN MANDA CUANDO ALGO NO COINCIDE ################\n| Pregunta | Quién manda | Quién NO decide esto |\n|---|---|---|\n| ¿Qué hace realmente, paso a paso? | El material entregado (el JSON del componente, o la idea escrita) | El contexto del autor, tu intuición, lo que suele hacerse en otros flujos |\n| ¿Cómo se llama cada cosa en el documento? | El diccionario de nombres del equipo, si viene | El \\x60displayName\\x60 del JSON, el inventario automático, cualquier alias tuyo |\n| ¿Para qué existe, a quién le sirve, por qué se hizo así? | El contexto del autor y las notas \"para qué se usa\" del diccionario | El JSON: el código no explica intenciones |\n| ¿Qué entra en el documento y qué no? | Las instrucciones explícitas del autor | Tu criterio de \"esto también sería interesante\" |\n| ¿Qué pasa en un caso que nadie definió? | Nadie: va como hueco para rellenar, o como propuesta marcada | Tú. No inventes la regla |\n\nCUANDO DOS FUENTES CHOCAN, NUNCA LO RESUELVAS EN SILENCIO. Documenta el comportamiento real, y deja constancia de la diferencia en la sección correspondiente, con la evidencia exacta (el nodo, la condición, la frase del autor). Un lector que descubre después que el documento tapó una contradicción deja de confiar en todo lo demás.\n\n################ NIVEL DE DETALLE: QUÉ SE DESARROLLA Y QUÉ SE AGRUPA ################\nLa exhaustividad no es escribir más, es no dejar agujeros. Reparte el esfuerzo así:\n- SIEMPRE con todo el detalle: las decisiones y sus ramas, lo que se escribe o se envía, los datos que cruzan de una pieza a otra, los textos que recibe una persona, y los casos de error.\n- SE PUEDE AGRUPAR cuando algo se repite igual: \"los seis Case de país hacen lo mismo cambiando la URL; se detalla uno y se listan los seis con su valor en una tabla\". Agrupar es legítimo si queda la tabla completa con las diferencias; resumir con \"etc.\" o \"entre otros\" no lo es nunca.\n- NO SE DOCUMENTA: lo que solo imprime o registra información, y lo que está deshabilitado (eso va agrupado al final).\n- Si el material es tan grande que no cabe desarrollarlo entero, prioriza el recorrido principal completo y las ramas con efectos, y di en una línea qué quedó sin desarrollar y por qué, en vez de cortar el documento a la mitad.\n\n################ SI EL MATERIAL LLEGA INCOMPLETO ################\nSi el JSON parece cortado, si una rama referencia algo que no viene, o si la idea se interrumpe: documenta todo lo que sí llegó y marca el punto exacto donde se corta con un hueco (\"[[COMPLETAR: qué sigue después de este paso; el material entregado se corta aquí]]\"). Nunca completes el tramo que falta por analogía con otros flujos.\n\n`;\n\n/* Chequeo final, común a los dos perfiles. Se inserta en {{CHEQUEO}} */\nconst CHEQUEO = `################ REPASO ANTES DE ENTREGAR ################\nAntes de dar el documento por terminado, verifícalo contra esta lista y corrige lo que falle. No escribas el resultado del repaso: solo corrige.\n1. ¿Todas las secciones de la estructura están, en su orden y con su numeración, y las que no aplican lo dicen con su motivo?\n2. ¿Cada paso del recorrido responde a las seis preguntas (qué lo dispara, qué necesita, qué decide, qué cambia, qué produce y quién lo usa, qué pasa si falla)?\n3. ¿Se puede seguir cada dato importante de principio a fin, sin que desaparezca a mitad del documento?\n4. ¿Las bifurcaciones tienen documentadas TODAS sus salidas, incluida la que no pasa nada?\n5. ¿Los nombres del diccionario se usaron en todo el texto y en los diagramas, y los IDs quedaron solo donde está permitido?\n6. ¿Queda alguna frase dirigida al lector, alguna excusa por falta de información o algún comentario sobre tu propio análisis? Elimínala y, si falta un dato, conviértela en hueco.\n7. ¿Cada afirmación está respaldada por el material entregado, marcada como \"Inferido:\" o convertida en hueco?\n8. ¿Los diagramas cumplen la sintaxis pedida (etiquetas entre comillas, sin paréntesis sueltos, sin IDs, sin marcas de hueco) y su versión en lista dice lo mismo que el dibujo?\n9. ¿La última sección recoge TODOS los huecos que quedaron repartidos por el texto?\n10. ¿El documento se puede pegar en Confluence tal cual y empezar a editarlo?\n\n`;\n\n/* Bloque que se inserta en {{CONTEXTO}} cuando el autor escribe contexto */\nconst CONTEXTO_HEAD = `\n################ CONTEXTO DEL AUTOR — LÉELO ANTES QUE NADA ################\nLa persona que pide esta documentación escribió con sus palabras para qué sirve esto, cómo cree que funciona, qué parte le interesa y qué espera del documento. Es información que NO está en el JSON y que te evita suposiciones: úsala para orientar todo el trabajo.\n\nCómo usarla:\n1. PROPÓSITO Y UTILIDAD. El contexto manda sobre el \"para qué sirve\", el nombre del caso de uso, quién lo usa, qué problema resuelve y qué partes importan o son irrelevantes. Intégralo en el Resumen y en la narración con tus palabras; no lo copies literal como si fuera un análisis tuyo.\n2. EL JSON MANDA SOBRE LO QUE EL CÓDIGO HACE. El contexto explica la intención; el JSON es la verdad sobre el comportamiento. Si el contexto dice que algo funciona de una forma y el JSON muestra otra, documenta lo que hace el JSON y añade al final la sección \"## 17. Diferencias entre el contexto y el código\" con tres columnas: qué dice el contexto, qué hace realmente el código y la evidencia exacta (nodo, condición o path). No corrijas el contexto en silencio ni des por hecho que el JSON está mal.\n3. ALCANCE. Si el contexto pide documentar solo una parte, un tramo o un caso concreto, acota el documento a eso: dilo en el Resumen con la frase \"Alcance acotado por petición del autor: …\", desarrolla esa parte con todo el detalle, y resuelve el resto en un párrafo de contexto sin desarrollarlo. No documentes de más.\n4. SIMULACIONES Y SUPUESTOS. Si el contexto pide simular un escenario, probar un caso hipotético o razonar un \"qué pasaría si\", hazlo en una sección propia titulada como simulación, listando los supuestos al principio y marcando en cada afirmación si es un hecho del JSON o una hipótesis.\n5. RELACIONES ENTRE PIEZAS. Usa el contexto para explicar cómo se conecta esto con otros componentes, tablas o flujos, incluso si no vienen en el JSON: \"aquí se llama a X porque más adelante Y necesita Z\". Cuando esa conexión salga del contexto y no del JSON, márcala con \"según el contexto del autor\".\n6. VOCABULARIO. Adopta los términos de negocio que use el contexto —nombres de casos de uso, de equipos, de procesos, de estados— en lugar de inventar los tuyos.\n7. INSTRUCCIONES EXPLÍCITAS. Si el contexto pide omitir, añadir o reordenar algo del formato, respétalo y deja constancia en una línea de por qué esa sección falta o cambia.\n\n8. SI NO HAY CÓDIGO QUE CONTRASTAR (el material entregado es una idea, un requerimiento o un texto, no un componente), las reglas 2 y 3 se aplican igual sobre ese material: el contexto lo amplía y lo aclara, pero no sustituye lo que el autor ya escribió como idea.\n\nCONTEXTO ESCRITO POR EL AUTOR:\n`;\n\n/* Bloque que se inserta en {{MULTI}} cuando el flujo está repartido en varias piezas */\nconst MULTI_HEAD = `\n################ VARIOS COMPONENTES, UN SOLO FLUJO ################\nEste flujo NO vive en un único componente: está repartido en varias piezas que te entrego por separado, al final de este mensaje. Son partes del MISMO recorrido, no desarrollos independientes.\n\n{{PIEZAS}}\nCómo tratarlas:\n1. Produce UN SOLO documento con la estructura de secciones indicada, cuyo sujeto es la PIEZA PRINCIPAL. No generes un documento por pieza, ni un anexo por pieza, ni repitas la estructura.\n2. Las piezas secundarias NO se documentan por separado: se documentan EN EL PUNTO DEL FLUJO donde son invocadas. Cuando el recorrido llegue a esa llamada, sigue explicando hacia dentro con el contenido de esa pieza y luego continúa el hilo principal.\n3. MANTÉN VISIBLE LA SEPARACIÓN REAL. Cada vez que el recorrido cruza de una pieza a otra, dilo de forma explícita y en su propia línea, por ejemplo: \"➜ Aquí termina <pieza A> y el flujo continúa dentro de <pieza B>, que es un componente aparte en D2.\" El lector tiene que saber en todo momento en qué componente está parado y qué tendría que abrir para verlo.\n4. En la sección 1 (Resumen), di en cuántos componentes está repartido el flujo y cuál cubre cada tramo.\n5. Añade justo después del resumen una sección \"## 1.b Mapa de piezas\" con la tabla: | # | Pieza | Reference / ID | Papel en el flujo | Quién la invoca y desde qué punto | Qué tramo del flujo cubre |.\n6. En los diagramas usa un \\x60subgraph \"<nombre de la pieza>\"\\x60 … \\x60end\\x60 por cada componente, de modo que se vea dónde vive cada tramo, PERO con las flechas cruzando entre subgraphs: es un flujo continuo, no diagramas sueltos. Etiqueta la arista que cruza con el nombre del componente destino.\n7. Las secciones 4 (datos y tablas), 5 (APIs) y 6 (componentes invocados) son CONJUNTAS para todas las piezas y llevan una columna extra \"Pieza\" que indica en cuál ocurre cada cosa. Si dos piezas usan la misma tabla, es UNA fila con las dos piezas indicadas: no dupliques.\n8. Si una pieza secundaria no es invocada por ninguna de las otras piezas entregadas, dilo en el mapa de piezas con la nota \"no se encontró quién la invoca dentro de las piezas entregadas\" en vez de inventar la conexión.\n9. Aclaración sobre la instrucción final de este mensaje: cuando dice \"documenta únicamente este componente\" se refiere al CONJUNTO de piezas entregadas, que forman un solo flujo. No documentes nada que no venga en ellas.\n\n`;\n\n/* Bloque que se inserta en {{DICCIONARIO}} cuando el usuario define nombres propios */\nconst DICCIONARIO_HEAD = `\n################ DICCIONARIO DE NOMBRES (OBLIGATORIO) ################\nEl equipo definió cómo se debe llamar cada elemento en esta documentación. Estos nombres MANDAN sobre cualquier displayName del JSON, sobre el inventario automático y sobre cualquier alias que se te ocurra.\n\nCómo se usan, sin excepción:\n1. EL NOMBRE SUSTITUYE AL ID POR COMPLETO. En todo el texto, en los títulos de bloque, en las celdas de las tablas, en las listas de pasos y en las etiquetas del diagrama escribe ÚNICAMENTE el nombre. No pongas el ID al lado, ni entre paréntesis, ni \"solo la primera vez\". El lector no debería tener que leer un ID en ninguna frase.\n2. El ID aparece en DOS sitios y solo en esos dos: (a) la columna \"Reference / ID\" de las tablas de las secciones 4, 5 y 6, que existe precisamente para poder buscar el elemento en D2; y (b) la sección 15, el glosario, que es la tabla de equivalencias completa. Ahí el ID es obligatorio.\n3. En los diagramas Mermaid, las etiquetas llevan solo el nombre. Nunca escribas \\x60natura@ID\\x60 ni \\x60nombre · natura@ID\\x60 dentro de un nodo.\n4. Si un ID del diccionario no aparece en el JSON, indícalo en la sección 15 con la nota \"declarado en el diccionario pero no encontrado en el JSON\".\n5. Para lo que NO esté en el diccionario sigue aplicando la regla general: nombre deducido del JSON y el ID entre paréntesis la primera vez.\n6. LA COLUMNA \"PARA QUÉ SE USA / NOTAS\" ES CONTEXTO DE PRIMERA MANO, NO DECORACIÓN. La escribió el equipo que construyó esto y contiene lo que el JSON no puede decir: para qué sirve el elemento en el negocio, quién lo usa, con qué otro flujo se comparte, si está deprecado, si es temporal, si tiene una trampa conocida. Úsala así:\n   - Intégrala en la prosa donde el elemento aparece por primera vez, con tus palabras: \"la tabla de sesión \\x60current_chat_session_ds\\x60, que guarda la conversación viva de la consultora y también la lee el flujo de pedidos\".\n   - Llévala como columna propia, \"Para qué se usa\", a las tablas de las secciones 4, 5 y 6, y también al glosario.\n   - Si la nota dice que algo está DEPRECADO, en desuso, congelado o pendiente de reemplazo, dilo cada vez que ese elemento aparezca en el recorrido, en su propia frase y sin suavizarlo: \"este paso sigue en el flujo pero el equipo lo marca como deprecado: …\". Si además el JSON muestra que ya no se ejecuta, dilo también.\n   - Si la nota contradice lo que hace el código, manda el código para el comportamiento y la nota para la intención, y recoge la diferencia como en la regla del contexto del autor.\n   - Si un elemento del diccionario no trae nota, no inventes su propósito: déjalo como \\x60[[COMPLETAR: para qué se usa <nombre>]]\\x60.\n\n`;\n\n/* Bloque que se inserta en {{ENTRADA}} cuando se activa la entrada de ejemplo */\nconst ENTRADA_HEAD = `\n################ ENTRADA DE EJEMPLO A EVALUAR ################\nJunto al componente recibes un objeto de ENTRADA real. Además de las 15 secciones anteriores, añade AL FINAL del documento esta sección, y trabájala con el mismo nivel de detalle que el resto:\n\n## 16. Recorrido de esta entrada por el flujo\nMicro-análisis que responde: si esta entrada llega al componente, ¿por dónde pasa exactamente?\n\n### 16.1 Punto de entrada y mapeo de campos\nTabla: | Campo de la entrada | Valor | Path con el que lo lee el flujo | Dónde se usa por primera vez |. Añade dos listas cortas: campos de la entrada que el flujo NO usa, y campos que el flujo espera pero NO vienen en la entrada (y qué hace el flujo ante esa ausencia: valor por defecto, defaultCase, error).\n\n### 16.2 Evaluación de condiciones, en orden\nTabla en el ORDEN REAL de ejecución: | # | Bloque / nodo (por su nombre) | Condición | Valores concretos con esta entrada | Resultado | Rama que se toma |. Sustituye cada referencia por el valor real que tomaría; si un valor depende de algo que no está en la entrada (el estado de una tabla, la respuesta de una API), escríbelo como \"depende de <fuente>\" y razona las alternativas.\n\n### 16.3 Camino recorrido\nSecuencia numerada de los pasos que se ejecutarían, del inicio al fin, llamándolos por su nombre. Marca claramente dónde el camino se separa del resto de ramas.\n\n### 16.4 Efectos de esta ejecución\nQué se escribiría en cada tabla (campo = valor ya resuelto), qué APIs se llamarían y con qué parámetros concretos, qué componentes se invocarían y con qué entradas concretas.\n\n### 16.5 Salida\nQué recibiría el usuario o qué devolvería el componente, con los textos y valores ya resueltos, tal cual los vería.\n\n### 16.6 Puntos de riesgo con esta entrada\nDónde podría fallar o quedar ambiguo este recorrido concreto y por qué.\n\n### 16.7 Diagrama del camino\nUn \\x60\\x60\\x60mermaid flowchart TD solo con el camino que sigue esta entrada. Usa \\x60==>\\x60 (flecha gruesa) para el camino tomado y \\x60-->\\x60 para las ramas que quedan sin tomar, e incluye únicamente los nodos relevantes. Añade el valor decisivo en la etiqueta de cada arista, p. ej. \\x60|orderNumber = 12345|\\x60.\n\nSi la entrada no permite decidir alguna rama, dilo explícitamente en vez de inventar un resultado.\n\nENTRADA DE EJEMPLO:\n`;\n\nconst NOTACION_COMPACTA = `################ NOTACIÓN DEL JSON (formato compactado) ################\nPara reducir tamaño, el JSON de D2 fue compactado sin pérdida semántica con esta notación:\n- Un nodo se representa como objeto con la clave \"$\" = tipo de componente (\"flow.Series\" = data2-core-flow@Series, \"functions.ArrayMap\", \"types.Regex\", \"connect.HttpRequest\"…). Los componentes del workspace conservan su ID completo (p. ej. \"natura@12EoIxK-_4qX1z_jgJked\"). El resto de claves son sus params. \"name\" = displayName. \"disabled\": true = nodo deshabilitado. \"reference\" en un HttpRequest = ID del HttpRequest del workspace.\n- Los primitivos aparecen como valores JSON literales; \"__undefined__\" es el primitivo Undefined.\n- \"$ref(path)\" = Reference a un path del contexto (p. ej. \"$ref(body.message.text)\", \"$ref(item.fileUrl)\").\n- \"$get(ID).prop\" = lectura de la prop \"prop\" del módulo ID.\n- { \"$set\": \"ID.prop\", \"value\": … } = escritura de esa prop.\n- { \"$interaction\": \"ID.accion\", \"args\": … } = invocación de una acción del módulo ID (edit, save, filter, loadAllPages, sendRequest, uploadFromFiles…).\n- \"$module(ID)\", \"$instance(ID)\", \"$file(ID)\" = referencias a módulo, instancia y archivo.\n- Los nodos de log ya fueron eliminados.\n`;\n\n/* ============================================================\n   1b) PROMPT DEL PERFIL ANALISTA\n   La entrada no es un componente: es una idea, un requerimiento o una\n   necesidad escrita en palabras. La salida es una propuesta funcional\n   organizada + el ticket listo para pegar en Jira.\n   Placeholders: {{NOMBRE}} {{META_TABLE}} {{REDACCION}} {{CONTEXTO}}\n                 {{DICCIONARIO}} {{ENTRADA}}\n   ============================================================ */\nconst ANALISTA_PROMPT = `Eres un Analista Funcional senior. Recibirás, escrita en palabras sueltas y probablemente desordenadas, la IDEA de un caso de uso, un servicio, una automatización o una mejora. Puede venir en párrafos, en frases cortas, en notas de una reunión o en una lista a medio hacer. Tu tarea es convertir esa idea en una PROPUESTA FUNCIONAL COMPLETA Y ORGANIZADA en Markdown: el documento que el equipo lee para entender qué se va a construir, y del que sale el ticket de desarrollo.\n\nNo eres el dueño de la idea: eres quien la ordena, la completa hasta donde da el material, la lleva a pasos concretos y deja señalado —como espacios para rellenar— todo lo que falta por decidir.\n\nCaso de uso / servicio: {{NOMBRE}}\n{{CONTEXTO}}{{DICCIONARIO}}\n{{CRITERIO}}\n################ CÓMO LEER LA IDEA ANTES DE ESCRIBIR (CUATRO PASADAS) ################\nLa idea viene como la gente piensa: en desorden, mezclando lo que pasa hoy con lo que se quiere que pase, con cosas dichas a medias y otras dadas por obvias. Tu primer trabajo no es redactar, es destilarla. Haz estas cuatro pasadas antes de escribir la primera sección:\n\nPASADA 1 — SEPARAR LO QUE DIJO. Clasifica cada frase de la idea en una de estas cinco cajas, sin descartar ninguna:\n- HECHO: cómo funcionan las cosas hoy (\"los pedidos están en el sistema de pedidos\").\n- DESEO: lo que se quiere lograr (\"que responda solo con los últimos 3 meses\").\n- SUPUESTO: algo que el autor da por cierto sin confirmarlo (\"no sé si por API o por la tabla que ya usamos\").\n- RESTRICCIÓN: límites de tiempo, alcance, presupuesto, sistemas que no se pueden tocar.\n- DUDA: lo que el propio autor deja abierto.\nLos HECHOS y los DESEOS se documentan como tales; los SUPUESTOS van marcados como supuestos en la sección 6; las DUDAS van a huecos o a la sección de decisiones pendientes. Ninguna frase de la idea puede quedarse fuera del documento.\n\nPASADA 2 — DESCUBRIR LO QUE NO DIJO. Casi nadie escribe los actores, los estados ni los errores. Búscalos: ¿quién dispara esto y quién lo recibe? ¿qué tiene que ser verdad antes de empezar? ¿de dónde sale cada dato que la idea menciona de pasada? ¿qué pasa cuando no hay datos, cuando la persona no existe, cuando el sistema del que se depende no responde, cuando alguien lo pide dos veces, cuando abandona a mitad? Cada respuesta que la idea no da se convierte en hueco o en propuesta marcada, nunca en un invento silencioso.\n\nPASADA 3 — PONER EL RECORRIDO EN ORDEN. Ordena los deseos en una secuencia que se pueda ejecutar: primero esto, porque hace falta para aquello. Ahí aparecen los pasos que el autor se saltó (la validación que nadie mencionó, el dato que hay que buscar antes de poder responder). Añádelos explícitamente y marca los que sean propuesta tuya.\n\nPASADA 4 — HACERLO VERIFICABLE. Para cada paso pregúntate cómo se comprobaría que funciona. Lo que no se pueda comprobar todavía no está bien definido: o se concreta, o se convierte en hueco. De esta pasada salen los criterios de aceptación.\n\n################ PALABRAS QUE NO SE PUEDEN DEJAR PASAR ################\nLas ideas están llenas de palabras que parecen claras y no lo son. Cada vez que aparezca una, conviértela en algo concreto o deja el hueco; nunca la repitas tal cual como si fuera una especificación:\n| Lo que dice la idea | Lo que hay que concretar |\n|---|---|\n| \"que avise\", \"que notifique\" | Quién avisa, a quién, por qué canal, con qué texto, en qué momento y qué pasa si el aviso falla |\n| \"rápido\", \"en tiempo real\", \"al instante\" | Cuánto tiempo es aceptable y qué se hace si se pasa |\n| \"automático\" | Qué lo dispara exactamente: un horario, un evento, una acción de una persona |\n| \"los últimos\", \"los más recientes\", \"los relevantes\" | Cuántos, con qué criterio de orden y desde qué fecha |\n| \"si no tiene nada\", \"si falla\" | Qué se muestra, qué se registra y si el proceso continúa o se detiene |\n| \"el sistema\", \"la plataforma\", \"la base\" | Qué sistema concreto, quién lo administra y cómo se accede |\n| \"que valide\", \"que revise\" | Qué regla exacta se aplica y qué ocurre con lo que no la cumple |\n| \"para todos\", \"cualquier usuario\" | Qué perfiles, con qué permisos, y si hay excepciones |\n\n{{REDACCION}}\n################ REGLAS DE ESTE PERFIL ################\n1. LA IDEA MANDA SOBRE EL FORMATO. Todo lo que el autor escribió tiene que aparecer en el documento, ordenado y desarrollado. No descartes una frase por parecer menor: llévala a la sección donde corresponda.\n2. NO INVENTES REGLAS DE NEGOCIO. Si la idea no dice qué pasa en un caso, no te lo imagines como si fuera un hecho. Tienes dos herramientas y solo dos: (a) el hueco \\x60[[COMPLETAR: …]]\\x60 cuando hace falta una decisión del negocio; (b) una PROPUESTA marcada, con la forma \"Propuesta: <lo que sugieres> — confirmar\", cuando existe una salida razonable y estándar que el autor puede aceptar o cambiar de un vistazo. Nunca mezcles las dos: o es un hueco o es una propuesta marcada.\n3. TODO SE VUELVE CONCRETO. Traduce lo abstracto a pasos, actores, datos y pantallas. \"Que el sistema avise al cliente\" se convierte en quién avisa, por qué canal, con qué texto, en qué momento y qué pasa si el aviso falla. Si alguno de esos cuatro no está en la idea, ahí va un hueco o una propuesta marcada.\n4. LOS CAMINOS QUE FALLAN VALEN TANTO COMO EL QUE FUNCIONA. Por cada paso del flujo principal pregúntate qué puede salir mal: dato que no llega, cliente que no existe, servicio caído, permiso que falta, usuario que abandona, respuesta duplicada, tiempo que se agota. Cada uno se documenta con qué lo dispara, qué hace el sistema, qué ve la persona y cómo se recupera.\n5. LENGUAJE DE NEGOCIO. Escribe para alguien que entiende el proceso pero no la implementación. Nada de jerga técnica salvo que la idea la traiga: nada de Series, Getter, prevResult ni nombres de componentes internos si el autor no los mencionó.\n6. SI LA IDEA VIENE CON MATERIAL TÉCNICO (un JSON pegado, un endpoint, el nombre de una tabla o de un componente que ya existe), úsalo como evidencia de lo que ya está construido y dilo en la sección de dependencias: \"ya existe <X>, se reutiliza para <Y>\".\n7. NUMERACIÓN ESTABLE. Los pasos del flujo van P-01, P-02…; las reglas de negocio RN-01, RN-02…; los criterios de aceptación CA-01, CA-02…; los escenarios E-01… Así el equipo puede referirse a ellos en la conversación y en el ticket.\n8. NO CONVIERTAS LA IDEA EN UNA SOLUCIÓN TÉCNICA. El documento describe QUÉ tiene que pasar y por qué, no cómo se implementa. Nada de tablas, endpoints, estructuras de datos o componentes inventados por ti: si la idea nombra un sistema, se nombra; si no, se habla del dato y de dónde sale, y la decisión técnica queda para el desarrollo. La excepción es lo que el autor ya haya decidido: eso se recoge tal cual en dependencias.\n9. TRAZABILIDAD CON LA IDEA. Todo lo que afirmes tiene que poder rastrearse hasta una frase del autor, hasta el contexto, o estar marcado como propuesta o como hueco. Si al releer una afirmación no puedes decir de dónde salió, sobra.\n10. DIAGRAMA OBLIGATORIO en Mermaid (\\x60\\x60\\x60mermaid con flowchart TD) que muestre el camino exitoso Y las ramas que fallan. Reglas: ids alfanuméricos sin espacios; etiquetas SIEMPRE entre comillas dobles; sin paréntesis ni comillas sueltas dentro de las etiquetas (usa <br/> para saltos); decisiones \\x60D1{\"¿…?\"}\\x60; pasos \\x60N1[\"…\"]\\x60; sistema o servicio externo \\x60A1[/\"…\"/]\\x60; dato que se guarda \\x60T1[(\"…\")]\\x60; mensaje o notificación a una persona \\x60M1>\"…\"]\\x60; inicio y fin \\x60E([\"Fin\"])\\x60. Aristas etiquetadas con |Sí| / |No| / |error|. Agrupa con \\x60subgraph \"Nombre\"\\x60 … \\x60end\\x60 cuando el flujo tenga fases claras. Después del diagrama, la misma lógica como lista numerada.\n\n################ ESTRUCTURA OBLIGATORIA DEL DOCUMENTO ################\nSigue esta estructura y numeración. Si una sección no aplica, escribe \"No aplica\" y una línea con el motivo.\n\n# {{NOMBRE}} — Propuesta funcional\n\n## 0. Ficha\n{{META_TABLE}}\n\n## 1. En una frase\nQué se quiere lograr, en una sola frase que cualquiera pueda repetir sin haber estado en la reunión. Debajo, dos o tres líneas con el alcance general y una línea \"De un vistazo\": quién lo dispara → las 3 o 4 etapas grandes → qué recibe al final la persona.\n\n## 2. Problema y situación actual\nQué duele hoy, cómo se resuelve actualmente (manual, con otra herramienta, o no se resuelve), a quién le cuesta y qué pasa si no se hace nada.\n\n## 3. Objetivo y cómo se sabrá que funcionó\nEl objetivo en términos de resultado, no de solución. Y una tabla: | Indicador | Cómo se mide | Valor hoy | Valor esperado |. Lo que no esté en la idea va como hueco.\n\n## 4. Alcance\nDos listas explícitas: \"Entra en este desarrollo\" y \"NO entra (queda para después)\". Esta sección es la que evita discusiones a mitad del sprint: si la idea no delimita algo, proponlo marcado como propuesta.\n\n## 5. Actores y sistemas\nTabla: | Actor o sistema | Papel en el flujo | Qué aporta | Qué recibe | Quién lo administra |. Incluye personas (consultora, analista, agente), sistemas propios, servicios externos y cualquier componente ya existente que se vaya a reutilizar.\n\n## 6. Precondiciones y supuestos\nQué tiene que ser verdad antes de que el flujo arranque (datos cargados, usuario autenticado, permisos, integración disponible). Después, una tabla con los supuestos: | # | Supuesto | De dónde sale (frase del autor, contexto, o propuesta tuya) | Qué se rompe si resulta falso | Quién puede confirmarlo |. Aquí van todas las frases que el autor dio por ciertas sin confirmarlas.\n\n## 7. Flujo principal (camino exitoso)\nPasos numerados P-01, P-02… Cada paso empieza con una frase de negocio clara —lo que ocurre, no cómo se hace— y debajo lleva una viñeta con: actor que lo ejecuta · sistema donde ocurre · qué necesita para poder pasar · dato que entra · dato que sale · qué ve la persona · qué habilita del paso siguiente. Sin saltos: si entre dos pasos hay una espera, una validación, una búsqueda de datos o una decisión, eso es un paso propio. Los pasos se encadenan por necesidad, no por orden de escritura: si el lector puede preguntarse \"¿y por qué esto va después?\", la respuesta falta en el paso anterior. Donde el recorrido se bifurque, dilo y remite al código del camino alterno correspondiente (\"si no hay pedidos, sigue en el camino de error CE-02\").\n\n## 8. Flujos alternos y caminos de error\nCódigos CE-01, CE-02… Primero la tabla resumen: | Código | Qué lo dispara | En qué paso del flujo principal ocurre | Qué hace el sistema | Qué ve la persona | Cómo se recupera |.\nDespués, una subsección por cada uno con el detalle. Cubre como mínimo: datos faltantes o inválidos, la persona no existe o no tiene permisos, el servicio del que se depende no responde, la operación ya se había hecho antes (duplicados), y el abandono a mitad del proceso.\n\n## 9. Reglas de negocio\nLista RN-01, RN-02… Cada regla en una frase verificable, con su excepción si la tiene. Las que el autor no definió van como hueco o como propuesta marcada.\n\n## 10. Datos que se necesitan\nTabla: | Dato | De dónde sale | Obligatorio | Formato o validación | Dónde queda guardado | Quién lo consume después |.\n\n## 11. Integraciones y dependencias\nSistemas, APIs, componentes ya construidos, accesos y permisos que hacen falta, y de quién depende cada uno. Marca cuáles ya existen y cuáles hay que construir o solicitar.\n\n## 12. Diagrama de flujo\nBloque \\x60\\x60\\x60mermaid según la regla 10 de este perfil, con el camino exitoso y las ramas de error, seguido de su versión en lista numerada.\n\n## 13. Simulación de escenarios\nAl menos DOS escenarios exitosos y DOS no exitosos, cada uno con código E-01, E-02… Formato de cada uno: los datos de partida concretos (nombres, valores, montos de ejemplo), el recorrido paso a paso citando P-01, P-02…, qué queda registrado y qué recibe exactamente la persona al final. En los no exitosos, además, en qué paso se corta y qué se le dice al usuario.\n\n## 14. Criterios de aceptación\nLista CA-01, CA-02… en formato Dado / Cuando / Entonces, verificables por alguien que no participó en la conversación. Cubre el camino exitoso, cada camino de error de la sección 8 y cada regla de negocio de la 9.\n\n## 15. Riesgos, decisiones pendientes y preguntas abiertas\nTabla: | # | Tema | Por qué importa | Impacto si no se resuelve | Quién decide |. Aquí van las preguntas que hay que llevar a la reunión.\n\n## 16. Entregables y fases\nCómo se puede partir el desarrollo en entregas que aporten valor por separado. Sin estimar tiempos salvo que la idea los traiga: si no, hueco.\n\n## 17. Ticket listo para pegar en Jira\nUn bloque autocontenido, pensado para copiar y pegar, con: **Título** (una línea accionable) · **Tipo** (historia, tarea o spike) · **Descripción** (el \"como <rol> quiero <algo> para <beneficio>\" más dos párrafos de contexto) · **Alcance** (lo que entra y lo que no, resumido de la sección 4) · **Criterios de aceptación** (los CA de la sección 14, copiados) · **Definición de hecho** (qué tiene que estar probado, documentado y desplegado) · **Dependencias** · **Enlaces y adjuntos** con huecos para los que el autor debe pegar.\n\n## 18. Glosario de términos\nTabla: | Término usado en este documento | Qué significa aquí | Equivalente técnico si se conoce | Para qué se usa |. Incluye los términos del diccionario entregado y los que aparezcan en la idea.\n\n## 19. Huecos por completar\nSIEMPRE la última sección. Recoge una por una todas las marcas \\x60[[COMPLETAR: …]]\\x60 y todas las \"Propuesta: … — confirmar\" del documento.\nTabla: | # | Sección | Qué falta o qué hay que confirmar | Por qué bloquea o afecta al desarrollo | Quién lo sabe / quién decide |.\n{{ENTRADA}}\n{{CHEQUEO}}\n################ CÓMO SE VE UNA IDEA BIEN CONVERTIDA ################\nLa idea dice: *\"que cuando pregunten por el pedido les responda con los últimos, y si no tiene nada que hable con un asesor\"*.\n\nAsí NO (repite las palabras vagas y no decide nada):\n> El sistema responderá automáticamente con los pedidos recientes del cliente. Si no tiene pedidos, se le ofrecerá contactar con un asesor.\n\nAsí SÍ (concreta, encadena, marca lo que falta y lo que propone):\n> **P-04 · Se buscan los pedidos de la consultora.** Con el identificador obtenido en P-02, se consultan sus pedidos en el sistema de pedidos. La idea pide \"los últimos\": *Propuesta: los pedidos de los últimos 3 meses, ordenados del más reciente al más antiguo, máximo 5 — confirmar*. Hace falta que la consultora esté identificada (P-02) y que el sistema de pedidos responda; si no responde, el recorrido sigue en CE-03.\n> **P-05 · Se decide qué responder.** Si la búsqueda devolvió al menos un pedido, sigue en P-06 con la lista; si devolvió cero, sigue en CE-01, que es el caso de \"no tiene nada\" que menciona la idea. El criterio para considerar un pedido vigente es [[COMPLETAR: ¿un pedido cancelado o devuelto cuenta como pedido para esta respuesta?]].\n\nLa segunda versión no es más larga por adorno: cada frase añade una decisión, una condición o una pregunta que alguien tiene que responder antes de construir.\n\n################ IDEA A CONVERTIR EN PROPUESTA ################\nTrabaja únicamente sobre lo que sigue. Recuerda: primero las cuatro pasadas, después el documento; solo Markdown, sin interlocutor, sin palabras vagas sin concretar, huecos y propuestas marcadas en vez de inventos, y los caminos de error con el mismo detalle que el exitoso.\n`;\n\n/* Bloque {{ENTRADA}} del perfil analista: un caso real que el autor quiere ver simulado */\nconst ENTRADA_ANA_HEAD = `\n################ CASO CONCRETO QUE EL AUTOR QUIERE VER SIMULADO ################\nEl autor entregó un caso de ejemplo. Además de los escenarios de la sección 13, desarróllalo como el PRIMER escenario de esa sección (E-01), con sus datos exactos: qué pasa con esos valores concretos, paso a paso, qué decisiones se toman con ellos, qué queda registrado y qué recibe la persona al final. Si el caso entregado no alcanza para recorrer todo el flujo, di qué dato falta con un hueco y sigue con el resto.\n\nCASO ENTREGADO:\n`;\n\n/* ============================================================\n   2) COMPACTADOR DE JSON D2 (sin pérdida de referencias)\n   ============================================================ */\nfunction makeCompactor(opts){\n  const logComponents=new Set((opts.logComponents||[]).map(s=>s.trim()).filter(Boolean));\n  const logModules=new Set((opts.logModules||[]).map(s=>s.trim()).filter(Boolean));\n  const dropDisabled=!!opts.dropDisabled;\n  const stats={nodes:0,logsRemoved:0,disabledRemoved:0};\n  const PRIM={'data2-core-primitives@String':1,'data2-core-primitives@Number':1,'data2-core-primitives@Boolean':1,'data2-core-primitives@Null':1,'data2-core-primitives@Undefined':1};\n  const SKIP=Symbol('skip');\n  const shortName=c=>{const m=typeof c==='string'&&c.match(/^data2-core-([a-z-]+)@(.+)$/);return m?m[1]+'.'+m[2]:String(c);};\n  function refId(node){\n    if(node==null)return null;\n    if(typeof node==='string')return node;\n    if(typeof node==='object'&&node.component&&node.params&&node.params.reference!==undefined){const r=node.params.reference;return typeof r==='string'?r:conv(r);}\n    return conv(node);\n  }\n  function isLog(n){\n    const c=n.component;\n    if(logComponents.has(c))return true;\n    if((c==='data2-core-types@Interaction'||c==='data2-core-types@Getter')&&n.params&&n.params.module){const id=refId(n.params.module);if(typeof id==='string'&&logModules.has(id))return true;}\n    return false;\n  }\n  function conv(v){\n    if(Array.isArray(v)){const out=[];for(const x of v){const r=conv(x);if(r!==SKIP)out.push(r);}return out;}\n    if(v===null||typeof v!=='object')return v;\n    if(typeof v.component==='string')return convNode(v);\n    const out={};for(const k of Object.keys(v)){const r=conv(v[k]);if(r!==SKIP)out[k]=r;}return out;\n  }\n  function convNode(n){\n    stats.nodes++;\n    const c=n.component,p=n.params||{};\n    if(isLog(n)){stats.logsRemoved++;return SKIP;}\n    if(n.disabled===true&&dropDisabled){stats.disabledRemoved++;return SKIP;}\n    if(PRIM[c]){\n      if(c==='data2-core-primitives@Null')return null;\n      if(c==='data2-core-primitives@Undefined')return '__undefined__';\n      return p.content===undefined?null:conv(p.content);\n    }\n    let out;\n    switch(c){\n      case 'data2-core-types@Reference':{const r=p.reference;out='$ref('+(typeof r==='string'?r:JSON.stringify(conv(r)))+')';break;}\n      case 'data2-core-types@InteractiveModuleReference':out='$module('+refId(n)+')';break;\n      case 'data2-core-types@InstanceReference':out='$instance('+refId(n)+')';break;\n      case 'data2-core-types@FileComponentReference':out='$file('+refId(n)+')';break;\n      case 'data2-core-types@Getter':{const mod=refId(p.module),prop=conv(p.prop);out='$get('+mod+').'+(typeof prop==='string'?prop:JSON.stringify(prop));break;}\n      case 'data2-core-types@Setter':{const mod=refId(p.module),prop=conv(p.prop);out={'$set':mod+'.'+(typeof prop==='string'?prop:JSON.stringify(prop)),value:conv(p.value)};break;}\n      case 'data2-core-types@Interaction':{const mod=refId(p.module),prop=conv(p.prop);out={'$interaction':mod+'.'+(typeof prop==='string'?prop:JSON.stringify(prop))};if(p.args!==undefined)out.args=conv(p.args);break;}\n      default:{out={'$':shortName(c)};if(n.reference!==undefined)out.reference=n.reference;for(const k of Object.keys(p)){const r=conv(p[k]);if(r!==SKIP)out[k]=r;}}\n    }\n    if(typeof out==='object'&&out!==null&&!Array.isArray(out)){\n      if(n.displayName)out.name=n.displayName;\n      if(n.disabled===true)out.disabled=true;\n    }else if(n.disabled===true||n.displayName){\n      out=Object.assign({value:out},n.displayName?{name:n.displayName}:{},n.disabled?{disabled:true}:{});\n    }\n    return out;\n  }\n  function unwrap(root){\n    if(Array.isArray(root)&&root.length&&root[0]&&root[0].type==='prop'&&root[0].value)return root.length===1?root[0].value:root.map(x=>x.value);\n    if(root&&root.type==='prop'&&root.value)return root.value;\n    return root;\n  }\n  return {compact(root){stats.nodes=0;stats.logsRemoved=0;stats.disabledRemoved=0;const r=conv(unwrap(root));return {result:r===SKIP?null:r,stats:Object.assign({},stats)};},unwrap};\n}\n\n/* ============================================================\n   3) RENDER MARKDOWN (sin dependencias) + Mermaid opcional\n   ============================================================ */\nfunction escapeHtml(s){return s.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');}\nfunction inlineMd(s){\n  const codes=[];\n  s=s.replace(/`([^`]+)`/g,(m,c)=>{codes.push('<code>'+escapeHtml(c)+'</code>');return '\\x00'+(codes.length-1)+'\\x00';});\n  s=escapeHtml(s);\n  s=s.replace(/\\*\\*\\*([^*]+)\\*\\*\\*/g,'<strong><em>$1</em></strong>')\n     .replace(/\\*\\*([^*]+)\\*\\*/g,'<strong>$1</strong>')\n     .replace(/(^|[^*\\w])\\*([^*\\n]+)\\*(?!\\w)/g,'$1<em>$2</em>')\n     .replace(/(^|[^_\\w])_([^_\\n]+)_(?!\\w)/g,'$1<em>$2</em>')\n     .replace(/~~([^~]+)~~/g,'<del>$1</del>')\n     .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,'<a href=\"$2\" target=\"_blank\" rel=\"noopener\">$1</a>')\n     .replace(/&lt;br\\s*\\/?&gt;/g,'<br>')\n     .replace(/\\[\\[\\s*(?:COMPLETAR|POR COMPLETAR|PENDIENTE)\\s*:?\\s*([^\\]]*)\\]\\]/gi,function(m,t){return '<span class=\"df-fill\">\\u270E '+(t.trim()||'completar')+'</span>';});\n  return s.replace(/\\x00(\\d+)\\x00/g,(m,i)=>codes[+i]);\n}\nfunction renderMarkdown(md){\n  const lines=md.replace(/\\r\\n?/g,'\\n').split('\\n');\n  let html='',i=0,mermaidCount=0;\n  const listStack=[];\n  function closeLists(toDepth){while(listStack.length>toDepth){html+='</'+listStack.pop()+'>';}}\n  while(i<lines.length){\n    let l=lines[i];\n    // fenced code\n    let f=l.match(/^\\s*(```+|~~~+)\\s*(\\w+)?\\s*$/);\n    if(f){\n      closeLists(0);\n      const fence=f[1],lang=(f[2]||'').toLowerCase();const buf=[];i++;\n      while(i<lines.length&&!lines[i].trim().startsWith(fence)){buf.push(lines[i]);i++;}\n      i++;\n      const code=buf.join('\\n');\n      if(lang==='mermaid'){html+='<div class=\"mermaid-src\" data-idx=\"'+(mermaidCount++)+'\"><pre><code class=\"lang-mermaid\">'+escapeHtml(code)+'</code></pre></div>';}\n      else html+='<pre><code class=\"lang-'+escapeHtml(lang)+'\">'+escapeHtml(code)+'</code></pre>';\n      continue;\n    }\n    // heading\n    let h=l.match(/^(#{1,6})\\s+(.*?)\\s*#*\\s*$/);\n    if(h){closeLists(0);html+='<h'+h[1].length+'>'+inlineMd(h[2])+'</h'+h[1].length+'>';i++;continue;}\n    // hr\n    if(/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(l)){closeLists(0);html+='<hr>';i++;continue;}\n    // table\n    if(i+1<lines.length&&/^\\s*\\|.*\\|\\s*$/.test(l)&&/^\\s*\\|?\\s*:?-{2,}:?\\s*(\\|\\s*:?-{2,}:?\\s*)*\\|?\\s*$/.test(lines[i+1])){\n      closeLists(0);\n      const cells=r=>r.trim().replace(/^\\|/,'').replace(/\\|$/,'').split(/(?<!\\\\)\\|/).map(c=>c.trim().replace(/\\\\\\|/g,'|'));\n      const head=cells(l);i+=2;html+='<table><thead><tr>'+head.map(c=>'<th>'+inlineMd(c)+'</th>').join('')+'</tr></thead><tbody>';\n      while(i<lines.length&&/^\\s*\\|.*\\|\\s*$/.test(lines[i])){const row=cells(lines[i]);html+='<tr>'+row.map(c=>'<td>'+inlineMd(c)+'</td>').join('')+'</tr>';i++;}\n      html+='</tbody></table>';continue;\n    }\n    // blockquote\n    if(/^\\s*>/.test(l)){closeLists(0);const buf=[];while(i<lines.length&&/^\\s*>/.test(lines[i])){buf.push(lines[i].replace(/^\\s*>\\s?/,''));i++;}html+='<blockquote>'+renderMarkdown(buf.join('\\n'))+'</blockquote>';continue;}\n    // list\n    let li=l.match(/^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/);\n    if(li){\n      const depth=Math.floor(li[1].replace(/\\t/g,'  ').length/2)+1;const type=/\\d/.test(li[2])?'ol':'ul';\n      while(listStack.length>depth)html+='</'+listStack.pop()+'>';\n      while(listStack.length<depth){html+='<'+type+'>';listStack.push(type);}\n      if(listStack[listStack.length-1]!==type){html+='</'+listStack.pop()+'><'+type+'>';listStack.push(type);}\n      // continuation lines\n      let text=li[3];i++;\n      while(i<lines.length&&lines[i].trim()&&!/^(\\s*)([-*+]|\\d+[.)])\\s+/.test(lines[i])&&!/^#{1,6}\\s/.test(lines[i])&&!/^\\s*(```|\\||>)/.test(lines[i])&&/^\\s{2,}/.test(lines[i])){text+=' '+lines[i].trim();i++;}\n      html+='<li>'+inlineMd(text)+'</li>';continue;\n    }\n    if(!l.trim()){closeLists(0);i++;continue;}\n    // paragraph\n    closeLists(0);\n    const buf=[l];i++;\n    while(i<lines.length&&lines[i].trim()&&!/^#{1,6}\\s/.test(lines[i])&&!/^\\s*(```|~~~|\\||>)/.test(lines[i])&&!/^(\\s*)([-*+]|\\d+[.)])\\s+/.test(lines[i])&&!/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(lines[i])){buf.push(lines[i]);i++;}\n    html+='<p>'+inlineMd(buf.join('\\n'))+'</p>';\n  }\n  closeLists(0);\n  return html;\n}\n\n/* ============================================================\n   2b) INVENTARIO — analiza el JSON crudo y reconoce QUÉ toca el flujo:\n   tablas/datasets, HttpRequest, stores, componentes del workspace y steps.\n   El resultado se adjunta al prompt para que la documentación hable por\n   nombres reales (\"tabla current_chat_session_ds\") y no por IDs sueltos.\n   ============================================================ */\nfunction buildInventory(root,opts){\n  opts=opts||{};\n  const logComponents=new Set(opts.logComponents||[]);\n  const logModules=new Set(opts.logModules||['__LoggerService']);\n  const alias=new Map(),aliasUse=new Map();(opts.aliases||[]).forEach(a=>{if(a&&a.id&&a.name){alias.set(String(a.id).trim(),a.name);if(a.use)aliasUse.set(String(a.id).trim(),a.use);}});\n  const useOf=id=>aliasUse.has(id)?(' — '+aliasUse.get(id)):'';\n  const mods=new Map();      // reference -> uso\n  const comps=new Map();     // natura@xxx -> uso\n  const https=new Map();     // reference de HttpRequest -> uso\n  const steps=[];            // resultName de los Step\n  const MAXL=10;\n\n  function mod(id){\n    if(!mods.has(id))mods.set(id,{id:id,reads:new Map(),writes:new Map(),acts:new Map(),labels:new Set(),n:0});\n    return mods.get(id);\n  }\n  function bump(map,key,extra){\n    if(!key)return;\n    const k=String(key);\n    if(!map.has(k))map.set(k,{n:0,ex:new Set()});\n    const v=map.get(k);v.n++;\n    if(extra!=null&&v.ex.size<3){const t=(typeof extra==='string')?extra:JSON.stringify(extra);v.ex.add(String(t).slice(0,90));}\n  }\n  function refOf(node){\n    if(node==null)return null;\n    if(typeof node==='string')return node;\n    if(typeof node==='object'){\n      if(node.params&&typeof node.params.reference==='string')return node.params.reference;\n      if(typeof node.reference==='string')return node.reference;\n    }\n    return null;\n  }\n  function propOf(node){\n    if(node==null)return null;\n    if(typeof node==='string')return node;\n    if(typeof node==='object'&&node.params&&node.params.content!=null)return String(node.params.content);\n    return null;\n  }\n  function short(c){\n    if(typeof c!=='string')return String(c);\n    const m=c.match(/^data2-core-([a-z-]+)@(.+)$/);\n    return m?m[2]:c;\n  }\n  /* Describe en una línea de dónde sale un valor */\n  function brief(v,depth){\n    depth=depth||0;\n    if(v==null)return 'null';\n    if(typeof v!=='object')return JSON.stringify(v);\n    if(Array.isArray(v))return '['+v.slice(0,3).map(x=>brief(x,depth+1)).join(', ')+(v.length>3?', …':'')+']';\n    const c=v.component,p=v.params||{};\n    if(!c)return '{…}';\n    if(c==='data2-core-primitives@String')return JSON.stringify(String(p.content==null?'':p.content).slice(0,60));\n    if(/data2-core-primitives@(Number|Boolean)/.test(c))return String(p.content);\n    if(c==='data2-core-primitives@Null')return 'null';\n    if(c==='data2-core-primitives@Undefined')return 'undefined';\n    if(c==='data2-core-types@Reference')return 'ref:'+(propOf(p.reference)||'?');\n    if(c==='data2-core-types@Getter')return (refOf(p.module)||'?')+'.'+(propOf(p.prop)||'?');\n    if(c==='data2-core-types@InteractiveModuleReference'||c==='data2-core-types@InstanceReference')return 'módulo '+(refOf(v)||'?');\n    if(depth>2)return short(c);\n    const keys=Object.keys(p).slice(0,3);\n    return short(c)+(keys.length?'('+keys.join(', ')+')':'');\n  }\n\n  function walk(v,label){\n    if(v==null||typeof v!=='object')return;\n    if(Array.isArray(v)){v.forEach(x=>walk(x,label));return;}\n    const c=v.component,p=v.params||{};\n    const myLabel=v.displayName||label;\n    if(typeof c==='string'){\n      if(logComponents.has(c))return;\n      if(c==='data2-core-types@Getter'||c==='data2-core-types@Setter'||c==='data2-core-types@Interaction'){\n        const id=refOf(p.module);\n        if(id&&logModules.has(id))return;\n        if(id){\n          const m=mod(id);m.n++;\n          if(myLabel)m.labels.add(String(myLabel).slice(0,70));\n          const pr=propOf(p.prop);\n          if(c==='data2-core-types@Getter')bump(m.reads,pr);\n          else if(c==='data2-core-types@Setter')bump(m.writes,pr,brief(p.value));\n          else bump(m.acts,pr||'(acción)',p.args?brief(p.args):null);\n        }\n      }else if(c==='data2-core-connect@HttpRequest'||c==='http@Request'){\n        const id=v.reference||refOf(v)||'(sin reference)';\n        if(!https.has(id))https.set(id,{id:id,n:0,labels:new Set(),params:new Set(),url:null,method:null});\n        const h=https.get(id);h.n++;\n        if(myLabel)h.labels.add(String(myLabel).slice(0,70));\n        if(p.url&&!h.url)h.url=brief(p.url);\n        if(p.method&&!h.method)h.method=brief(p.method);\n        Object.keys(p).slice(0,10).forEach(k=>h.params.add(k));\n      }else if(/^(?!data2-)/.test(c)&&c.indexOf('@')>0){\n        // componente del workspace: natura@xxx, otroTenant@xxx\n        if(!comps.has(c))comps.set(c,{id:c,n:0,labels:new Set(),params:new Map()});\n        const k=comps.get(c);k.n++;\n        if(myLabel)k.labels.add(String(myLabel).slice(0,70));\n        Object.keys(p).forEach(pk=>bump(k.params,pk,brief(p[pk])));\n      }else if(c==='data2-core-flow@Step'){\n        const nm=propOf(p.resultName);\n        if(nm)steps.push({name:nm,action:p.action&&p.action.component?short(p.action.component):'?',detail:brief(p.action)});\n      }\n    }\n    Object.keys(v).forEach(k=>{if(k!=='component'&&k!=='displayName')walk(v[k],myLabel);});\n  }\n  walk(root,null);\n\n  /* --- rol inferido y nombre probable de cada módulo --- */\n  const TABLE_RE=/\\b([a-z][a-z0-9_]*(?:_ds|_ds\\b|_dataset|_table|_tbl))\\b/i;\n  function guessName(m){\n    if(alias.has(m.id))return '**'+alias.get(m.id)+'** (nombre definido por el equipo)'+useOf(m.id);\n    for(const l of m.labels){const t=TABLE_RE.exec(l);if(t)return '**'+t[1]+'**';}\n    const ctx=Array.from(m.labels).slice(0,3).join(' · ');\n    return ctx?('sin nombre propio · etiquetas cercanas: '+ctx):null;\n  }\n  function role(m){\n    const acts=Array.from(m.acts.keys()).join(' ');\n    const reads=Array.from(m.reads.keys()).join(' ');\n    const writes=Array.from(m.writes.keys()).join(' ');\n    const all=(acts+' '+reads+' '+writes).toLowerCase();\n    if(/sendrequest/.test(all))return 'HttpRequest / API';\n    if(/uploadfromfiles|filefrombase64|folder/.test(all))return 'Storage de archivos';\n    if(/loadallpages|loadpage|\\bfilter\\b|data\\.records|getfilters|\\bcreate\\b|\\bdelete\\b/.test(all))return 'Tabla / DataSource';\n    if(/\\bedit\\b|\\bsave\\b/.test(all)&&/cursor\\.current/.test(all))return 'Tabla / DataSource (registro en edición)';\n    if(/cursor\\.current/.test(all))return 'Tabla / DataSource';\n    if(m.writes.size&&/^data\\./.test(Array.from(m.writes.keys())[0]||''))return 'Variable Store';\n    if(m.writes.size&&!m.reads.size)return 'Variable Store';\n    if(m.reads.size&&!m.writes.size&&!m.acts.size)return 'Fuente de solo lectura';\n    return 'Módulo (rol por confirmar)';\n  }\n  function listOf(map,cap){\n    return Array.from(map.entries()).sort((a,b)=>b[1].n-a[1].n).slice(0,cap||MAXL)\n      .map(e=>'`'+e[0]+'`'+(e[1].n>1?' ×'+e[1].n:'')).join(', ')||'—';\n  }\n  function listWrites(map,cap){\n    return Array.from(map.entries()).sort((a,b)=>b[1].n-a[1].n).slice(0,cap||MAXL)\n      .map(e=>'`'+e[0]+'`'+(e[1].ex.size?' = '+Array.from(e[1].ex)[0]:'')).join('; ')||'—';\n  }\n\n  const modArr=Array.from(mods.values()).sort((a,b)=>b.n-a.n);\n  const lines=[];\n  lines.push('#### A) Módulos, tablas y stores que toca el flujo');\n  lines.push('| Reference | Nombre / etiquetas cercanas | Tipo inferido | Props leídas | Props escritas (= valor) | Interacciones | Usos |');\n  lines.push('|---|---|---|---|---|---|---|');\n  modArr.slice(0,28).forEach(m=>{\n    lines.push('| `'+m.id+'` | '+(guessName(m)||(m.labels.size?Array.from(m.labels)[0]:'—'))+' | '+role(m)+' | '\n      +listOf(m.reads,8)+' | '+listWrites(m.writes,6)+' | '+listOf(m.acts,8)+' | '+m.n+' |');\n  });\n  if(modArr.length>28)lines.push('| … | +'+(modArr.length-28)+' módulos más en el JSON | | | | | |');\n\n  if(https.size){\n    lines.push('');\n    lines.push('#### B) HttpRequest (llamadas a APIs)');\n    lines.push('| Reference | Etiquetas cercanas | Método y URL si están en el JSON | Params presentes | Usos |');\n    lines.push('|---|---|---|---|---|');\n    Array.from(https.values()).sort((a,b)=>b.n-a.n).forEach(h=>{\n      lines.push('| `'+h.id+'` | '+(alias.has(h.id)?'**'+alias.get(h.id)+'**'+useOf(h.id):(Array.from(h.labels).slice(0,2).join(' · ')||'—'))+' | '+((h.method?h.method+' ':'')+(h.url||'')||'no visible')+' | '+(Array.from(h.params).map(x=>'`'+x+'`').join(', ')||'—')+' | '+h.n+' |');\n    });\n  }\n  if(comps.size){\n    lines.push('');\n    lines.push('#### C) Componentes del workspace invocados (llamadas a OTROS componentes, no son APIs)');\n    lines.push('| Component | Nombre visible | Entradas (param = origen del valor) | Invocaciones |');\n    lines.push('|---|---|---|---|');\n    Array.from(comps.values()).sort((a,b)=>b.n-a.n).slice(0,25).forEach(k=>{\n      lines.push('| `'+k.id+'` | '+(alias.has(k.id)?'**'+alias.get(k.id)+'**'+useOf(k.id):(Array.from(k.labels)[0]||'—'))+' | '+listWrites(k.params,6)+' | '+k.n+' |');\n    });\n  }\n  if(steps.length){\n    lines.push('');\n    lines.push('#### D) Steps con nombre (usa estos nombres para referirte a los resultados)');\n    lines.push('| resultName | Acción que lo produce |');\n    lines.push('|---|---|');\n    const seen=new Set();\n    steps.forEach(s=>{if(seen.has(s.name))return;seen.add(s.name);lines.push('| `'+s.name+'` | '+s.action+' — '+s.detail+' |');});\n  }\n  const ids=[];\n  modArr.forEach(m=>{const nm=TABLE_RE.exec(Array.from(m.labels).join(' '));ids.push({id:m.id,kind:role(m),suggested:alias.get(m.id)||(nm?nm[1]:'')});});\n  Array.from(https.values()).sort((a,b)=>b.n-a.n).forEach(h=>{if(h.id!=='(sin reference)')ids.push({id:h.id,kind:'HttpRequest / API',suggested:alias.get(h.id)||''});});\n  Array.from(comps.values()).sort((a,b)=>b.n-a.n).forEach(k=>ids.push({id:k.id,kind:'Componente del workspace',suggested:alias.get(k.id)||(Array.from(k.labels)[0]||'')}));\n  return {\n    md:lines.join('\\n'),\n    ids:ids,\n    counts:{modules:mods.size,tables:modArr.filter(m=>/Tabla/.test(role(m))).length,https:https.size,components:comps.size,steps:new Set(steps.map(s=>s.name)).size}\n  };\n}\n\n/* ============================================================\n   3b) DFLOW — renderizador propio de diagramas de flujo (subconjunto Mermaid)\n   Sin CDN, sin dependencias: parsea `flowchart TD/LR` y dibuja SVG.\n   ============================================================ */\nconst DFLOW=(function(){\n  const OPEN=[['[[',']]','subroutine'],['{{','}}','hexagon'],['((','))','circle'],['([','])','stadium'],\n              ['[(',')]','cylinder'],['[/','/]','parallel'],['[\\\\','\\\\]','parallel'],\n              ['>',']','flag'],['[',']','rect'],['{','}','diamond'],['(',')','round']];\n  const CONN=/^(-\\.+-*[->ox]?|={2,}[=>ox]?|-{2,}[->ox]?|~{3,})\\s*(?:\\|([^|]*)\\|)?/;\n  const CONN_MID=/^(-{2,}|={2,})\\s*\"([^\"]*)\"\\s*(-{2,}|={2,})[->ox]?/;\n\n  /* ---------- utilidades de texto ---------- */\n  let _ctx;\n  function mctx(){\n    if(_ctx!==undefined)return _ctx;\n    try{const c=document.createElement('canvas');_ctx=c.getContext('2d');_ctx.font='500 12.5px Montserrat, \"Natura Sans\", system-ui, sans-serif';}\n    catch(e){_ctx=null;}\n    return _ctx;\n  }\n  function tw(s){const c=mctx();return c?c.measureText(String(s)).width:String(s).length*7.1;}\n  function xml(s){return String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;');}\n  function decode(s){\n    return String(s==null?'':s)\n      .replace(/<br\\s*\\/?>/gi,'\\n').replace(/#quot;|&quot;/g,'\"').replace(/#amp;|&amp;/g,'&')\n      .replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/\\\\n/g,'\\n').trim();\n  }\n  function unquote(s){\n    s=String(s==null?'':s).trim();\n    if(s.length>1&&((s[0]==='\"'&&s[s.length-1]==='\"')||(s[0]===\"'\"&&s[s.length-1]===\"'\")))s=s.slice(1,-1);\n    return s;\n  }\n  function chunks(word,maxW){\n    const out=[];let cur='';\n    for(const ch of String(word)){\n      if(cur&&tw(cur+ch)>maxW){out.push(cur);cur=ch;}else cur+=ch;\n    }\n    if(cur)out.push(cur);\n    return out.length?out:[''];\n  }\n  function wrap(text,maxW,hardW){\n    const out=[];const HARD=hardW||Math.max(maxW,300);\n    String(text==null?'':text).split('\\n').forEach(par=>{\n      const words=par.split(/\\s+/).filter(Boolean);\n      if(!words.length){out.push('');return;}\n      let cur='';\n      for(const w0 of words){\n        const parts=tw(w0)>HARD?chunks(w0,HARD):[w0];\n        for(const w of parts){\n          if(!cur){cur=w;continue;}\n          if(tw(cur+' '+w)>maxW){out.push(cur);cur=w;}else cur+=' '+w;\n        }\n      }\n      if(cur)out.push(cur);\n    });\n    return out.length?out:[''];\n  }\n\n  /* ---------- parser ---------- */\n  function findClose(str,start,tok){\n    let q=null;\n    for(let i=start;i<str.length;i++){\n      const ch=str[i];\n      if(q){if(ch===q)q=null;continue;}\n      if(ch==='\"'||ch===\"'\"){q=ch;continue;}\n      if(str.startsWith(tok,i))return i;\n    }\n    return -1;\n  }\n  function readNode(str){\n    const m=/^([A-Za-z0-9_\\-.]+)/.exec(str);\n    if(!m)return null;\n    const id=m[1];const i=m[0].length;\n    for(let k=0;k<OPEN.length;k++){\n      const o=OPEN[k][0],c=OPEN[k][1],shape=OPEN[k][2];\n      if(str.startsWith(o,i)){\n        const close=findClose(str,i+o.length,c);\n        if(close<0)continue;\n        return {id:id,label:unquote(str.slice(i+o.length,close)),shape:shape,len:close+c.length};\n      }\n    }\n    return {id:id,label:null,shape:null,len:i};\n  }\n  function ensure(g,id,label,shape,sub){\n    let n=g.nodes.get(id);\n    if(!n){n={id:id,label:label!=null?decode(label):id,shape:shape||'rect',sub:sub||null};g.nodes.set(id,n);}\n    else{\n      if(label!=null)n.label=decode(label);\n      if(shape)n.shape=shape;\n      if(sub&&!n.sub)n.sub=sub;\n    }\n    return n;\n  }\n  function parseStatement(line,g,sub){\n    let i=0,last=null,pend=null,guard=0;\n    while(i<line.length&&guard++<400){\n      const lead=/^\\s*/.exec(line.slice(i))[0].length;\n      i+=lead;\n      const rest=line.slice(i);\n      if(!rest)break;\n      let cm=CONN_MID.exec(rest);\n      if(cm){\n        pend={label:decode(cm[2]),dashed:false,thick:cm[1][0]==='=',arrow:true};\n        i+=cm[0].length;continue;\n      }\n      cm=CONN.exec(rest);\n      if(cm){\n        pend={label:cm[2]!=null?decode(unquote(cm[2])):null,dashed:/\\./.test(cm[1]),thick:/=/.test(cm[1]),arrow:/[>ox]$/.test(cm[1])};\n        i+=cm[0].length;continue;\n      }\n      const nt=readNode(rest);\n      if(!nt){i++;continue;}\n      const n=ensure(g,nt.id,nt.label,nt.shape,sub);\n      if(last&&pend)g.edges.push({from:last.id,to:n.id,label:pend.label,dashed:pend.dashed,thick:pend.thick,arrow:pend.arrow!==false});\n      last=n;pend=null;\n      i+=nt.len;\n    }\n  }\n  function parse(src){\n    const g={dir:'TD',nodes:new Map(),edges:[],subs:[]};\n    const stack=[];\n    String(src).replace(/\\r/g,'').split('\\n').forEach(function(raw){\n      const line=raw.trim();\n      if(!line||line.indexOf('%%')===0)return;\n      let m;\n      if((m=/^(?:flowchart|graph)\\s+(TB|TD|BT|LR|RL)\\b/i.exec(line))){g.dir=m[1].toUpperCase();return;}\n      if(/^(?:classDef|class|style|linkStyle|click|accTitle|accDescr|direction)\\b/i.test(line))return;\n      if(/^end\\b/i.test(line)){stack.pop();return;}\n      if((m=/^subgraph\\s*(.*)$/i.exec(line))){\n        const rest=m[1].trim();let id=null,title=rest;\n        let sm=/^([A-Za-z0-9_\\-.]+)\\s*\\[(.*)\\]\\s*$/.exec(rest);\n        if(sm){id=sm[1];title=unquote(sm[2]);}\n        else{title=unquote(rest)||('Grupo '+(g.subs.length+1));id='sg'+g.subs.length;}\n        const sg={id:id||('sg'+g.subs.length),title:decode(title)};\n        g.subs.push(sg);stack.push(sg);\n        return;\n      }\n      parseStatement(line,g,stack[stack.length-1]||null);\n    });\n    return g;\n  }\n\n  /* ---------- capas y orden ---------- */\n  function layers(g){\n    const nodes=Array.from(g.nodes.values());\n    const out=new Map(),indeg=new Map();\n    nodes.forEach(n=>{out.set(n.id,[]);indeg.set(n.id,0);});\n    g.edges.forEach((e,i)=>{\n      if(!g.nodes.has(e.from)||!g.nodes.has(e.to)||e.from===e.to){e.isBack=(e.from===e.to);return;}\n      out.get(e.from).push(i);indeg.set(e.to,indeg.get(e.to)+1);e.isBack=false;\n    });\n    // 1) detecta aristas de retorno (ciclos) con DFS iterativo\n    const state=new Map();nodes.forEach(n=>state.set(n.id,0));\n    const back=new Set();\n    function dfs(root){\n      const st=[{u:root,k:0}];state.set(root,1);\n      while(st.length){\n        const top=st[st.length-1],list=out.get(top.u);\n        if(top.k>=list.length){state.set(top.u,2);st.pop();continue;}\n        const ei=list[top.k++],v=g.edges[ei].to,s2=state.get(v);\n        if(s2===1){back.add(ei);continue;}\n        if(s2===0){state.set(v,1);st.push({u:v,k:0});}\n      }\n    }\n    nodes.filter(n=>indeg.get(n.id)===0).forEach(n=>{if(state.get(n.id)===0)dfs(n.id);});\n    nodes.forEach(n=>{if(state.get(n.id)===0)dfs(n.id);});\n    back.forEach(i=>{g.edges[i].isBack=true;});\n    // 2) capas por camino más largo sobre el DAG resultante\n    const adj=new Map(),rev=new Map(),deg=new Map();\n    nodes.forEach(n=>{adj.set(n.id,[]);rev.set(n.id,[]);deg.set(n.id,0);});\n    g.edges.forEach((e,i)=>{\n      if(back.has(i)||e.from===e.to||!adj.has(e.from)||!adj.has(e.to))return;\n      adj.get(e.from).push(e.to);rev.get(e.to).push(e.from);deg.set(e.to,deg.get(e.to)+1);\n    });\n    const L=new Map();nodes.forEach(n=>L.set(n.id,0));\n    const q=nodes.filter(n=>deg.get(n.id)===0).map(n=>n.id);\n    let guard=0;\n    while(q.length&&guard++<20000){\n      const u=q.shift();\n      adj.get(u).forEach(v=>{\n        if(L.get(v)<L.get(u)+1)L.set(v,L.get(u)+1);\n        deg.set(v,deg.get(v)-1);\n        if(deg.get(v)===0)q.push(v);\n      });\n    }\n    return {L:L,adj:adj,rev:rev};\n  }\n  function order(g,L,adj,rev){\n    const byL=[];\n    g.nodes.forEach(n=>{const l=L.get(n.id);(byL[l]=byL[l]||[]).push(n.id);});\n    for(let i=0;i<byL.length;i++)byL[i]=byL[i]||[];\n    const pos=new Map();\n    byL.forEach(row=>row.forEach((id,i)=>pos.set(id,i)));\n    function bary(row,neigh){\n      return row.slice().sort((a,b)=>{\n        const va=avg(neigh(a),pos),vb=avg(neigh(b),pos);\n        if(va===vb)return pos.get(a)-pos.get(b);\n        return va-vb;\n      });\n    }\n    function avg(list,p){\n      const v=list.map(x=>p.get(x)).filter(x=>x!=null);\n      return v.length?v.reduce((a,b)=>a+b,0)/v.length:1e9;\n    }\n    for(let it=0;it<4;it++){\n      for(let l=1;l<byL.length;l++){byL[l]=bary(byL[l],id=>rev.get(id)||[]);byL[l].forEach((id,i)=>pos.set(id,i));}\n      for(let l=byL.length-2;l>=0;l--){byL[l]=bary(byL[l],id=>adj.get(id)||[]);byL[l].forEach((id,i)=>pos.set(id,i));}\n    }\n    // agrupa por subgraph manteniendo el orden relativo\n    byL.forEach((row,l)=>{\n      const groups=[],seen=new Map();\n      row.forEach(id=>{\n        const k=(g.nodes.get(id).sub&&g.nodes.get(id).sub.id)||'';\n        if(!seen.has(k)){seen.set(k,[]);groups.push(seen.get(k));}\n        seen.get(k).push(id);\n      });\n      byL[l]=[].concat.apply([],groups);\n      byL[l].forEach((id,i)=>pos.set(id,i));\n    });\n    return byL;\n  }\n\n  /* ---------- formas ---------- */\n  const PALETTE={\n    rect:{fill:'#FFFFFF',stroke:'#D6D6D8'},\n    round:{fill:'#FFFFFF',stroke:'#D6D6D8'},\n    diamond:{fill:'#FDF1DF',stroke:'#F4801E'},\n    hexagon:{fill:'#FDF1DF',stroke:'#E8A33D'},\n    subroutine:{fill:'#F7EFF4',stroke:'#8E5B7E'},\n    stadium:{fill:'#FDEDE0',stroke:'#F4801E'},\n    circle:{fill:'#FDEDE0',stroke:'#F4801E'},\n    flag:{fill:'#E7F4EC',stroke:'#2E7D5B'},\n    cylinder:{fill:'#EDF4F1',stroke:'#3F8F6F'},\n    parallel:{fill:'#EFF3F7',stroke:'#4A7FA5'}\n  };\n  const LEGEND={rect:'Proceso',round:'Proceso',diamond:'Decisión',hexagon:'Decisión',\n    subroutine:'Llama a otro componente',stadium:'Inicio / fin',circle:'Inicio / fin',\n    flag:'Mensaje al usuario',cylinder:'Tabla / dataset',parallel:'API · HttpRequest'};\n  function shapePath(n){\n    const x=n.x,y=n.y,w=n.w,h=n.h,r=8;\n    switch(n.shape){\n      case 'diamond':return '<path d=\"M '+(x+w/2)+' '+y+' L '+(x+w)+' '+(y+h/2)+' L '+(x+w/2)+' '+(y+h)+' L '+x+' '+(y+h/2)+' Z\"';\n      case 'hexagon':{const c=Math.min(22,w/4);\n        return '<path d=\"M '+(x+c)+' '+y+' H '+(x+w-c)+' L '+(x+w)+' '+(y+h/2)+' L '+(x+w-c)+' '+(y+h)+' H '+(x+c)+' L '+x+' '+(y+h/2)+' Z\"';}\n      case 'parallel':{const c=Math.min(18,w/5);\n        return '<path d=\"M '+(x+c)+' '+y+' H '+(x+w)+' L '+(x+w-c)+' '+(y+h)+' H '+x+' Z\"';}\n      case 'flag':{const c=Math.min(16,w/6);\n        return '<path d=\"M '+x+' '+y+' H '+(x+w-c)+' L '+(x+w)+' '+(y+h/2)+' L '+(x+w-c)+' '+(y+h)+' H '+x+' Z\"';}\n      case 'stadium':return '<rect x=\"'+x+'\" y=\"'+y+'\" width=\"'+w+'\" height=\"'+h+'\" rx=\"'+(h/2)+'\" ry=\"'+(h/2)+'\"';\n      case 'circle':return '<ellipse cx=\"'+(x+w/2)+'\" cy=\"'+(y+h/2)+'\" rx=\"'+(w/2)+'\" ry=\"'+(h/2)+'\"';\n      case 'cylinder':{const ry=Math.min(10,h/5);\n        return '<path d=\"M '+x+' '+(y+ry)+' A '+(w/2)+' '+ry+' 0 0 1 '+(x+w)+' '+(y+ry)+' V '+(y+h-ry)+' A '+(w/2)+' '+ry+' 0 0 1 '+x+' '+(y+h-ry)+' Z\"';}\n      case 'round':return '<rect x=\"'+x+'\" y=\"'+y+'\" width=\"'+w+'\" height=\"'+h+'\" rx=\"'+(h/2.6)+'\" ry=\"'+(h/2.6)+'\"';\n      case 'subroutine':return '<rect x=\"'+x+'\" y=\"'+y+'\" width=\"'+w+'\" height=\"'+h+'\" rx=\"4\" ry=\"4\"';\n      default:return '<rect x=\"'+x+'\" y=\"'+y+'\" width=\"'+w+'\" height=\"'+h+'\" rx=\"'+r+'\" ry=\"'+r+'\"';\n    }\n  }\n\n  /* ---------- render ---------- */\n  function render(src,uid){\n    const g=parse(src);\n    if(!g.nodes.size)throw new Error('no se reconoció ningún nodo');\n    const horiz=(g.dir==='LR'||g.dir==='RL');\n    const nodes=Array.from(g.nodes.values());\n    nodes.forEach(n=>{\n      const maxW=n.shape==='diamond'?150:(n.shape==='subroutine'?210:190);\n      n.lines=wrap(n.label,maxW);\n      const tWidth=Math.max.apply(null,n.lines.map(tw));\n      const padX=n.shape==='diamond'?36:(n.shape==='hexagon'?28:18);\n      const padY=n.shape==='diamond'?24:12;\n      n.w=Math.max(74,Math.ceil(tWidth)+padX*2);\n      n.h=Math.max(40,n.lines.length*17+padY*2);\n      if(n.shape==='circle'){const d=Math.max(n.w,n.h);n.w=d;n.h=d;}\n      if(n.shape==='flag')n.w+=10;\n    });\n    const lay=layers(g);\n    // nodos fantasma para aristas que cruzan varias capas (evita que pasen por encima de otras cajas)\n    g.edges.forEach(function(e,i){\n      if(e.isBack||e.from===e.to||!g.nodes.has(e.from)||!g.nodes.has(e.to))return;\n      const l0=lay.L.get(e.from),l1=lay.L.get(e.to);\n      if(l1-l0<=1)return;\n      const a=g.nodes.get(e.from),b=g.nodes.get(e.to);\n      const sub=(a.sub&&b.sub&&a.sub.id===b.sub.id)?a.sub:null;\n      const ids=[];let prev=e.from;\n      for(let l=l0+1;l<l1;l++){\n        const id='\\u0000d'+i+'_'+l;\n        g.nodes.set(id,{id:id,label:'',shape:'dummy',sub:sub,dummy:true,w:6,h:6,lines:['']});\n        lay.L.set(id,l);lay.adj.set(id,[]);lay.rev.set(id,[]);\n        lay.adj.get(prev).push(id);lay.rev.get(id).push(prev);\n        ids.push(id);prev=id;\n      }\n      lay.adj.get(prev).push(e.to);lay.rev.get(e.to).push(prev);\n      const aa=lay.adj.get(e.from),k1=aa.indexOf(e.to);if(k1>=0)aa.splice(k1,1);\n      const rr=lay.rev.get(e.to),k2=rr.indexOf(e.from);if(k2>=0)rr.splice(k2,1);\n      e.chain=ids;\n    });\n    const allNodes=Array.from(g.nodes.values());\n    const byL=order(g,lay.L,lay.adj,lay.rev);\n    const GAP=horiz?42:34, VGAP=horiz?90:64, PAD=18;\n\n    // tamaño de cada capa\n    const layerSize=byL.map(row=>row.reduce((m,id)=>Math.max(m,horiz?g.nodes.get(id).w:g.nodes.get(id).h),0));\n    let cross=0;\n    byL.forEach(row=>{\n      const t=row.reduce((s,id)=>s+(horiz?g.nodes.get(id).h:g.nodes.get(id).w),0)+GAP*Math.max(0,row.length-1);\n      cross=Math.max(cross,t);\n    });\n    let along=PAD;\n    byL.forEach((row,l)=>{\n      const total=row.reduce((s,id)=>s+(horiz?g.nodes.get(id).h:g.nodes.get(id).w),0)+GAP*Math.max(0,row.length-1);\n      let c=PAD+(cross-total)/2;\n      row.forEach(id=>{\n        const n=g.nodes.get(id);\n        if(horiz){n.x=along+(layerSize[l]-n.w)/2;n.y=c;c+=n.h+GAP;}\n        else{n.x=c;n.y=along+(layerSize[l]-n.h)/2;c+=n.w+GAP;}\n      });\n      along+=layerSize[l]+VGAP;\n    });\n    /* --- cajas de subgraph: aparta los nodos ajenos que caigan dentro --- */\n    function sgBox(sg){\n      const mem=nodes.filter(n=>n.sub&&n.sub.id===sg.id);\n      if(!mem.length)return null;\n      return {mem:mem,\n        x1:Math.min.apply(null,mem.map(n=>n.x))-16, y1:Math.min.apply(null,mem.map(n=>n.y))-30,\n        x2:Math.max.apply(null,mem.map(n=>n.x+n.w))+16, y2:Math.max.apply(null,mem.map(n=>n.y+n.h))+16};\n    }\n    function repack(){\n      byL.forEach(row=>{\n        const list=row.map(id=>g.nodes.get(id)).sort((a,b)=>(horiz?a.y-b.y:a.x-b.x));\n        for(let i=1;i<list.length;i++){\n          if(horiz){const min=list[i-1].y+list[i-1].h+GAP;if(list[i].y<min)list[i].y=min;}\n          else{const min=list[i-1].x+list[i-1].w+GAP;if(list[i].x<min)list[i].x=min;}\n        }\n      });\n    }\n    for(let pass=0;pass<3;pass++){\n      let moved=false;\n      g.subs.forEach(sg=>{\n        const box=sgBox(sg);if(!box)return;\n        allNodes.forEach(n=>{\n          if(n.dummy)return;\n          if(n.sub&&n.sub.id===sg.id)return;\n          if(n.x<box.x2&&n.x+n.w>box.x1&&n.y<box.y2&&n.y+n.h>box.y1){\n            if(horiz)n.y=box.y2+GAP;else n.x=box.x2+GAP;\n            moved=true;\n          }\n        });\n      });\n      if(!moved)break;\n      repack();\n    }\n    let W=0,H=0;\n    allNodes.forEach(n=>{W=Math.max(W,n.x+n.w);H=Math.max(H,n.y+n.h);});\n    g.subs.forEach(sg=>{const b=sgBox(sg);if(b){W=Math.max(W,b.x2);H=Math.max(H,b.y2);}});\n    W=Math.ceil(W+PAD);H=Math.ceil(H+PAD);\n\n    /* --- subgraphs --- */\n    let sgSvg='';\n    g.subs.forEach(function(sg){\n      const b=sgBox(sg);if(!b)return;\n      sgSvg+='<g><rect x=\"'+b.x1+'\" y=\"'+b.y1+'\" width=\"'+(b.x2-b.x1)+'\" height=\"'+(b.y2-b.y1)+'\" rx=\"10\" fill=\"#FAFAFA\" stroke=\"#DCDCDC\" stroke-dasharray=\"5 4\"/>'\n        +'<rect x=\"'+(b.x1+8)+'\" y=\"'+(b.y1+4)+'\" width=\"'+(tw(sg.title)+16)+'\" height=\"20\" rx=\"5\" fill=\"#FFFFFF\" stroke=\"#E6E6E6\"/>'\n        +'<text x=\"'+(b.x1+15)+'\" y=\"'+(b.y1+18)+'\" fill=\"#6D6E71\" font-size=\"11.5\" font-weight=\"600\" letter-spacing=\"0.4\">'+xml(sg.title)+'</text></g>';\n    });\n\n    /* --- aristas --- */\n    const anchor=(n,side)=>{\n      if(horiz){\n        if(side==='out')return [n.x+n.w,n.y+n.h/2];\n        if(side==='in')return [n.x,n.y+n.h/2];\n      }\n      if(side==='out')return [n.x+n.w/2,n.y+n.h];\n      return [n.x+n.w/2,n.y];\n    };\n    let edgeSvg='',labelSvg='';\n    const mid=(p0,p1,p2,p3)=>[(p0[0]+3*p1[0]+3*p2[0]+p3[0])/8,(p0[1]+3*p1[1]+3*p2[1]+p3[1])/8];\n    let back=0;\n    g.edges.forEach(e=>{\n      const a=g.nodes.get(e.from),b=g.nodes.get(e.to);\n      if(!a||!b)return;\n      const stroke=e.thick?'#8C8C90':'#B4B4B8',sw=e.thick?2.4:1.5;\n      const dash=e.dashed?' stroke-dasharray=\"6 5\"':'';\n      let d,mp;\n      if(a===b){\n        const p=anchor(a,'out'),off=34;\n        d='M '+p[0]+' '+p[1]+' C '+(p[0]+off)+' '+(p[1]+off)+' '+(a.x+a.w+off)+' '+(a.y+a.h/2)+' '+(a.x+a.w)+' '+(a.y+a.h/2);\n        mp=[a.x+a.w+off*0.7,a.y+a.h*0.9];\n      }else if(!e.isBack&&e.chain&&e.chain.length){\n        const pts=[anchor(a,'out')];\n        e.chain.forEach(id=>{const dn=g.nodes.get(id);pts.push([dn.x+dn.w/2,dn.y+dn.h/2]);});\n        pts.push(anchor(b,'in'));\n        d='M '+pts[0][0]+' '+pts[0][1];\n        for(let k=1;k<pts.length;k++){\n          const q0=pts[k-1],q1=pts[k];\n          const dx=horiz?(q1[0]-q0[0])/2:0,dy=horiz?0:(q1[1]-q0[1])/2;\n          d+=' C '+(q0[0]+dx)+' '+(q0[1]+dy)+' '+(q1[0]-dx)+' '+(q1[1]-dy)+' '+q1[0]+' '+q1[1];\n        }\n        mp=[(pts[0][0]+pts[1][0])/2,(pts[0][1]+pts[1][1])/2];\n      }else if(!e.isBack&&lay.L.get(b.id)>lay.L.get(a.id)){\n        const p0=anchor(a,'out'),p3=anchor(b,'in');\n        const dx=horiz?(p3[0]-p0[0])/2:0,dy=horiz?0:(p3[1]-p0[1])/2;\n        const p1=[p0[0]+dx,p0[1]+dy],p2=[p3[0]-dx,p3[1]-dy];\n        d='M '+p0[0]+' '+p0[1]+' C '+p1[0]+' '+p1[1]+' '+p2[0]+' '+p2[1]+' '+p3[0]+' '+p3[1];\n        mp=mid(p0,p1,p2,p3);\n      }else{\n        back++;\n        const off=46+((back%3)*22);\n        const p0=[a.x+a.w,a.y+a.h/2],p3=[b.x+b.w,b.y+b.h/2];\n        const cx=Math.max(p0[0],p3[0])+off;\n        const p1=[cx,p0[1]],p2=[cx,p3[1]];\n        d='M '+p0[0]+' '+p0[1]+' C '+p1[0]+' '+p1[1]+' '+p2[0]+' '+p2[1]+' '+p3[0]+' '+p3[1];\n        mp=mid(p0,p1,p2,p3);\n      }\n      edgeSvg+='<path d=\"'+d+'\" fill=\"none\" stroke=\"'+stroke+'\" stroke-width=\"'+sw+'\"'+dash+(e.arrow?' marker-end=\"url(#'+uid+'-a)\"':'')+'/>';\n      if(e.label){\n        const lines=wrap(e.label,140);\n        const lw=Math.max.apply(null,lines.map(tw))+12,lh=lines.length*14+6;\n        labelSvg+='<g><rect x=\"'+(mp[0]-lw/2)+'\" y=\"'+(mp[1]-lh/2)+'\" width=\"'+lw+'\" height=\"'+lh+'\" rx=\"5\" fill=\"#FFFFFF\" stroke=\"#E6E6E6\"/>'\n          +'<text x=\"'+mp[0]+'\" y=\"'+(mp[1]-lh/2+13)+'\" text-anchor=\"middle\" fill=\"#6D6E71\" font-size=\"10.5\" font-weight=\"600\">'\n          +lines.map((l,i)=>'<tspan x=\"'+mp[0]+'\" dy=\"'+(i?14:0)+'\">'+xml(l)+'</tspan>').join('')+'</text></g>';\n      }\n    });\n\n    /* --- nodos --- */\n    let nodeSvg='';\n    allNodes.forEach(n=>{\n      if(n.dummy)return;\n      const p=PALETTE[n.shape]||PALETTE.rect;\n      nodeSvg+='<g>'+shapePath(n)+' fill=\"'+p.fill+'\" stroke=\"'+p.stroke+'\" stroke-width=\"1.4\"/>';\n      if(n.shape==='subroutine'){\n        nodeSvg+='<line x1=\"'+(n.x+7)+'\" y1=\"'+n.y+'\" x2=\"'+(n.x+7)+'\" y2=\"'+(n.y+n.h)+'\" stroke=\"'+p.stroke+'\" stroke-width=\"1.2\"/>'\n              +'<line x1=\"'+(n.x+n.w-7)+'\" y1=\"'+n.y+'\" x2=\"'+(n.x+n.w-7)+'\" y2=\"'+(n.y+n.h)+'\" stroke=\"'+p.stroke+'\" stroke-width=\"1.2\"/>';\n      }\n      const cx=n.x+n.w/2,y0=n.y+n.h/2-((n.lines.length-1)*17)/2+4;\n      nodeSvg+='<text x=\"'+cx+'\" y=\"'+y0+'\" text-anchor=\"middle\" fill=\"#58595B\" font-size=\"12.5\" font-weight=\"500\">'\n        +n.lines.map((l,i)=>'<tspan x=\"'+cx+'\" dy=\"'+(i?17:0)+'\">'+xml(l)+'</tspan>').join('')+'</text></g>';\n    });\n\n    const svg='<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 '+(W+60)+' '+H+'\" width=\"'+(W+60)+'\" height=\"'+H+'\" role=\"img\">'\n      +'<defs><marker id=\"'+uid+'-a\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\">'\n      +'<path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"#939598\"/></marker></defs>'\n      +sgSvg+edgeSvg+nodeSvg+labelSvg+'</svg>';\n    const used=[];nodes.forEach(n=>{const t=LEGEND[n.shape];if(t&&used.indexOf(t)<0)used.push(t);});\n    const colorOf={};nodes.forEach(n=>{const t=LEGEND[n.shape];if(t&&!colorOf[t])colorOf[t]=(PALETTE[n.shape]||PALETTE.rect);});\n    return {svg:svg,nodes:nodes.length,edges:g.edges.length,legend:used.map(t=>({label:t,fill:colorOf[t].fill,stroke:colorOf[t].stroke}))};\n  }\n  return {render:render,parse:parse};\n})();\n\n/* ============================================================\n   3c) Pintado de los bloques ```mermaid usando DFLOW (sin CDN)\n   ============================================================ */\nasync function renderMermaidIn(container){\n  const blocks=container.querySelectorAll('.mermaid-src');\n  if(!blocks.length)return 0;\n  const draw=$('optDiagramOn').checked;\n  let ok=0,k=0;\n  blocks.forEach(function(b){\n    const src=b.querySelector('code').textContent;\n    const codeBlock='<details class=\"df-diagram-src\"'+(draw?'':' open')+'><summary>Código Mermaid'\n      +'</summary><div class=\"df-mm-head\"><span>Pégalo en mermaid.live, Confluence o cualquier visor de Mermaid</span>'\n      +'<button class=\"df-btn df-ghost df-copy-mm\" type=\"button\">Copiar código</button></div>'\n      +'<pre><code>'+escapeHtml(src)+'</code></pre></details>';\n    let html='';\n    if(!draw){\n      html='<div class=\"df-diagram df-diagram-code\">'+codeBlock+'</div>';\n    }else{\n      try{\n        const r=DFLOW.render(src,'df'+Date.now().toString(36)+(k++));\n        const leg=(r.legend||[]).map(l=>'<span><i style=\"background:'+l.fill+';border-color:'+l.stroke+'\"></i>'+escapeHtml(l.label)+'</span>').join('');\n        html='<div class=\"df-diagram\"><div class=\"df-diagram-scroll\">'+r.svg+'</div>'\n            +(leg?'<div class=\"df-legend\">'+leg+'</div>':'')\n            +codeBlock.replace('<summary>Código Mermaid','<summary>Código Mermaid · '+r.nodes+' nodos, '+r.edges+' conexiones')+'</div>';\n        ok++;\n      }catch(e){\n        html='<div class=\"df-diagram\"><div class=\"mmfail\">No se pudo dibujar este diagrama ('+escapeHtml(String(e.message||e))+'). Abajo tienes el código para verlo en mermaid.live.</div>'+codeBlock.replace('<details','<details open')+'</div>';\n      }\n    }\n    const wrap=document.createElement('div');wrap.innerHTML=html;\n    b.replaceWith(wrap.firstChild);\n  });\n  return ok;\n}\n\n/* ============================================================\n   4) UI (todo referido al root del bloque de D2) + llamada al Rush\n   ============================================================ */\nconst root=__D2.root;\nconst $=name=>root.querySelector('[data-ref=\"'+name+'\"]');\nconst els={json:$('json'),prompt:$('prompt'),stats:$('stats'),dot:$('dot'),status:$('statusText'),preview:$('preview'),mdRaw:$('mdRaw'),rawResp:$('rawResp'),promptOut:$('promptOut'),log:$('log')};\nif(!__D2.host.querySelector('#dfstyle')){const st=document.createElement('style');st.id='dfstyle';st.textContent=DF_CSS;__D2.host.insertBefore(st,__D2.host.firstChild);}\n\nlet lastMd='',lastMdRaw='',lastAliases=[],lastCompact='',lastInv=null,runId=0,jsonBuffer='',pasteMode='replace';\nconst PREVIEW_LIMIT=300000;\nels.prompt.value=DEFAULT_PROMPT;\n\n/* ---- Perfil: dev (documentar lo que existe) / ana (convertir una idea) ---- */\nfunction mode(){return $('mode')?$('mode').value:'dev';}\nfunction isAna(){return mode()==='ana';}\nfunction applyMode(){\n  const ana=isAna();\n  if(typeof aiReset==='function'){aiReset();if(els.promptOut)els.promptOut.textContent='';}\n  root.dataset.mode=mode();\n  root.querySelectorAll('[data-ana]').forEach(function(el){\n    if(el.__devHtml===undefined)el.__devHtml=el.innerHTML;\n    el.innerHTML=ana?escapeHtml(el.getAttribute('data-ana')):el.__devHtml;\n  });\n  root.querySelectorAll('[data-anaph]').forEach(function(el){\n    if(el.__devPh===undefined)el.__devPh=el.getAttribute('placeholder')||'';\n    el.setAttribute('placeholder',ana?el.getAttribute('data-anaph'):el.__devPh);\n  });\n  root.querySelectorAll('[data-only]').forEach(function(el){\n    el.hidden=(el.getAttribute('data-only')==='dev')?ana:!ana;\n  });\n  if(ana&&$('optMultiOn').checked){$('optMultiOn').checked=false;$('multiBox').hidden=true;}\n  els.prompt.value=ana?ANALISTA_PROMPT:DEFAULT_PROMPT;\n  els.json.readOnly=false;\n  if(!jsonBuffer.trim()){\n    els.stats.innerHTML='';\n    setStatus(ana?'Listo. Escribe la idea en el paso 1 y pulsa \"Generar propuesta y ticket\".':'Listo. Carga el JSON para empezar.');\n    return;\n  }\n  if(!ana){\n    try{JSON.parse(jsonBuffer);}\n    catch(e){\n      els.stats.innerHTML='<span class=\"df-stat warn\">En el paso 1 hay texto que no es un JSON de D2. Pega el JSON del componente, o vuelve al perfil Analista para trabajar sobre una idea escrita.</span>';\n      setStatus('Perfil Desarrollador: falta el JSON del componente.');\n      return;\n    }\n  }\n  refreshStats();\n}\n\nfunction setStatus(t,kind){els.status.textContent=t;els.dot.className='df-dot'+(kind?' '+kind:'');}\nfunction fmtBytes(n){return n<1024?n+' B':n<1048576?(n/1024).toFixed(1)+' KB':(n/1048576).toFixed(2)+' MB';}\nfunction estTokens(s){return Math.round(s.length/3.4);}\nfunction now(){const d=new Date();const p=n=>(n<10?'0':'')+n;return p(d.getHours())+':'+p(d.getMinutes())+':'+p(d.getSeconds());}\nfunction log(msg,kind){\n  const div=document.createElement('div');div.className=kind||'';\n  div.innerHTML='<span class=\"t\">'+now()+'</span><span class=\"m\">'+escapeHtml(msg)+'</span>';\n  els.log.appendChild(div);els.log.scrollTop=els.log.scrollHeight;\n  while(els.log.children.length>80)els.log.removeChild(els.log.firstChild);\n  return div;\n}\nfunction copyText(txt){\n  const alt=()=>{const ta=document.createElement('textarea');ta.value=txt;ta.style.position='fixed';ta.style.top='-1000px';document.body.appendChild(ta);ta.select();let ok=false;try{ok=document.execCommand('copy');}catch(e){}document.body.removeChild(ta);return ok?Promise.resolve():Promise.reject(new Error('copy'));};\n  try{if(navigator.clipboard&&navigator.clipboard.writeText)return navigator.clipboard.writeText(txt).catch(alt);}catch(e){}\n  return alt();\n}\n\n/* ---- Buffer en memoria: el textarea es solo un visor cuando el JSON es grande ---- */\nfunction normalizeText(t){return t.replace(/\\r\\n?/g,'\\n').replace(/ /g,' ');}\nfunction bracketDiagnosis(t){\n  let depthObj=0,depthArr=0,inStr=false,esc=false;\n  for(let i=0;i<t.length;i++){\n    const ch=t[i];\n    if(inStr){if(esc)esc=false;else if(ch==='\\\\')esc=true;else if(ch==='\"')inStr=false;continue;}\n    if(ch==='\"')inStr=true;else if(ch==='{')depthObj++;else if(ch==='}')depthObj--;else if(ch==='[')depthArr++;else if(ch===']')depthArr--;\n  }\n  return {depthObj,depthArr,inStr};\n}\nfunction setJson(text,{append=false,source=''}={}){\n  text=normalizeText(text);\n  jsonBuffer=append?jsonBuffer+text:text;\n  renderViewer();\n  refreshStats(source);\n}\nfunction renderViewer(){\n  const n=jsonBuffer.length;\n  if(n>PREVIEW_LIMIT){\n    els.json.readOnly=true;\n    els.json.value='/* JSON cargado en memoria: '+fmtBytes(n)+' ('+n.toLocaleString()+' caracteres). El visor muestra solo el inicio y el final. Para cambiarlo: carga otro archivo, pega de nuevo o pulsa \"Limpiar\". */\\n\\n'+jsonBuffer.slice(0,2500)+'\\n\\n/* … '+(n-3500).toLocaleString()+' caracteres omitidos en el visor … */\\n\\n'+jsonBuffer.slice(-1000);\n  }else{\n    els.json.readOnly=false;\n    if(els.json.value!==jsonBuffer)els.json.value=jsonBuffer;\n  }\n  $('bufInfo').textContent=n?fmtBytes(n)+' en memoria':'vacío';\n}\nfunction refreshStats(source){\n  aiStale();\n  if(!jsonBuffer.trim()){els.stats.innerHTML='';setStatus(isAna()?'Listo. Escribe la idea en el paso 1 y pulsa \"Generar propuesta y ticket\".':'Listo. Carga el JSON para empezar.');return;}\n  if(isAna()){\n    try{\n      const p=buildPayload();showStats(p);\n      setStatus((source?source+' · ':'')+'Idea lista. Pulsa \"Generar propuesta y ticket\".','ok');\n    }catch(e){els.stats.innerHTML='<span class=\"df-stat err\">'+escapeHtml(e.message)+'</span>';setStatus(e.message,'err');}\n    return;\n  }\n  try{\n    const p=buildPayload();showStats(p);\n    setStatus((source?source+' · ':'')+'JSON válido y completo. Pulsa \"Generar documentación\".','ok');\n    log((source?source+' → ':'')+'JSON válido: '+p.stats.nodes.toLocaleString()+' nodos · '+p.stats.logsRemoved+' logs ignorados · compactado '+fmtBytes(p.rawLen)+' → '+fmtBytes(p.jsonText.length),'ok');\n    if(lastInv&&lastInv.counts&&lastInv.counts.modules)log('Inventario: '+lastInv.counts.modules+' módulos ('+(lastInv.counts.tables||0)+' tablas/datasources), '+(lastInv.counts.https||0)+' HttpRequest, '+(lastInv.counts.components||0)+' componentes del workspace, '+(lastInv.counts.steps||0)+' steps con nombre.','ok');\n  }catch(e){\n    const d=bracketDiagnosis(jsonBuffer);\n    let hint='';\n    if(d.depthObj>0||d.depthArr>0||d.inStr)hint=' — parece INCOMPLETO: faltan por cerrar '+d.depthObj+' llave(s) \"}\" y '+d.depthArr+' corchete(s) \"]\". El portapapeles cortó el texto: usa el botón de archivo, o cambia a \"Añadir al final\" y pega la parte siguiente.';\n    else if(d.depthObj<0||d.depthArr<0)hint=' — hay más cierres que aperturas: probablemente se pegó dos veces o falta el inicio. Pulsa \"Limpiar\" y vuelve a cargar.';\n    els.stats.innerHTML='<span class=\"df-stat err\">'+escapeHtml(e.message)+escapeHtml(hint)+'</span>';\n    setStatus(e.message.split(':')[0]+(hint?' — JSON incompleto':''),'err');\n    log((source?source+' → ':'')+e.message+hint,'err');\n  }\n}\nfunction parseInput(){\n  const raw=jsonBuffer.trim();\n  if(!raw)throw new Error('Pega o carga el JSON del componente.');\n  try{return JSON.parse(raw);}catch(e){throw new Error('JSON inválido: '+e.message);}\n}\nfunction buildMetaTable(){\n  const v=id=>($(id).value.trim()||'Por definir');\n  return ['| Campo | Valor |','|---|---|',\n    '| PERIODO DE DESARROLLO | '+v('mPeriod')+' |',\n    '| ANALISTA / CLUSTER SOLICITANTE | '+v('mCluster')+' |',\n    '| SPRINT | '+v('mSprint')+' |',\n    '| DEV RESPONSABLE | '+v('mDev')+' |',\n    '| FECHA LAST DEPLOY | '+v('mDeploy')+' |',\n    '| Actual Status/Last Actualization Value | Por definir |'].join('\\n');\n}\n/* ---- Piezas: varios componentes que forman un mismo flujo ---- */\nfunction pieceRow(){\n  const row=document.createElement('div');row.className='df-piece';\n  row.innerHTML='<div class=\"df-piece-hd\"><span class=\"df-piece-n\"></span>'\n    +'<input type=\"text\" data-k=\"name\" placeholder=\"Nombre o papel de esta pieza (p. ej. chatReplyGetInvoice)\" spellcheck=\"false\">'\n    +'<button class=\"df-btn df-ghost\" data-k=\"pick\" type=\"button\">Archivo</button>'\n    +'<input type=\"file\" data-k=\"file\" accept=\".json,.txt,application/json,text/plain\">'\n    +'<span class=\"df-stat\" data-k=\"info\">vacío</span>'\n    +'<button class=\"df-del\" type=\"button\" title=\"Quitar pieza\">×</button></div>'\n    +'<textarea data-k=\"json\" spellcheck=\"false\" placeholder=\"Pega aquí el JSON de este componente, o cárgalo con el botón Archivo\"></textarea>';\n  row.__raw='';\n  const ta=row.querySelector('[data-k=json]'),info=row.querySelector('[data-k=info]');\n  function refresh(source){\n    const n=row.__raw.length;\n    if(n>PREVIEW_LIMIT){\n      ta.readOnly=true;\n      ta.value='/* JSON en memoria: '+fmtBytes(n)+'. Se envía completo; el visor muestra solo el inicio. */\\n\\n'+row.__raw.slice(0,1200)+'\\n…';\n    }else{ta.readOnly=false;if(ta.value!==row.__raw)ta.value=row.__raw;}\n    let cls='df-stat',txt=n?fmtBytes(n):'vacío';\n    if(n){try{JSON.parse(row.__raw);cls='df-stat ok';txt='JSON válido · '+fmtBytes(n);}catch(e){cls='df-stat warn';txt='JSON inválido · se enviará tal cual';}}\n    info.className=cls;info.textContent=(source?source+' · ':'')+txt;\n    renumberPieces();scheduleStats();\n  }\n  row.__refresh=refresh;\n  ta.addEventListener('paste',e=>{\n    const t=e.clipboardData&&e.clipboardData.getData('text/plain');\n    if(!t)return;e.preventDefault();e.stopPropagation();\n    row.__raw=normalizeText(t);refresh('pegado');\n  });\n  ta.addEventListener('input',()=>{if(ta.readOnly)return;row.__raw=ta.value;clearTimeout(row.__t);row.__t=setTimeout(()=>refresh(),450);});\n  row.querySelector('[data-k=name]').addEventListener('input',scheduleStats);\n  row.querySelector('[data-k=pick]').addEventListener('click',e=>{e.preventDefault();const f=row.querySelector('[data-k=file]');f.value='';f.click();});\n  row.querySelector('[data-k=file]').addEventListener('change',e=>{\n    const f=e.target.files[0];if(!f)return;\n    const r=new FileReader();\n    r.onload=()=>{row.__raw=normalizeText(r.result);refresh('archivo '+f.name);log('Pieza cargada desde \"'+f.name+'\" ('+fmtBytes(r.result.length)+').','ok');};\n    r.readAsText(f);\n  });\n  row.querySelector('.df-del').addEventListener('click',()=>{row.remove();renumberPieces();scheduleStats();});\n  return row;\n}\nfunction renumberPieces(){\n  const rows=Array.from($('pieces').children);\n  rows.forEach((r,i)=>{r.querySelector('.df-piece-n').textContent=(i+2);});\n  const withJson=rows.filter(r=>r.__raw&&r.__raw.trim()).length;\n  $('pieceCount').textContent=withJson?('1 principal + '+withJson+' pieza(s) secundaria(s)'):'ninguna pieza añadida';\n  $('pieceCount').className='df-stat'+(withJson?' ok':'');\n}\nfunction addPiece(){$('pieces').appendChild(pieceRow());renumberPieces();}\nfunction readPieces(){\n  if(!$('optMultiOn').checked)return [];\n  return Array.from($('pieces').children).map((r,i)=>({\n    n:i+2,\n    name:r.querySelector('[data-k=name]').value.trim()||('Pieza '+(i+2)+' (sin nombre)'),\n    raw:(r.__raw||'').trim()\n  })).filter(p=>p.raw);\n}\n\n/* ---- Diccionario de nombres (tabla editable) ---- */\nfunction aliasRow(id,name,kind,use){\n  const row=document.createElement('div');row.className='df-trow';\n  row.innerHTML='<input type=\"text\" data-k=\"id\" placeholder=\"ID o reference del elemento\" spellcheck=\"false\">'\n    +'<input type=\"text\" data-k=\"name\" placeholder=\"Nombre que quieres usar\" spellcheck=\"false\">'\n    +'<input type=\"text\" data-k=\"kind\" placeholder=\"opcional\" spellcheck=\"false\">'\n    +'<input type=\"text\" data-k=\"use\" placeholder=\"Para qué sirve, quién lo usa, si está deprecado…\">'\n    +'<button class=\"df-del\" type=\"button\" title=\"Quitar fila\">×</button>';\n  row.querySelector('[data-k=id]').value=id||'';\n  if(id)row.querySelector('[data-k=id]').title=id;\n  row.querySelector('[data-k=name]').value=name||'';\n  row.querySelector('[data-k=kind]').value=kind||'';\n  row.querySelector('[data-k=use]').value=use||'';\n  row.querySelector('.df-del').addEventListener('click',()=>{row.remove();if(!$('aliasRows').children.length)addAliasRow();countAliases();});\n  row.querySelectorAll('input').forEach(i=>i.addEventListener('input',countAliases));\n  return row;\n}\nfunction addAliasRow(id,name,kind,use){$('aliasRows').appendChild(aliasRow(id,name,kind,use));countAliases();}\nfunction readAliases(){\n  if(!$('optAliasOn').checked)return [];\n  return Array.from($('aliasRows').children).map(r=>({\n    id:r.querySelector('[data-k=id]').value.trim(),\n    name:r.querySelector('[data-k=name]').value.trim(),\n    kind:r.querySelector('[data-k=kind]').value.trim(),\n    use:r.querySelector('[data-k=use]').value.trim()\n  })).filter(a=>a.id&&a.name);\n}\nfunction countAliases(){\n  const all=readAliases(),n=all.length,withUse=all.filter(a=>a.use).length;\n  $('aliasCount').textContent=(n===1?'1 nombre definido':n+' nombres definidos')+(n?' · '+withUse+' con uso explicado':'');\n  $('aliasCount').className='df-stat'+(n?(withUse===n?' ok':' warn'):'');\n  scheduleStats();\n}\nfunction readContext(){\n  if(!$('optCtxOn').checked)return null;\n  const t=$('ctxText').value.trim();\n  return t||null;\n}\nfunction checkContext(){\n  const box=$('ctxStats');const t=readContext();\n  if(!t){box.innerHTML='';scheduleStats();return;}\n  const words=t.split(/\\s+/).filter(Boolean).length;\n  const tips=[];\n  if(/\\bsimul|\\bqué pasaría|\\bque pasaria|\\bhipot/i.test(t))tips.push('se pedirá una simulación con supuestos marcados');\n  if(/\\bsolo\\b|\\búnicamente\\b|\\bunicamente\\b|\\bfracci|\\btramo\\b|\\bsolamente\\b/i.test(t))tips.push('se acotará el alcance a lo que pides');\n  if(/\\bconecta|\\brelacion|\\bpieza\\b|\\bcomponente\\b|\\bdespués\\b|\\bdespues\\b/i.test(t))tips.push('se explicarán las relaciones entre piezas');\n  box.innerHTML='<span class=\"df-stat ok\">Contexto activo · <b>'+words+'</b> palabras · '+fmtBytes(t.length)+'</span>'\n    +(words<12?'<span class=\"df-stat warn\">Muy corto: mientras más cuentes del propósito y del alcance, menos se inventa el asistente.</span>':'')\n    +tips.map(x=>'<span class=\"df-stat ok\">'+x+'</span>').join('');\n  scheduleStats();\n}\nfunction readSampleInput(){\n  if(!$('optInputOn').checked)return null;\n  const t=$('inputJson').value.trim();\n  return t||null;\n}\nfunction checkSampleInput(){\n  const box=$('inputStats');const t=readSampleInput();\n  if(!t){box.innerHTML='';scheduleStats();return;}\n  if(isAna()){\n    box.innerHTML='<span class=\"df-stat ok\">Caso de ejemplo · '+fmtBytes(t.length)+' · se desarrollará como el escenario E-01</span>';\n    scheduleStats();return;\n  }\n  let ok=true,msg='';\n  try{JSON.parse(t);}catch(e){ok=false;msg=e.message;}\n  box.innerHTML=ok\n    ? '<span class=\"df-stat ok\">Entrada válida · <b>'+fmtBytes(t.length)+'</b> · se analizará su recorrido por el flujo</span>'\n    : '<span class=\"df-stat warn\">No es JSON válido ('+escapeHtml(msg)+'). Se enviará tal cual; si es un fragmento está bien.</span>';\n  scheduleStats();\n}\nlet _statTimer2;\nfunction scheduleStats(){clearTimeout(_statTimer2);_statTimer2=setTimeout(()=>{if(jsonBuffer.trim())refreshStats();},350);}\n\n/* ---- Payload del perfil analista: la entrada es una idea en palabras ---- */\nfunction diccionarioBlock(aliases){\n  if(!aliases.length)return '';\n  return DICCIONARIO_HEAD\n    +'| ID / reference | Nombre a usar | Tipo | Para qué se usa / notas del equipo |\\n|---|---|---|---|\\n'\n    +aliases.map(a=>'| `'+a.id+'` | **'+a.name+'** | '+(a.kind||'—')+' | '+(a.use||'[[COMPLETAR: para qué se usa '+a.name+']]')+' |').join('\\n')+'\\n';\n}\nfunction buildPayloadAna(){\n  const idea=jsonBuffer.trim();\n  if(!idea)throw new Error('Escribe la idea que quieres convertir en propuesta.');\n  const aliases=readAliases();\n  const ctx=readContext();\n  const contexto=ctx?(CONTEXTO_HEAD+ctx+'\\n'):'';\n  const sample=readSampleInput();\n  const entrada=sample?(ENTRADA_ANA_HEAD+sample+'\\n'):'';\n  const name=$('mName').value.trim()||'Caso de uso sin nombre (proponlo a partir de la idea y márcalo como propuesta)';\n  const prompt=els.prompt.value\n    .replace(/\\{\\{NOMBRE\\}\\}/g,name)\n    .replace(/\\{\\{META_TABLE\\}\\}/g,buildMetaTable())\n    .replace(/\\{\\{REDACCION\\}\\}/g,REDACCION)\n    .replace(/\\{\\{CRITERIO\\}\\}/g,CRITERIO)\n    .replace(/\\{\\{CHEQUEO\\}\\}/g,CHEQUEO)\n    .replace(/\\{\\{CONTEXTO\\}\\}/g,contexto)\n    .replace(/\\{\\{DICCIONARIO\\}\\}/g,diccionarioBlock(aliases))\n    .replace(/\\{\\{ENTRADA\\}\\}/g,entrada)\n    .replace(/\\{\\{[A-Z_]+\\}\\}/g,'');\n  const text=prompt+'\\n\"\"\"\\n'+idea+'\\n\"\"\"\\n';\n  let bytes=text.length;try{bytes=new TextEncoder().encode(text).length;}catch(e){}\n  return {mode:'ana',text:text,jsonText:'',stats:{nodes:0,logsRemoved:0,disabledRemoved:0},rawLen:idea.length,bytes:bytes,\n    aliases:aliases.length,sample:sample?sample.length:0,ctx:ctx?ctx.length:0,pieces:0,piecesBytes:0,words:idea.split(/\\s+/).filter(Boolean).length};\n}\nfunction buildPayload(){\n  if(isAna())return buildPayloadAna();\n  const parsed=parseInput();\n  const compactOn=$('optCompact').checked;\n  const logIds=$('optLogs').value.split(',').map(s=>s.trim()).filter(Boolean);\n  const logComponents=logIds.filter(s=>s.includes('@'));\n  const logModules=logIds.filter(s=>!s.includes('@'));\n  let jsonText,stats={nodes:0,logsRemoved:0,disabledRemoved:0};\n  if(compactOn){\n    const c=makeCompactor({logComponents,logModules,dropDisabled:$('optDropDisabled').checked});\n    const r=c.compact(parsed);stats=r.stats;jsonText=JSON.stringify(r.result);\n  }else{\n    jsonText=JSON.stringify(parsed);\n  }\n  lastCompact=jsonText;\n  const aliases=readAliases();\n  const pieces=readPieces();\n  const compacted=[];\n  pieces.forEach(function(pc){\n    let txt=pc.raw,ok=false,st=null;\n    try{\n      const parsed=JSON.parse(pc.raw);ok=true;\n      if(compactOn){const c2=makeCompactor({logComponents,logModules,dropDisabled:$('optDropDisabled').checked});const r2=c2.compact(parsed);st=r2.stats;txt=JSON.stringify(r2.result);}\n      else txt=JSON.stringify(parsed);\n      compacted.push({n:pc.n,name:pc.name,text:txt,parsed:parsed,ok:true,stats:st});\n    }catch(e){compacted.push({n:pc.n,name:pc.name,text:pc.raw,parsed:null,ok:false,stats:null});}\n  });\n  let inv={md:'',counts:{},ids:[]};\n  const invRoot=compacted.length?[parsed].concat(compacted.filter(x=>x.parsed).map(x=>x.parsed)):parsed;\n  try{inv=buildInventory(invRoot,{logComponents:logComponents,logModules:logModules,aliases:aliases});}catch(e){inv={md:'(no se pudo generar el inventario automático: '+e.message+')',counts:{},ids:[]};}\n  lastInv=inv;\n  const sample=readSampleInput();\n  const ctx=readContext();\n  const contexto=ctx?(CONTEXTO_HEAD+ctx+'\\n'):'';\n  const dicc=diccionarioBlock(aliases);\n  const entrada=sample?(ENTRADA_HEAD+'```json\\n'+sample+'\\n```\\n'):'';\n  const nombrePrincipal=$('mName').value.trim()||'(pieza principal, el JSON del paso 1)';\n  const multi=compacted.length?MULTI_HEAD.replace('{{PIEZAS}}',\n      'Piezas entregadas, en este orden:\\n1. **PRINCIPAL — '+nombrePrincipal+'**: es el sujeto del documento.\\n'\n      +compacted.map(x=>x.n+'. **'+x.name+'** (secundaria): forma parte del mismo flujo y no necesita documentación propia.').join('\\n')+'\\n'):'';\n  const name=$('mName').value.trim()||'Componente D2 (nombre por definir: usa el displayName raíz del JSON si existe)';\n  const logsDesc=(logIds.length?logIds.map(s=>'`'+s+'`').join(', ')+', ':'')+'cualquier Interaction cuyo módulo sea `__LoggerService`, y cualquier nodo cuyo único efecto sea imprimir/registrar un mensaje (p. ej. mensajes que empiezan por \"Log -->\")';\n  const prompt=els.prompt.value\n    .replace(/\\{\\{NOMBRE\\}\\}/g,name)\n    .replace(/\\{\\{META_TABLE\\}\\}/g,buildMetaTable())\n    .replace(/\\{\\{REDACCION\\}\\}/g,REDACCION)\n    .replace(/\\{\\{CRITERIO\\}\\}/g,CRITERIO)\n    .replace(/\\{\\{CHEQUEO\\}\\}/g,CHEQUEO)\n    .replace(/\\{\\{LOGS\\}\\}/g,logsDesc)\n    .replace(/\\{\\{CONTEXTO\\}\\}/g,contexto)\n    .replace(/\\{\\{MULTI\\}\\}/g,multi)\n    .replace(/\\{\\{DICCIONARIO\\}\\}/g,dicc)\n    .replace(/\\{\\{ENTRADA\\}\\}/g,entrada)\n    .replace(/\\{\\{INVENTARIO\\}\\}/g,inv.md?('################ INVENTARIO DETECTADO AUTOMÁTICAMENTE ################\\nEste inventario lo extrajo un analizador que recorrió el JSON. Úsalo como punto de partida para nombrar las cosas, pero VERIFÍCALO contra el JSON: si algo no cuadra, manda el JSON. Si un módulo aparece aquí como \"Tabla / DataSource\", trátalo como tabla y di qué se le hizo.\\n\\n'+inv.md+'\\n'):'')\n    .replace(/\\{\\{NOTACION\\}\\}/g,compactOn?NOTACION_COMPACTA:'################ NOTACIÓN DEL JSON ################\\nEl JSON está en el formato nativo exportado por D2 (component / params / displayName / disabled). Los primitivos son data2-core-primitives@*, las referencias data2-core-types@Reference/Getter/Setter/Interaction/InteractiveModuleReference.');\n  let text=prompt+'\\n```json\\n'+jsonText+'\\n```\\n';\n  if(compacted.length){\n    text+='\\n################ JSON DE LAS PIEZAS SECUNDARIAS DEL MISMO FLUJO ################\\n'\n      +'Cada bloque es un componente aparte en D2 que continúa el flujo de la pieza principal. Documéntalas dentro del mismo documento, en el punto donde son invocadas, marcando el salto entre componentes.\\n\\n'\n      +compacted.map(x=>'### PIEZA '+x.n+' · '+x.name+(x.ok?'':' (JSON no parseable: se entrega tal cual)')+'\\n```json\\n'+x.text+'\\n```\\n').join('\\n');\n  }\n  let bytes=text.length;\n  try{bytes=new TextEncoder().encode(text).length;}catch(e){}\n  return {text,jsonText,stats,rawLen:jsonBuffer.length,bytes:bytes,aliases:aliases.length,sample:sample?sample.length:0,ctx:ctx?ctx.length:0,pieces:compacted.length,piecesBytes:compacted.reduce((a,x)=>a+x.text.length,0)};\n}\nfunction showStats(p){\n  const s=p.stats;const kb=p.bytes||p.text.length;\n  const warn=kb>600000?'err':kb>250000?'warn':'ok';\n  if(p.mode==='ana'){\n    els.stats.innerHTML=\n      '<span class=\"df-stat ok\">idea <b>'+p.words+'</b> palabras · '+fmtBytes(p.rawLen)+'</span>'+\n      (p.words<25?'<span class=\"df-stat warn\">Muy corta: cuanto menos escribas, más huecos por rellenar traerá el documento.</span>':'')+\n      (p.ctx?'<span class=\"df-stat ok\">contexto <b>'+fmtBytes(p.ctx)+'</b></span>':'')+\n      (p.sample?'<span class=\"df-stat ok\">caso a simular <b>'+fmtBytes(p.sample)+'</b> · escenario E-01</span>':'')+\n      (p.aliases?'<span class=\"df-stat ok\">diccionario <b>'+p.aliases+'</b> término(s)</span>':'')+\n      '<span class=\"df-stat '+warn+'\">payload <b>'+fmtBytes(kb)+'</b> ≈ '+estTokens(p.text).toLocaleString()+' tokens</span>';\n    return;\n  }\n  els.stats.innerHTML=\n    '<span class=\"df-stat\">JSON original <b>'+fmtBytes(p.rawLen)+'</b></span>'+\n    '<span class=\"df-stat\">JSON enviado <b>'+fmtBytes(p.jsonText.length)+'</b>'+(p.rawLen>p.jsonText.length?' (÷'+(p.rawLen/p.jsonText.length).toFixed(1)+')':'')+'</span>'+\n    '<span class=\"df-stat\">nodos <b>'+s.nodes+'</b></span>'+\n    '<span class=\"df-stat\">logs ignorados <b>'+s.logsRemoved+'</b></span>'+\n    (s.disabledRemoved?'<span class=\"df-stat\">deshabilitados eliminados <b>'+s.disabledRemoved+'</b></span>':'')+\n    (p.ctx?'<span class=\"df-stat ok\">contexto del autor <b>'+fmtBytes(p.ctx)+'</b></span>':'')+\n    (p.aliases?'<span class=\"df-stat ok\">diccionario <b>'+p.aliases+'</b> nombre(s)</span>':'')+\n    (p.pieces?'<span class=\"df-stat ok\">flujo en <b>'+(p.pieces+1)+'</b> componentes · +'+fmtBytes(p.piecesBytes)+'</span>':'')+\n    (p.sample?'<span class=\"df-stat ok\">entrada de ejemplo <b>'+fmtBytes(p.sample)+'</b> · sección 16</span>':'')+\n    (lastInv&&lastInv.counts&&lastInv.counts.modules?'<span class=\"df-stat ok\">reconocido <b>'+(lastInv.counts.tables||0)+'</b> tablas · <b>'+(lastInv.counts.https||0)+'</b> APIs · <b>'+(lastInv.counts.components||0)+'</b> componentes · <b>'+(lastInv.counts.steps||0)+'</b> steps con nombre</span>':'')+\n    '<span class=\"df-stat '+warn+'\">payload <b>'+fmtBytes(kb)+'</b> ≈ '+estTokens(p.text).toLocaleString()+' tokens'+(warn!=='ok'?' · puede exceder la ventana del asistente':'')+'</span>';\n}\n\n/* ---- Entrada: archivo, arrastre, pegado ---- */\nconst fileInput=$('file'),drop=$('drop');\nfunction loadFile(f){\n  if(!f)return;\n  log('Leyendo archivo \"'+f.name+'\" ('+fmtBytes(f.size)+')…','busy');setStatus('Leyendo archivo…','busy');\n  const r=new FileReader();\n  r.onload=()=>setJson(r.result,{append:false,source:'Archivo \"'+f.name+'\" ('+fmtBytes(r.result.length)+')'});\n  r.onerror=()=>{setStatus('No se pudo leer el archivo.','err');log('Error leyendo el archivo.','err');};\n  r.readAsText(f);\n}\n$('btnPick').addEventListener('click',e=>{e.preventDefault();fileInput.value='';fileInput.click();});\nfileInput.addEventListener('change',e=>loadFile(e.target.files[0]));\n['dragenter','dragover'].forEach(ev=>drop.addEventListener(ev,e=>{e.preventDefault();e.stopPropagation();drop.classList.add('over');}));\n['dragleave','drop'].forEach(ev=>drop.addEventListener(ev,e=>{e.preventDefault();e.stopPropagation();drop.classList.remove('over');}));\ndrop.addEventListener('drop',e=>loadFile(e.dataTransfer.files[0]));\nels.json.addEventListener('drop',e=>{if(e.dataTransfer.files.length){e.preventDefault();loadFile(e.dataTransfer.files[0]);}});\n\n$('pasteMode').querySelectorAll('button').forEach(b=>b.addEventListener('click',()=>{\n  $('pasteMode').querySelectorAll('button').forEach(x=>x.classList.toggle('on',x===b));\n  pasteMode=b.dataset.mode;\n  setStatus(pasteMode==='append'?'Modo \"Añadir al final\": cada Ctrl+V se concatena al JSON en memoria. Pega las partes en orden.':'Modo \"Reemplazar\": cada Ctrl+V sustituye el JSON.');\n}));\nfunction handlePaste(e){\n  const t=e.clipboardData&&e.clipboardData.getData('text/plain');\n  if(!t)return;\n  e.preventDefault();e.stopPropagation();\n  const append=pasteMode==='append'&&jsonBuffer.length>0;\n  setJson(t,{append,source:(append?'Parte añadida (':'Pegado (')+fmtBytes(t.length)+')'});\n}\nels.json.addEventListener('paste',handlePaste);\n// Pegar en cualquier parte DEL BLOQUE (no del resto de D2) también carga el JSON\nroot.addEventListener('paste',e=>{\n  const tag=(e.target&&e.target.tagName||'').toLowerCase();\n  if(e.target===els.json||tag==='input'||tag==='textarea')return;\n  handlePaste(e);\n});\nlet statTimer;els.json.addEventListener('input',()=>{if(els.json.readOnly)return;jsonBuffer=els.json.value;$('bufInfo').textContent=jsonBuffer.length?fmtBytes(jsonBuffer.length)+' en memoria':'vacío';clearTimeout(statTimer);statTimer=setTimeout(()=>refreshStats(),500);});\n\n$('btnFormat').addEventListener('click',()=>{try{const p=parseInput();const big=jsonBuffer.length>PREVIEW_LIMIT;jsonBuffer=JSON.stringify(p,null,big?0:2);renderViewer();refreshStats('Validado');}catch(e){refreshStats();}});\n$('btnClear').addEventListener('click',()=>{jsonBuffer='';els.json.readOnly=false;els.json.value='';els.stats.innerHTML='';$('bufInfo').textContent='vacío';setStatus('Listo. Carga el JSON para empezar.');log('Entrada limpiada.');});\n/* ---- perfil ---- */\n$('mode').addEventListener('change',()=>{\n  applyMode();\n  log(isAna()\n    ? 'Perfil Analista: la entrada es una idea escrita en palabras y la salida es una propuesta funcional con flujo paso a paso, caminos de error, escenarios simulados, diagrama y el ticket para Jira.'\n    : 'Perfil Desarrollador: la entrada es el JSON de un componente y la salida es la documentación técnica del flujo.','ok');\n});\n\n/* ---- opcionales ---- */\n$('optCtxOn').addEventListener('change',e=>{\n  $('ctxBox').hidden=!e.target.checked;\n  if(e.target.checked){$('ctxText').focus();log('Contexto del autor activado: el asistente lo lee antes que el JSON para orientar el documento (propósito, alcance, relaciones y simulaciones). El JSON sigue mandando sobre lo que el código hace.');}\n  checkContext();\n});\n$('ctxText').addEventListener('input',()=>{clearTimeout(__D2.g.__dfCtx);__D2.g.__dfCtx=setTimeout(checkContext,400);});\n$('optInputOn').addEventListener('change',e=>{\n  $('inputBox').hidden=!e.target.checked;\n  if(e.target.checked){$('inputJson').focus();log('Entrada de ejemplo activada: el documento incluirá la sección 16 con su recorrido por el flujo.');}\n  checkSampleInput();\n});\n$('inputJson').addEventListener('input',()=>{clearTimeout(__D2.g.__dfIn);__D2.g.__dfIn=setTimeout(checkSampleInput,400);});\n$('optAliasOn').addEventListener('change',e=>{\n  $('aliasBox').hidden=!e.target.checked;\n  if(e.target.checked&&!$('aliasRows').children.length)addAliasRow();\n  if(e.target.checked)log('Diccionario de nombres activado: los nombres que definas mandan sobre los detectados.');\n  countAliases();\n});\n$('optMultiOn').addEventListener('change',e=>{\n  $('multiBox').hidden=!e.target.checked;\n  if(e.target.checked){\n    if(!$('pieces').children.length)addPiece();\n    log('Modo varios componentes activado: el JSON del paso 1 es la pieza principal y las que añadas se documentan dentro del mismo flujo.');\n  }\n  renumberPieces();scheduleStats();\n});\n$('btnPieceAdd').addEventListener('click',()=>addPiece());\n$('optAliasReplace').addEventListener('change',async()=>{\n  if(!lastMdRaw)return;\n  const rep=applyAliasNames(lastMdRaw,readAliases());\n  lastMd=rep.md;els.mdRaw.textContent=lastMd;els.preview.innerHTML=renderMarkdown(lastMd);await renderMermaidIn(els.preview);\n  setStatus($('optAliasReplace').checked?'IDs sueltos reemplazados por los nombres del diccionario.':'Documento tal cual lo devolvió el asistente.','ok');\n});\n$('btnAliasAdd').addEventListener('click',()=>addAliasRow());\n$('btnAliasFill').addEventListener('click',()=>{\n  if(!lastInv||!lastInv.ids||!lastInv.ids.length){setStatus('Primero carga el JSON: los IDs se traen del análisis.','err');return;}\n  const have=new Set(Array.from($('aliasRows').children).map(r=>r.querySelector('[data-k=id]').value.trim()).filter(Boolean));\n  Array.from($('aliasRows').children).forEach(r=>{if(!r.querySelector('[data-k=id]').value.trim()&&!r.querySelector('[data-k=name]').value.trim())r.remove();});\n  let add=0;\n  lastInv.ids.forEach(x=>{if(have.has(x.id)||add>=25)return;addAliasRow(x.id,x.suggested||'',x.kind);add++;});\n  setStatus('Traídos '+add+' IDs detectados. Escribe el nombre que quieras para cada uno.','ok');\n  log('Diccionario: '+add+' IDs traídos del análisis del JSON.','ok');\n});\naddAliasRow();\napplyMode();\n\n$('btnResetPrompt').addEventListener('click',()=>{els.prompt.value=isAna()?ANALISTA_PROMPT:DEFAULT_PROMPT;setStatus('Prompt del perfil '+(isAna()?'Analista':'Desarrollador')+' restaurado.');});\n$('btnCopyPayload').addEventListener('click',()=>{try{const p=buildPayload();copyText(p.text).then(()=>setStatus('Payload copiado ('+fmtBytes(p.text.length)+').','ok'),()=>setStatus('No se pudo copiar.','err'));}catch(e){setStatus(e.message,'err');}});\n$('btnCopyCompact').addEventListener('click',()=>{try{const p=buildPayload();copyText(JSON.stringify(JSON.parse(p.jsonText),null,1)).then(()=>setStatus('JSON compactado copiado.','ok'),()=>setStatus('No se pudo copiar.','err'));}catch(e){setStatus(e.message,'err');}});\n\n/* ---- Prompt listo para pegar en otra IA (sin gastar tokens de D2) ---- */\n/* var, no let: applyMode() corre antes de esta línea y aiReset() los toca */\nvar aiText='',aiParts=[],aiPartIdx=0;\nvar AI_PART=45000, AI_VIEW=200000;\nfunction splitForChat(t){\n  if(t.length<=AI_PART)return [t];\n  const lines=t.split('\\n'),parts=[];let cur='';\n  lines.forEach(function(l){\n    if(cur.length+l.length+1>AI_PART&&cur){parts.push(cur);cur='';}\n    cur+=(cur?'\\n':'')+l;\n  });\n  if(cur)parts.push(cur);\n  const n=parts.length;\n  return parts.map(function(x,i){\n    let head;\n    if(i===0)head='### MENSAJE DIVIDIDO EN '+n+' PARTES · PARTE 1 de '+n+'\\nTe voy a pasar un texto largo repartido en '+n+' mensajes. NO respondas ni empieces a trabajar hasta recibir la parte '+n+'. Por ahora responde solo: \"recibida la parte 1 de '+n+'\".\\n\\n';\n    else if(i===n-1)head='### PARTE '+n+' de '+n+' · ÚLTIMA\\nYa tienes todo. Junta las '+n+' partes en orden, como si fueran un solo mensaje, y ejecuta las instrucciones de la parte 1 sobre el material completo.\\n\\n';\n    else head='### PARTE '+(i+1)+' de '+n+'\\nSigue esperando. Responde solo: \"recibida la parte '+(i+1)+' de '+n+'\".\\n\\n';\n    return head+x;\n  });\n}\nfunction aiReset(msg,kind){\n  aiText='';aiParts=[];aiPartIdx=0;\n  $('btnAiCopy').disabled=true;$('btnAiDownload').disabled=true;\n  $('btnAiPart').hidden=true;$('btnAiPart').textContent='Copiar por partes';\n  $('aiInfo').className='df-stat'+(kind?' '+kind:'');\n  $('aiInfo').textContent=msg||'sin preparar';\n}\nfunction aiStale(){\n  if(!aiText)return;\n  aiReset('el material cambió · vuelve a preparar','warn');\n  els.promptOut.textContent='';\n}\nfunction buildAiPrompt(){\n  let p;\n  try{p=buildPayload();}catch(e){setStatus(e.message,'err');log(e.message,'err');aiReset('no se pudo preparar','err');return null;}\n  showStats(p);\n  aiText=p.text;aiParts=splitForChat(aiText);aiPartIdx=0;\n  els.promptOut.textContent=aiText.length>AI_VIEW\n    ? aiText.slice(0,AI_VIEW)+'\\n\\n/* … '+(aiText.length-AI_VIEW).toLocaleString()+' caracteres más. La vista se recorta, pero \"Copiar todo\" y \"Descargar .txt\" entregan el texto completo. */'\n    : aiText;\n  $('btnAiCopy').disabled=false;$('btnAiDownload').disabled=false;\n  $('btnAiPart').hidden=aiParts.length<2;\n  if(aiParts.length>1)$('btnAiPart').textContent='Copiar parte 1 de '+aiParts.length;\n  $('aiInfo').className='df-stat ok';\n  $('aiInfo').textContent='listo · '+fmtBytes(aiText.length)+' ≈ '+estTokens(aiText).toLocaleString()+' tokens'+(aiParts.length>1?' · '+aiParts.length+' partes':'');\n  showTab('prompt');\n  log('Prompt para otra IA preparado: '+fmtBytes(aiText.length)+' ≈ '+estTokens(aiText).toLocaleString()+' tokens'+(aiParts.length>1?' · conviene pegarlo en '+aiParts.length+' partes':'')+'. No se envió nada al rush.','ok');\n  setStatus('Prompt listo para pegar en otra IA. No se consumieron tokens de D2.','ok');\n  return p;\n}\n$('btnAiBuild').addEventListener('click',()=>buildAiPrompt());\n$('btnAiCopy').addEventListener('click',()=>{\n  if(!aiText&&!buildAiPrompt())return;\n  copyText(aiText).then(\n    ()=>{setStatus('Prompt completo copiado ('+fmtBytes(aiText.length)+'). Pégalo en la IA que uses.','ok');log('Prompt copiado al portapapeles: '+fmtBytes(aiText.length)+'.','ok');},\n    ()=>setStatus('No se pudo copiar. Usa \"Descargar .txt\", o selecciona el texto en la pestaña \"Prompt para otra IA\".','err'));\n});\n$('btnAiPart').addEventListener('click',()=>{\n  if(!aiParts.length)return;\n  const part=aiParts[aiPartIdx],n=aiParts.length,k=aiPartIdx+1;\n  copyText(part).then(function(){\n    aiPartIdx=(aiPartIdx+1)%n;\n    $('btnAiPart').textContent='Copiar parte '+(aiPartIdx+1)+' de '+n;\n    setStatus(k<n?('Parte '+k+' de '+n+' copiada. Pégala y vuelve por la siguiente.'):('Parte '+n+' de '+n+' copiada: con esta la IA ya puede trabajar.'),'ok');\n    log('Copiada la parte '+k+' de '+n+' ('+fmtBytes(part.length)+').','ok');\n  },function(){setStatus('No se pudo copiar esa parte. Usa \"Descargar .txt\".','err');});\n});\n$('btnAiDownload').addEventListener('click',()=>{\n  if(!aiText&&!buildAiPrompt())return;\n  const name=($('mName').value.trim()||(isAna()?'propuesta':'documentacion')).replace(/[^\\w\\-]+/g,'_')+'_prompt';\n  try{\n    const blob=new Blob([aiText],{type:'text/plain;charset=utf-8'});\n    const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=name+'.txt';document.body.appendChild(a);a.click();\n    setTimeout(()=>{URL.revokeObjectURL(a.href);a.remove();},500);\n    log('Descarga iniciada: '+name+'.txt','ok');\n  }catch(e){setStatus('La descarga no está permitida aquí; usa \"Copiar todo\".','err');}\n});\n\n/* ---- Pestañas de salida ---- */\nconst tabMap={preview:'preview',md:'mdRaw',raw:'rawResp',prompt:'promptOut'};\nfunction showTab(name){\n  $('outTabs').querySelectorAll('button').forEach(x=>x.classList.toggle('on',x.dataset.tab===name));\n  Object.keys(tabMap).forEach(k=>els[tabMap[k]].classList.toggle('on',k===name));\n}\n$('outTabs').querySelectorAll('button').forEach(b=>b.addEventListener('click',()=>showTab(b.dataset.tab)));\n\n/* ---- Respuesta del rush → markdown ---- */\nfunction extractMarkdown(bodyText){\n  let data;try{data=JSON.parse(bodyText);}catch(e){return bodyText;}\n  const keys=['markdown','md','text','answer','response','result','output','content','message','reply','data','body','value','completion'];\n  const seen=new Set();\n  function dig(o,depth){\n    if(o==null||depth>6)return null;\n    if(typeof o==='string')return o;\n    if(Array.isArray(o)){for(const x of o){const r=dig(x,depth+1);if(r)return r;}return null;}\n    if(typeof o==='object'){\n      if(seen.has(o))return null;seen.add(o);\n      for(const k of keys){if(o[k]!==undefined){const r=dig(o[k],depth+1);if(r)return r;}}\n      for(const k of Object.keys(o)){const r=dig(o[k],depth+1);if(r&&r.length>200)return r;}\n    }\n    return null;\n  }\n  return dig(data,0)||bodyText;\n}\n/* Sustituye los IDs que hayan quedado sueltos por su nombre del diccionario,\n   respetando el glosario (sección 15) y las filas de tabla que ya son un mapeo. */\nfunction applyAliasNames(md,aliases){\n  if(!md||!aliases||!aliases.length||!$('optAliasReplace').checked)return {md:md,n:0};\n  const lines=md.split('\\n');\n  let from=-1,to=lines.length;\n  for(let i=0;i<lines.length;i++){\n    if(/^#{1,4}\\s*1?5[.)]\\s/.test(lines[i])||/^#{1,4}\\s.*glosario/i.test(lines[i])){\n      from=i;\n      for(let j=i+1;j<lines.length;j++){if(/^#{1,2}\\s/.test(lines[j])){to=j;break;}}\n      break;\n    }\n  }\n  let n=0;\n  const out=lines.map(function(ln,i){\n    if(from>=0&&i>=from&&i<to)return ln;          // glosario intacto\n    let s=ln;\n    aliases.forEach(function(a){\n      if(!a.id||!a.name||s.indexOf(a.id)<0)return;\n      if(/^\\s*\\|/.test(s)&&s.indexOf(a.name)>=0)return;  // fila de tabla que ya mapea nombre + ID\n      const before=s;\n      s=s.split(a.id).join(a.name);\n      if(s!==before)n++;\n    });\n    return s;\n  });\n  let res=out.join('\\n');\n  aliases.forEach(function(a){\n    const nm=a.name.replace(/[.*+?^${}()|[\\]\\\\]/g,'\\\\$&');\n    res=res.replace(new RegExp(nm+'\\\\s*\\\\(\\\\s*`?'+nm+'`?\\\\s*\\\\)','g'),a.name);\n    res=res.replace(new RegExp('`'+nm+'`\\\\s*\\\\(\\\\s*`'+nm+'`\\\\s*\\\\)','g'),'`'+a.name+'`');\n  });\n  return {md:res,n:n};\n}\nfunction cleanMd(md){\n  md=md.trim();\n  const m=md.match(/^```(?:markdown|md)?\\s*\\n([\\s\\S]*?)\\n```\\s*$/);\n  if(m)md=m[1];\n  return md;\n}\nasync function showResult(md,raw){\n  lastMdRaw=md;lastAliases=readAliases();\n  const rep=applyAliasNames(md,lastAliases);\n  if(rep.n)log('Diccionario aplicado sobre el documento: '+rep.n+' línea(s) donde quedaba un ID se reemplazaron por su nombre (glosario intacto).','ok');\n  md=rep.md;\n  lastMd=md;\n  els.mdRaw.textContent=md;\n  els.rawResp.textContent=raw;\n  els.preview.innerHTML=renderMarkdown(md);\n  $('btnCopyMd').disabled=$('btnDownload').disabled=!md;\n  const n=await renderMermaidIn(els.preview);\n  return n;\n}\nconst NET_HELP='Verificado externamente: el rush acepta POST application/json desde https://natura.data2.builders (CORS OK, HTTP 200). Si aun así falla aquí, es el entorno del bloque HTML de D2 (fetch envuelto por postMessage o CSP del iframe). Alternativa 100% D2: que un flujo del servidor (HttpRequest + sendRequest) llame al rush y deje \"answer\" en un Store que este bloque lea.';\nfunction explainNetworkError(e){\n  const m=String(e&&e.message||e);\n  if(/postMessage|cloned/i.test(m))return m+' — el fetch envuelto de D2 no acepta objetos no clonables; se usan transportes alternativos.';\n  return m+' — '+NET_HELP;\n}\n/* ---- Transportes HTTP: esquivan el fetch envuelto de D2 ---- */\nfunction xhrPost(url,body){\n  return new Promise((res,rej)=>{\n    try{\n      const x=new XMLHttpRequest();\n      x.open('POST',url,true);\n      x.setRequestHeader('Content-Type','application/json');\n      x.timeout=0;\n      x.onload=()=>res({status:x.status,statusText:x.statusText,text:x.responseText});\n      x.onerror=()=>rej(new Error('error de red (status '+x.status+')'));\n      x.ontimeout=()=>rej(new Error('timeout'));\n      x.onabort=()=>rej(new Error('abortado'));\n      x.send(body);\n    }catch(e){rej(e);}\n  });\n}\nlet __dfFrame=null;\nfunction nativeFetch(){\n  try{\n    if(!__dfFrame||!__dfFrame.contentWindow){__dfFrame=document.createElement('iframe');__dfFrame.style.display='none';__dfFrame.setAttribute('aria-hidden','true');document.body.appendChild(__dfFrame);__D2.off(function(){try{__dfFrame&&__dfFrame.remove();}catch(e){}});}\n    const w=__dfFrame.contentWindow;\n    return (w&&typeof w.fetch==='function')?w.fetch.bind(w):null;\n  }catch(e){return null;}\n}\nasync function fetchPost(fetchFn,url,body){\n  const r=await fetchFn(url,{method:'POST',headers:{'Content-Type':'application/json'},body:body});\n  return {status:r.status,statusText:r.statusText,text:await r.text()};\n}\nasync function doPost(url,body,onNote){\n  const attempts=[\n    ['XMLHttpRequest',()=>xhrPost(url,body)],\n    ['fetch nativo (iframe limpio)',()=>{const fn=nativeFetch();if(!fn)throw new Error('no disponible');return fetchPost(fn,url,body);}],\n    ['fetch de la página',()=>fetchPost(window.fetch,url,body)]\n  ];\n  const errors=[];\n  for(const [name,fn] of attempts){\n    try{const r=await fn();r.transport=name;return r;}\n    catch(e){const m=String(e&&e.message||e);errors.push(name+': '+m);onNote&&onNote('Transporte \"'+name+'\" falló: '+m+(attempts.indexOf(attempts.find(a=>a[0]===name))<attempts.length-1?' → probando el siguiente…':''));}\n  }\n  throw new Error('Ningún transporte pudo enviar la petición ['+errors.join(' | ')+']');\n}\n\nels.preview.addEventListener('click',function(e){\n  const b=e.target.closest?e.target.closest('.df-copy-mm'):null;\n  if(!b)return;\n  e.preventDefault();\n  const box=b.closest('.df-diagram');const code=box&&box.querySelector('code');\n  if(!code)return;\n  copyText(code.textContent).then(()=>{b.textContent='Copiado';setTimeout(()=>{b.textContent='Copiar código';},1500);},()=>setStatus('No se pudo copiar; selecciona el texto del bloque.','err'));\n});\n$('optDiagramOn').addEventListener('change',async e=>{\n  $('diagramBox').hidden=false;\n  log(e.target.checked?'Diagramas: se dibujan en la vista previa.':'Diagramas: solo se muestra el bloque Mermaid.');\n  if(lastMd){els.preview.innerHTML=renderMarkdown(lastMd);await renderMermaidIn(els.preview);}\n});\n\n/* ---- Generar ---- */\nasync function run(){\n  let payload;\n  try{payload=buildPayload();showStats(payload);}catch(e){setStatus(e.message,'err');log(e.message,'err');return;}\n  const url=$('optUrl').value.trim();\n  const myRun=++runId;\n  $('btnRun').disabled=true;$('btnCancel').disabled=false;\n  const body=JSON.stringify({text:payload.text});\n  log('Payload armado: prompt '+fmtBytes(payload.text.length-payload.jsonText.length)+' + JSON '+fmtBytes(payload.jsonText.length)+' = '+fmtBytes(body.length)+' ≈ '+estTokens(payload.text).toLocaleString()+' tokens');\n  const sentLine=log('POST → '+url+' · enviando '+fmtBytes(body.length)+'…','busy');\n  setStatus('Enviando al Virtual Assistant…','busy');\n  const t0=Date.now();\n  const tick=setInterval(()=>{if(myRun!==runId){clearInterval(tick);return;}const s=Math.round((Date.now()-t0)/1000);els.status.textContent='Esperando respuesta del Virtual Assistant… '+s+' s (revisa \"Executions\" del rush si quieres verlo llegar)';},1000);\n  try{\n    // OJO: sin AbortSignal ni objetos Headers — el fetch de D2 viaja por postMessage y no puede clonarlos\n    const res=await __D2.post(doPost,url,body,n=>log(n,'warn'));\n    if(myRun!==runId)return;\n    clearInterval(tick);\n    res.ok=res.status>=200&&res.status<300;\n    sentLine.className='ok';sentLine.querySelector('.m').textContent='POST enviado ('+fmtBytes(body.length)+', vía '+res.transport+') · respuesta HTTP '+res.status+' '+res.statusText+' en '+Math.round((Date.now()-t0)/1000)+' s';\n    const bodyText=res.text;\n    log('Cuerpo de respuesta recibido: '+fmtBytes(bodyText.length),res.ok?'':'warn');\n    if(!res.ok){els.rawResp.textContent=bodyText;setStatus('Error HTTP '+res.status+' '+res.statusText,'err');log('Error HTTP '+res.status+': '+bodyText.slice(0,300),'err');showTab('raw');return;}\n    const md=cleanMd(extractMarkdown(bodyText));\n    if(md===bodyText.trim()&&/^\\s*[\\[{]/.test(bodyText))log('No encontré un campo de texto reconocible en la respuesta JSON; se muestra el cuerpo completo. Revisa la pestaña \"Respuesta cruda\".','warn');\n    const nDiag=await showResult(md,bodyText);\n    showTab('preview');\n    setStatus((isAna()?'Propuesta generada en ':'Documentación generada en ')+Math.round((Date.now()-t0)/1000)+' s · '+md.length.toLocaleString()+' caracteres.','ok');\n    log('Markdown listo: '+md.length.toLocaleString()+' caracteres · '+(md.match(/^#{1,6}\\s/gm)||[]).length+' encabezados · '+nDiag+' diagrama(s) renderizado(s).','ok');\n  }catch(e){\n    clearInterval(tick);\n    if(myRun!==runId)return;\n    const msg=explainNetworkError(e);\n    setStatus('Error de red: '+String(e.message||e),'err');\n    sentLine.className='err';sentLine.querySelector('.m').textContent='Fallo al enviar/recibir: '+msg;\n  }finally{\n    if(myRun===runId){clearInterval(tick);$('btnRun').disabled=false;$('btnCancel').disabled=true;}\n  }\n}\n$('btnRun').addEventListener('click',run);\n$('btnPing').addEventListener('click',async()=>{\n  const url=$('optUrl').value.trim();\n  const body=JSON.stringify({text:'Responde únicamente con la palabra OK.'});\n  const line=log('Prueba de conexión → POST '+url+' ('+body.length+' B). Mira \"Executions\" del rush: si aparece una ejecución, la petición SÍ llega.','busy');\n  setStatus('Probando conexión…','busy');\n  const t0=Date.now();\n  try{\n    const res=await __D2.post(doPost,url,body,n=>log(n,'warn'));\n    const ok=res.status>=200&&res.status<300;\n    line.className=ok?'ok':'warn';line.querySelector('.m').textContent='Conexión '+(ok?'OK':'con error')+' (vía '+res.transport+'): HTTP '+res.status+' en '+Math.round((Date.now()-t0)/1000)+' s · respuesta: '+res.text.slice(0,160);\n    setStatus(ok?'Conexión con el rush verificada.':'El rush respondió HTTP '+res.status,ok?'ok':'err');\n  }catch(e){\n    line.className='err';line.querySelector('.m').textContent='Sin conexión: '+explainNetworkError(e);\n    setStatus('No hay comunicación con el rush (ver registro).','err');\n  }\n});\n$('btnCancel').addEventListener('click',()=>{runId++;$('btnRun').disabled=false;$('btnCancel').disabled=true;setStatus('Cancelado (la petición ya enviada seguirá ejecutándose en el rush, pero se ignorará su respuesta).','err');log('Cancelado por el usuario.','warn');});\nroot.addEventListener('keydown',e=>{if((e.ctrlKey||e.metaKey)&&e.key==='Enter'&&!$('btnRun').disabled){e.preventDefault();run();}});\n\n$('btnCopyMd').addEventListener('click',()=>copyText(lastMd).then(()=>setStatus('Markdown copiado al portapapeles.','ok'),()=>setStatus('No se pudo copiar; usa la pestaña Markdown y selecciona el texto.','err')));\n$('btnDownload').addEventListener('click',()=>{\n  const name=($('mName').value.trim()||(isAna()?'propuesta':'documentacion')).replace(/[^\\w\\-]+/g,'_');\n  try{\n    const blob=new Blob([lastMd],{type:'text/markdown;charset=utf-8'});\n    const a=document.createElement('a');a.href=URL.createObjectURL(blob);a.download=name+'.md';document.body.appendChild(a);a.click();setTimeout(()=>{URL.revokeObjectURL(a.href);a.remove();},500);\n    log('Descarga iniciada: '+name+'.md','ok');\n  }catch(e){setStatus('La descarga no está permitida en este entorno; usa \"Copiar .md\".','err');}\n});\n\n/* ---- Ajuste de alto del bloque de D2 (data2-player-block) ---- */\n(function(){\n  let host=root.parentElement;\n  while(host&&String(host.className||'').indexOf('data2-player-block')<0)host=host.parentElement;\n  if(!host)return;\n  host.style.overflow='visible';\n  let tmr=null;\n  const sync=()=>{const h=Math.ceil(root.getBoundingClientRect().height)+8,cur=parseFloat(host.style.height)||0;if(h>0&&Math.abs(h-cur)>4)host.style.height=h+'px';};\n  const syncd=()=>{clearTimeout(tmr);tmr=setTimeout(sync,140);};\n  syncd();[250,700,1500].forEach(ms=>setTimeout(sync,ms));\n  if(typeof ResizeObserver==='function')new ResizeObserver(syncd).observe(root);\n  root.addEventListener('toggle',syncd,true);root.addEventListener('click',syncd,true);\n})();\nlog('DocumentationFormer listo. Endpoint: '+$('optUrl').value);if(__D2.ready)__D2.ready({setJson:setJson,run:run,log:log});\n\n})();\n  //DF_SRC>>\n}\n\nfunction dfDrain(offs) { offs.splice(0).forEach(function (f) { try { f() } catch (e) { } }) }\nfunction dfKit(offs) {\n  const T = new Set(), I = new Set()\n  offs.push(function () { T.forEach(function (id) { clearTimeout(id) }); I.forEach(function (id) { clearInterval(id) }); T.clear(); I.clear() })\n  function st(fn, ms) { const a = [].slice.call(arguments, 2); const id = setTimeout(function () { T.delete(id); fn.apply(null, a) }, ms); T.add(id); return id }\n  function si(fn, ms) { const a = [].slice.call(arguments, 2); const id = setInterval(function () { fn.apply(null, a) }, ms); I.add(id); return id }\n  const RO0 = typeof ResizeObserver === 'function' ? ResizeObserver : null\n  const RO = RO0 ? class extends RO0 { constructor(cb) { super(cb); const me = this; offs.push(function () { try { me.disconnect() } catch (e) { } }) } } : undefined\n  return { setTimeout: st, setInterval: si, ResizeObserver: RO }\n}\nfunction dfBoot(d2) {\n  const host = d2.$('.df-host'); if (!host || DF_INST.get(d2)) return\n  const st = { offs: [] }; DF_INST.set(d2, st)\n  d2.onUnmount(function () { dfDrain(st.offs); DF_INST.delete(d2) })\n  host.innerHTML = DF_MARKUP\n  const k = dfKit(st.offs)\n  dfRun({\n    root: host.querySelector('#dfroot'), host: host, g: {}, off: function (f) { st.offs.push(f) },\n    post: function (doPost, url, body, onNote) { return dfPost(d2, k, doPost, url, body, onNote) },\n    ready: function (api) {\n      if (d2.param('ensaio') === false || d2.param('ensaioAuto') !== true) return\n      k.setTimeout(function () { api.setJson(DF_ENSAIO_JSON, { source: 'Ensayo automático' }); k.setTimeout(api.run, 400) }, 250)\n    }\n  }, k.setTimeout, k.setInterval, k.ResizeObserver)\n}\n\nexport default {\n  css: `.df-host{display:block;width:100%;height:100%;overflow:auto;overscroll-behavior:contain;box-sizing:border-box}`,\n  render(d2) { return `<div class=\"df-host\" data-d2-static></div>` },\n  mounted(d2) { dfBoot(d2) },\n  updated(d2) { dfBoot(d2) }\n}\n"}},"docRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"docRush"}}}},"ensaio":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ensaio"}}}},"ensaioAuto":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ensaioAuto"}}}},"envioDirecto":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"envioDirecto"}}}}}}}}}},{"_id":"65b2e47896f1fc092ed1ac14","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"3UcTJBMDap5uV1yKV_uLr","package":"natura","definition":{"params":{"actions":[{"params":{"actions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"data"}}}},{}]}}]},"component":"data2-core-flow@Parallel"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.0"}}}}]},"component":"data2-core-flow@Series"}}},{"_id":"66c7beb7fe3c9031e537cf88","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"PV4KIz6EZyjdWP2Eb7Laj","package":"natura","definition":{"params":{"order":[{"field":{"params":{"content":"time"},"component":"data2-core-primitives@String"},"order":"asc"}],"array":{"params":{"array":{"params":{"array":{"params":{"array":{"params":{"arrays":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages_1"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages_2"}}}}]},"component":"data2-core-functions@ArrayConcat"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.time"}}}}}}},"component":"data2-core-functions@ArrayFilter"},"field":{"params":{"content":"id"},"component":"data2-core-primitives@String"}},"component":"data2-core-functions@Uniq"},"mapper":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"sources":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}}},{"time":{"params":{"compare":{"params":{"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.time"}}}}},"component":"data2-core-functions@IsDate"},"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.time"}}}},"else":{"params":{"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.time"}}}}},"component":"data2-core-functions@DateParse"}},"component":"data2-core-flow@If"}}]},"component":"data2-core-functions@ObjectAssign"}},"component":"data2-core-functions@Function"}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-functions@Sort"}}},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5ecd05ded68ce41360f74b43","component":"data2-core-types@Component","params":{"extendable":{"placeholder":"children"},"component":"Block","package":"data2-core-primitives"}},{"_id":"61045854f302195bad7ea128","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@Spinner","params":{"spinner":{"component":"data2-core-types@Reference","params":{"reference":"spinner"}},"color":{"component":"data2-core-types@Reference","params":{"reference":"super.textColor"}},"width":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.width"}},"height":{"component":"data2-core-types@Reference","params":{"reference":"super.dimensions.height"}},"speed":{"component":"data2-core-types@Reference","params":{"reference":"speed"}},"size":{"component":"data2-core-types@Reference","params":{"reference":"super.textSize"}},"margin":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"margin"}},0]}}}}}},"component":"Spinner","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"6aba96349d2c4e1f33f104c2","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"-jguSAn1uKZQCYdzXdCWy","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"-jguSAn1uKZQCYdzXdCWy"}}}}}},{"_id":"6aba96349d2c4e1f33f104c3","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"AuCj8ZWG-hVnzOdB66Amc","package":"natura","definition":{"params":{"then":{"params":{"actions":[{"params":{"action":{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"agent"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"status agent "},"resultName":{"component":"data2-core-primitives@String","params":{"content":"status_agent"}}},"component":"data2-core-flow@Step"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dlcBFxPJbad7wz_jg2ovS"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"ticking"}}}}},"component":"data2-core-logical-operators@Not","displayName":"not timer start"},"then":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dlcBFxPJbad7wz_jg2ovS"}},"prop":"start"},"component":"data2-core-types@Interaction"}},"component":"data2-core-flow@If","displayName":"start Chat Sync Timer if not ticking"},{"params":{"then":{"params":{"actions":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.responding"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series","displayName":"typing and responding"},"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status_agent"}}}}},"component":"data2-core-logical-operators@Not","displayName":"agent "}},"component":"data2-core-flow@If","displayName":"not agent set typing and responding"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}},"component":"data2-core-types@Getter"},"item":{"params":{"index":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}},"component":"data2-core-types@Getter"},"sender":{"component":"data2-core-primitives@String","params":{"content":"HUMAN"}},"time":{"params":{},"component":"data2-core-functions@DateNow"},"text":{"params":{"then":{"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.text"}}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.text"}}}}},"component":"data2-core-flow@If"},"type":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"all"}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.text"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio_url"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}},"displayName":"text+audio"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.text"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"displayName":"text"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio_url"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"audio"}}},"displayName":"audio"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.image_url"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"image"}}},"displayName":"image"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.video_url"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"video"}}},"displayName":"video"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.document_url"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"document"}}},"displayName":"document"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.button_reply.id"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}}},"displayName":"button_reply"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.list_reply.id"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}},"displayName":"list_reply"}]},"component":"data2-core-flow@Switch"},"button_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.button_reply"}}}},"audio":{"params":{"then":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio"}}}},{"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio_url"}}}}}]},"component":"data2-core-logical-operators@Or"},"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.audio_url"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"},"list_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.list_reply"}}}},"document":{"params":{"then":{"filename":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.document_name"}}}},"caption":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.document_name"}}}},"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.document_url"}}}}},"compare":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.document_url"}}}}},"component":"data2-core-primitives@Boolean","break":true}},"component":"data2-core-flow@If"},"image":{"params":{"then":{"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.image_url"}}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.image_url"}}}}},"component":"data2-core-flow@If"},"video":{"params":{"then":{"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.video_url"}}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.video_url"}}}}},"component":"data2-core-flow@If"}},"component":"natura@0uu_dDZSyYUkc5XvKT3n8"}},"component":"data2-core-functions@ArrayPush"}},"component":"data2-core-types@Setter","disabled":false},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":50}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"},{"params":{"chat_id":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.chatId"}}}},"message":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},"country":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}}},"profile":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"profile"}}}},"playground":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}},"consultant_id":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"consultant_id"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"},"env":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"env"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"},"status":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"}},"component":"natura@TpwUvrSkneeAXUAnGrLRu"},{"params":{"then":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":"refresh"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":"refresh"}}]},"component":"data2-core-flow@Parallel","displayName":"Fetch session and messages"},"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status_agent"}}}}},"component":"data2-core-logical-operators@Not","displayName":"not agent"}},"component":"data2-core-flow@If","displayName":"update session/messages"},{"params":{"actions":{"params":{"array":{"params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"params":{"components":[{"params":{"subject":{"params":{"subject":{"params":{"array":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}},"mapper":{"params":{"content":"id"},"component":"data2-core-primitives@String"}},"component":"data2-core-functions@ArrayMap"},"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.id"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m.sender"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"HUMAN"}}},"component":"data2-core-comparison-operators@Different"}]},"component":"data2-core-logical-operators@And"}}}},"component":"data2-core-functions@ArrayFilter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"body":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}},"component":"data2-core-types@Getter"},"item":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m"}}}}},"component":"data2-core-functions@ArrayPush"}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":400}}},"component":"data2-core-flow@Delay"}]},"component":"data2-core-flow@Series"},"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}]}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-flow@Series","displayName":"Merge messages","disabled":false},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":400}}},"component":"data2-core-flow@Delay"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.responding"}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"imprimir mensajes"}},"data":{"data":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}},"component":"data2-core-types@Getter"},"message":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},"bot":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}},"component":"data2-core-types@Getter"}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr"}]},"component":"data2-core-flow@Series"},"compare":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.responding"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-logical-operators@Not","displayName":"not responding"},{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-logical-operators@Not","displayName":"not typing"}]},"component":"data2-core-flow@If","displayName":"send message if not sending"}}},{"_id":"66cbba00ca6a0c978932a28b","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"mgBbjVh0SaIqDfxHMTF9J","package":"natura","definition":{"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"text"}}}},"button_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}}}},"list_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}}},"audio_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"audio_url"}}}},"image_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image_url"}}}},"video_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"video_url"}}}},"document_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"document_url"}}}},"document_name":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"document_name"}}}}}}},{"_id":"6aba96349d2c4e1f33f104c1","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"r2Sbvp2xX8utXnEphcto7","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"r2Sbvp2xX8utXnEphcto7"}}}}}},{"_id":"6aba96349d2c4e1f33f104c4","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"TpwUvrSkneeAXUAnGrLRu","package":"natura","definition":{"params":{"module":{"params":{"else":{"params":{"defaultCase":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"hrfpkEcajH1t8HR61CXM2"}},"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"EC"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ecuador-entrypoint-hml"}}}},{"component":"data2-core-flow@Case","params":{"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"S5Smf36KVnpAgdlXt9xU4"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"CL"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"CO"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"xZ07GjXF6J-UE889zvhNv"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"MX"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"vRtbsuzMqlbWrwKCvjeS6"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"PE"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"gJnyPaWs1JQSQ8CPGfzCO"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"AR"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Y1O0oTlVo3601Jif1BxNB"}}}}]},"component":"data2-core-flow@Switch","displayName":"equal hml entrypoint"},"then":{"params":{"defaultCase":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"W_7c3KvURCeog4RW9kzlh"}},"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"EC"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ecuador-entrypoint-prod"}}}},{"component":"data2-core-flow@Case","params":{"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yrzdo5Ewbnp3ZaiLXV2rz"}},"expression":{"component":"data2-core-primitives@String","params":{"content":"CL"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"CO"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"oV37yW1tSod7tpFyqKkxy"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"MX"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"AKlWpcgDjGl6n-TK_j4OY"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"PE"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fNnAMBBznAO9wvOX5V9Jf"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"AR"}},"value":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"v4LXRPYyAgktlbttvZyTN"}}}}]},"component":"data2-core-flow@Switch","displayName":"send entrypoint"},"compare":{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"PRD"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.env"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"equal PRD"}},"component":"data2-core-flow@If","displayName":"check env "},"prop":"invoke","args":[{"body":{"message":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message"}}}},"chatid":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_id"}}}},"channel":{"component":"data2-core-primitives@String","params":{"content":"web"}},"country":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}}},"profile":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"profile"}}}},"env":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"env"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"},"consultant_id":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"consultant_id"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"},"status":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"status"}}}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"component":"data2-core-flow@If"},"playground":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playground"}}}}},"headers":{}}]},"component":"data2-core-types@Interaction","break":true}}},{"_id":"66c8ebc6453ee8e441e71b16","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"0uu_dDZSyYUkc5XvKT3n8","package":"natura","definition":{"index":{"params":{"components":[{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"index"}}}}},"component":"data2-core-primitives@Number","break":true},{"params":{"content":0},"component":"data2-core-primitives@Number"}]},"component":"data2-core-logical-operators@Or"},"sender":{"params":{"expression":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sender"}}}}},"component":"data2-core-functions@toLowerCase"},"defaultCase":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sender"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"assistant"}},"value":{"component":"data2-core-primitives@String","params":{"content":"ASSISTANT"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"bot"}},"value":{"component":"data2-core-primitives@String","params":{"content":"ASSISTANT"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"human"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HUMAN"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"user"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HUMAN"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"agent"}},"value":{"component":"data2-core-primitives@String","params":{"content":"AGENT"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"system"}},"value":{"component":"data2-core-primitives@String","params":{"content":"SYSTEM"}}}}]},"component":"data2-core-flow@Switch"},"time":{"params":{"date":{"params":{"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"time"}}}}},"component":"data2-core-functions@DateParse"}},"component":"data2-core-functions@DateFormat"},"id":{"params":{},"component":"data2-core-id@NanoId"},"assistant":{"params":{"then":{"faq":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant.faq"}}}},"usecase":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant.usecase"}}}}},"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant.usecase"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"assistant.faq"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-flow@If"},"type":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}},"component":"data2-core-types@Reference"},"text":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"audio":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"audio"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"audio"}},{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"image":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"image"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"image"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"video":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"video"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"video"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"interactive":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"interactive"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"interactive"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"document":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"document"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"document"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"sticker":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sticker"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"sticker"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"list_reply":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"button_reply":{"params":{"then":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}}},"component":"data2-core-types@Reference"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"type"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"all"}},{"component":"data2-core-primitives@String","params":{"content":"button_reply"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"},"chat_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_id"}}}},"session":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"session"}}},"component":"data2-core-types@Reference"},"agent":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"agent"}}}},"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sender"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"AGENT"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-flow@If"},"mime_type":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"mime_type"}}}},"agent_name":{"params":{"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"agent_name"}}}},"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sender"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"AGENT"}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-flow@If"}},"interactions":{"params":{"fields":{}},"component":"data2-core-types@FieldSet"}}},{"_id":"6abe70a02dfff06e13c634a4","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"mAfIC8_tJYiaSMW0RobYg","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"mAfIC8_tJYiaSMW0RobYg"}}}}}},{"_id":"6abe70a02dfff06e13c634a5","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"lf30RIzlPswvA_jYUR4u5","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"lf30RIzlPswvA_jYUR4u5"}}}}}},{"_id":"6abe8e613e2dc0ce7d2a9eff","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"6jYyIDb1rK9Yp7cc0qe4e","package":"natura","definition":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"message"}}],"body":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"op"}},"module":{"op":{"params":{"actions":[{"params":{"message":{"button_reply":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}}},"component":"data2-core-comparison-operators@Equal"},"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.button_reply"}}}}},"component":"data2-core-flow@If"},"list_reply":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.type"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}},"component":"data2-core-comparison-operators@Equal"},"then":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.list_reply"}}}}},"component":"data2-core-flow@If"}},"country":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"country"}}}}},"component":"natura@AuCj8ZWG-hVnzOdB66Amc"}]},"component":"data2-core-flow@Series"}}}}},"component":"data2-core-functions@Function","break":true}}},{"_id":"6abe8860418acdc10ef24c06","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"2W2NDYupjyt5eEgphM-Pr","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"2W2NDYupjyt5eEgphM-Pr"}}}}}},{"_id":"5f6cb5c4a575399a456635b9","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@DynamicVideo","params":{"children":{"component":"html@source","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}}}},"muted":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}},{"component":"data2-core-types@Reference","params":{"reference":"muted"}}]}},"source":{"component":"data2-core-types@Reference","params":{"reference":"videoFile"}},"playsInline":{"component":"data2-core-types@Reference","params":{"reference":"playsInline"}},"chapters":{"component":"data2-core-types@Reference","params":{"reference":"chapters"}},"autoPlay":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":false,"else":{"component":"data2-core-types@Reference","params":{"reference":"autoPlay"}}}},"loop":{"component":"data2-core-types@Reference","params":{"reference":"loop"}},"controls":{"component":"data2-core-types@Reference","params":{"reference":"showControls"}},"poster":{"component":"data2-core-types@Reference","params":{"reference":"poster"}},"style":{"position":"absolute","width":"100%","height":{"params":{"components":[{"params":{"reference":"style.height"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"100%"}}]},"component":"data2-core-logical-operators@Or"},"border":"none","padding":"none","overflow":"hidden"}}}}},"component":"VideoBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"6436f04bac93122e72906101","component":"data2-core-types@Component","params":{"extends":"data2-core-primitives@Block","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@i","params":{"aria-hidden":"true","style":{"display":"flex","justifyContent":"center","alignItems":"center","width":"100%","height":"100%","fontSize":{"params":{"reference":"size"},"component":"data2-core-types@Reference"},"color":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"else":{"params":{"components":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"},{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"}]},"component":"data2-core-logical-operators@Or"},"then":{"component":"data2-core-primitives@String","params":{"content":"transparent"}}},"component":"data2-core-flow@If"},"backgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"WebkitBackgroundClip":{"component":"data2-core-primitives@String","params":{"content":"text"}},"backgroundImage":{"params":{"compare":[{"params":{"subject":{"params":{"reference":"color"},"component":"data2-core-types@Reference"},"pattern":{"component":"data2-core-primitives@String","params":{"content":"gradient"}}},"component":"data2-core-functions@Includes"}],"then":{"params":{"portions":[{"params":{"reference":"color"},"component":"data2-core-types@Reference"}]},"component":"data2-core-functions@StringConcat"},"else":{"component":"data2-core-primitives@String","params":{"content":"linear-gradient(transparent,transparent)"}}},"component":"data2-core-flow@If"},"transition":{"component":"data2-core-primitives@String","params":{"content":"inherit"}}},"className":{"component":"data2-core-types@Reference","params":{"reference":"icon"}}}}}},"component":"IconBlock","package":"data2-blocks"}},{"_id":"5f804e93c8da12be8b498dfa","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@textarea","params":{"style":{"width":"100%","height":"100%","resize":"none","boxSizing":"border-box","background":{"params":{"content":"transparent"},"component":"data2-core-primitives@String"},"color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.cursor"}}}},{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":{"component":"data2-core-primitives@String","params":{"content":"not-allowed"}},"else":{"component":"data2-core-primitives@String","params":{"content":"auto"}}}}]},"component":"data2-core-logical-operators@Or"},"fontWeight":{"component":"data2-core-primitives@String","params":{"content":"inherit"}},"paddingLeft":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.left"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingRight":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.right"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingTop":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.top"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"paddingBottom":{"component":"data2-core-flow@If","params":{"compare":[{"params":{"comparisonSubject":{"params":{},"component":"data2-core-primitives@Undefined"},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}}},"component":"data2-core-comparison-operators@Different"}],"then":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"padding.bottom"}}}},{"component":"data2-core-primitives@String","params":{"content":"px"}}]},"component":"data2-core-functions@StringConcat"}}},"caretColor":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"caretColor"}}},"component":"data2-core-types@Reference"},"--d2-placeholder-color":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"placeholderTextColor"}}},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"super.textFormat.textAlign"}}},"component":"data2-core-types@Reference"}},"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"placeholder":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"placeholder"}},{"component":"data2-core-types@Reference","params":{"reference":"field"}}]}},"value":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"type"},"component":"data2-core-types@Reference"},"comparisonSubject":"date"}}],"then":{"component":"data2-core-functions@DateFormat","params":{"date":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}},"format":"YYYY-MM-DD"}},"else":{"component":"data2-core-types@DataLinkGetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record"}}}}}},"onChange":{"component":"data2-core-types@DataLinkSetter","params":{"dataset":{"component":"data2-core-types@Reference","params":{"reference":"dataset","source":"VIRTUAL_COMPONENT_PARAMS"}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field","source":"VIRTUAL_COMPONENT_PARAMS"}},"record":{"component":"data2-core-types@Reference","params":{"reference":"record","source":"VIRTUAL_COMPONENT_PARAMS"}},"recordUpsert":{"component":"data2-core-types@Reference","params":{"reference":"recordUpsert","source":"VIRTUAL_COMPONENT_PARAMS"}},"onChange":{"component":"data2-core-types@Reference","params":{"reference":"onChange","source":"VIRTUAL_COMPONENT_PARAMS"}},"mask":{"component":"data2-core-types@Reference","params":{"reference":"mask","source":"VIRTUAL_COMPONENT_PARAMS"}}}},"field":{"component":"data2-core-types@Reference","params":{"reference":"field"}},"tabIndex":{"component":"data2-core-types@Reference","params":{"reference":"tabIndex"}},"maxLength":{"component":"data2-core-types@Reference","params":{"reference":"maxLength"}},"opacity":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Identical","params":{"subject":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"comparisonSubject":true}}],"then":0.38,"else":1}},"disabled":{"params":{"reference":"disabled"},"component":"data2-core-types@Reference"},"onFocus":{"component":"data2-core-types@Reference","params":{"reference":"onFocus"}},"onBlur":{"component":"data2-core-types@Reference","params":{"reference":"onBlur"}},"onKeyPress":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"onKeyPress"}}}},"autoCapitalize":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"autoCapitalize"}}}},"autoComplete":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparision-operators@Equal","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"builder"}},"comparisonSubject":true}}],"then":"new-password","else":{"params":{"components":[{"params":{"reference":"autoComplete","source":"VIRTUAL_COMPONENT_PARAMS"},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":"off"}}]},"component":"data2-core-logical-operators@Or"}}},"spellCheck":{"params":{"expression":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"spellCheck"}}},"component":"data2-core-types@Reference"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"true"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"value":{"component":"data2-core-primitives@String","params":{"content":"false"}}}}]},"component":"data2-core-flow@Switch"},"lang":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"lang"}}}}}}}},"component":"DataTextBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"6abe8860418acdc10ef24c07","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"9rHMYfjk9FF5_T0hONlYt","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"9rHMYfjk9FF5_T0hONlYt"}}}}}},{"_id":"6ac3dcbc1f35620403195b27","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"5R94Ej5hKTCJKGS6RQfoq","package":"natura","definition":{"params":{"values":[{"params":{"components":[{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DeviceController"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"width"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-logical-operators@Or"},{"component":"data2-core-primitives@Number","params":{"content":120}}]},"component":"data2-core-numerical-operators@Subtract"},{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}}},{"component":"data2-core-primitives@Number","params":{"content":600}}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-functions@Min"}}},{"_id":"6abe8860418acdc10ef24c08","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"xDq2_hWqK4qE3AgRwC-Og","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"xDq2_hWqK4qE3AgRwC-Og"}}}}}},{"_id":"6abe8860418acdc10ef24c0a","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"eErAKBMldOmqdEgJlSylQ","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"eErAKBMldOmqdEgJlSylQ"}}}}}},{"_id":"6abe8860418acdc10ef24c09","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"SBPFUnxM3-4s9UfwqWds7","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"SBPFUnxM3-4s9UfwqWds7"}}}}}},{"_id":"6abe8860418acdc10ef24c0f","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"jkyG3DBCjV8-NV545KVc8","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"jkyG3DBCjV8-NV545KVc8"}}}}}},{"_id":"6abe8860418acdc10ef24c0b","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"FA2OyxFZZYvm_qJAX_b0A","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"FA2OyxFZZYvm_qJAX_b0A"}}}}}},{"_id":"6abe8860418acdc10ef24c0c","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"yLsNKO9lFSrMqMRNoTP2G","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"yLsNKO9lFSrMqMRNoTP2G"}}}}}},{"_id":"6abe8860418acdc10ef24c0d","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"C8QEZbGAzoCSzzIBo3YGN","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"C8QEZbGAzoCSzzIBo3YGN"}}}}}},{"_id":"6abeab5136a4476fe237dea3","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"0ZTUFcjjb7C5AGgsAM__E","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"0ZTUFcjjb7C5AGgsAM__E"}}}}}},{"_id":"63cad59c55ade32bcad59361","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-controls@MarkdownViewer","params":{"markdown":{"params":{"reference":"markdown"},"component":"data2-core-types@Reference"},"removeDefaultPadding":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"removeDefaultPadding"}}}}}}}},"component":"MarkdownViewer","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"66bc073d1343c1ba3fea40f6","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"component":"7HixitXSKJU54CCc5pv7r","package":"natura","definition":{"params":{"needle":{"params":{"pattern":"[^\\[|(](https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*))","flags":"gm"},"component":"data2-core-types@Regex"},"patch":{"component":"data2-core-primitives@String","params":{"content":"[$1]($1)"}},"haystack":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"string"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Replace"}}},{"_id":"5f51018da575399a457b2721","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-flow@If","params":{"compare":[{"component":"data2-core-comparison-operators@Identical","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"comparisonSubject":"no-repeat"}}],"else":{"component":"html@div","params":{"style":{"backgroundImage":{"component":"data2-core-functions@StringConcat","params":{"portions":["url(",{"component":"data2-core-types@Reference","params":{"reference":"src"}},")"]}},"backgroundSize":{"component":"data2-core-types@Reference","params":{"reference":"size"}},"backgroundPositionX":{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"backgroundPositionY":{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"backgroundRepeat":{"component":"data2-core-types@Reference","params":{"reference":"repeat"}},"position":"relative","width":"100%","height":"100%","border":"none","padding":"none","overflow":"hidden"}}},"then":{"component":"html@img","params":{"src":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"alt":{"component":"data2-core-types@Reference","params":{"reference":"src"}},"width":"100%","height":"100%","loading":"lazy","style":{"objectFit":{"params":{"defaultCase":"none","cases":[{"component":"data2-core-flow@Case","params":{"expression":"cover","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"contain","value":{"component":"data2-core-types@Reference","params":{"reference":"size"}}}},{"component":"data2-core-flow@Case","params":{"expression":"100%","value":"cover"}}],"expression":{"component":"data2-core-types@Reference","params":{"reference":"size"}}},"component":"data2-core-flow@Switch"},"objectPosition":{"component":"data2-core-functions@StringConcat","params":{"portions":[{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionX"}},"left"]}}," ",{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":"positionY"}},"top"]}}]}},"display":{"component":"data2-core-primitives@String","params":{"content":"block"}}}}}}}}},"component":"ImageBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"61438422fca3809432310874","component":"data2-core-types@Component","params":{"definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"html@a","params":{"rel":"noopener noreferrer","style":{"width":"100%","height":"100%","boxSizing":"border-box","color":{"params":{"reference":"super.textColor"},"component":"data2-core-types@Reference"},"border":"none","appearance":"none","outline":"none","cursor":"pointer","display":"flex","alignItems":"center","justifyContent":"center","position":"relative","textDecoration":"none"},"children":{"component":"html@span","params":{"style":{"width":"100%","display":"inline-block","position":"relative","whiteSpace":"pre-wrap","top":{"params":{"reference":"super.textFormat.top"},"component":"data2-core-types@Reference"},"left":{"params":{"reference":"super.textFormat.left"},"component":"data2-core-types@Reference"},"transform":{"params":{"reference":"super.textFormat.transform"},"component":"data2-core-types@Reference"},"lineHeight":{"params":{"reference":"super.textFormat.lineHeight"},"component":"data2-core-types@Reference"},"letterSpacing":{"params":{"reference":"super.textFormat.letterSpacing"},"component":"data2-core-types@Reference"},"textAlign":{"params":{"reference":"super.textFormat.textAlign"},"component":"data2-core-types@Reference"}},"children":{"params":{"reference":"label"},"component":"data2-core-types@Reference"}}},"href":{"params":{"reference":"link"},"component":"data2-core-types@Reference"},"target":{"params":{"reference":"target"},"component":"data2-core-types@Reference"}}}}},"component":"LinkBlock","package":"data2-blocks","extends":"data2-core-primitives@Block"}},{"_id":"6abe8860418acdc10ef24c0e","component":"data2-core-types@Component","system":"645b823726c1280637133f0e","params":{"extends":"data2-core-primitives@Block","package":"natura","component":"ejf5o7CYvs1-7bgmKWCE6","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"ejf5o7CYvs1-7bgmKWCE6"}}}}}}]}},{"reference":"ExternalComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f060d9b1ca96def42f3c40a","displayName":"Builder AuthStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"credentials":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"UsersDataSet"}},"sessionShared":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},"email":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"nR6Q9d7qdaPtZhJ28Q8Dy"},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true,"reference":"yPCJBTKo8q1Mw0B_3Kpwl"},"component":"data2-core-types@ArtboardReference"}}},"session":[{"component":"data2-core-types@DataSetColumnReference","params":{"column":"name"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"email"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"password"}},{"component":"data2-core-types@DataSetColumnReference","params":{"column":"status"}}],"sessionMetadata":{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"active"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.status"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is active user"}]},"component":"data2-core-logical-operators@And","displayName":"is active and has _id"}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $user"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-primitives@String","params":{"content":"@data2.app"}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user.email"}}}}},"component":"data2-core-functions@Includes","displayName":"isData2User"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.d2_app"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"management"}}]},"component":"data2-core-functions@Includes","displayName":"isData2App Exception"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"has_access"}},"action":{"params":{"compare":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}]},"component":"data2-core-logical-operators@Or"},"else":{"params":{"actions":[{"params":{"actions":[{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"component":"data2-core-logical-operators@Not"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check $metadata.system"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":"filter","args":[{"_id":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records.length"}}}}},"component":"data2-core-logical-operators@Not","displayName":"systems not found"},"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"}},"component":"data2-core-flow@If","displayName":"check system found"},{"params":{"actions":[{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"organization":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.organization._id"}}}}}]},"component":"data2-core-types@Interaction"},{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":"filter","args":[{"user":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$user._id"}}}},"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}}]},"component":"data2-core-types@Interaction"}]},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series","displayName":"common setup"},{"params":{"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"else":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"compare":{"params":{"components":{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"WuUa-VKHhW9uYU0E3-mJ8"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"mapper":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"system"}}],"body":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.visibility"}}}},"defaultCase":{"params":{"content":false},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"public"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"billing-owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}},{"component":"data2-core-primitives@String","params":{"content":"member"}}]},"component":"data2-core-functions@Includes","displayName":"has role with access"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"collaborator"}}},"component":"data2-core-comparison-operators@Equal","displayName":"is collaborator"}]},"component":"data2-core-logical-operators@And","displayName":"is org member and collaborator"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is collaborator"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is collaborator and has system access"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"private"}},"value":{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal","displayName":"is org member"},{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.role"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"owner"}},{"component":"data2-core-primitives@String","params":{"content":"admin"}}]},"component":"data2-core-functions@Includes","displayName":"is owner/admin"}]},"component":"data2-core-logical-operators@And","displayName":"has org member role with access"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is owner/admin"},{"params":{"components":[{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Ok6Tsu5XkS7r8PyW_7TyW"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"member"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"member.organization._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system.organization._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"is org member"},{"params":{"array":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"NqKAY34n2ffFL64zamp7t"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}},"component":"data2-core-types@Getter"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"access"}}],"body":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"access.system._id"}}}},"comparisonSubject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"system._id"}}}}},"component":"data2-core-comparison-operators@Equal"}}}},"component":"data2-core-functions@ArrayFind","displayName":"has system access"}]},"component":"data2-core-logical-operators@And","displayName":"is member and has system access"}]},"component":"data2-core-logical-operators@Or","displayName":"is owner/admin or has system access"}}}]},"component":"data2-core-flow@Switch"}}}},"component":"data2-core-functions@ArrayMap"}},"component":"data2-core-logical-operators@And","displayName":"has org member for all systems in request"}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"then":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-flow@If"}},"component":"data2-core-flow@Step"},{"params":{"then":{"component":"data2-core-flow@If","displayName":"management exception never picks the system","params":{"compare":{"component":"data2-core-logical-operators@Or","params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_user"}}}},{"component":"data2-core-logical-operators@Not","params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"is_data2_app_exception"}}}}}}]}},"then":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"else":{"d2_app":"management"}}},"else":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Invalid Credentials"}},"code":{"component":"data2-core-primitives@String","params":{"content":"401"}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"has_access"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-flow@Series"},"sessionExpiresIn":{"component":"data2-core-primitives@Number","params":{"content":604800}},"sessionRenewal":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-10-19T16:23:02.013Z","updateMetadata":{"updatedBy":{"user":"5f1609be1ca96def427e1559"}}},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6ac5a14da5470e06d325a1b0","component":"data2-interface-services@Timer","reference":"dlcBFxPJbad7wz_jg2ovS","system":"645b823726c1280637133f0e","params":{"interval":{"component":"data2-core-primitives@Number","params":{"content":12000}},"onTickBackup":{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Skip sync because it is already responding"}},"code":{"component":"data2-core-primitives@Number","params":{"content":400}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.responding"}}}}},"component":"data2-core-flow@If","displayName":"responding error"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":"refresh"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":"refresh"}}]},"component":"data2-core-flow@Parallel","displayName":"Fetch session and messages"},{"params":{"actions":[{"params":{"actions":[{"params":{"action":{"params":{"array":{"params":{"messages_1":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"messages_2":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}},"component":"natura@PV4KIz6EZyjdWP2Eb7Laj"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m._id"}}}}}}},"component":"data2-core-functions@ArrayFilter"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"next_messages"}}},"component":"data2-core-flow@Step"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages.length"}}}},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}}},"component":"data2-core-comparison-operators@EqualOrGreaterThan"},"then":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"},"else":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"}},"component":"data2-core-flow@If","displayName":"merge messages if new message"}]},"component":"data2-core-flow@Series","displayName":"merge messages"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.status"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"queue"}}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"PqjPbzpg-bFvxXV9qSA8T"}},"prop":"invoke","args":[{"body":{"chat_id":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.chat_id"}}}}}}]},"component":"data2-core-types@Interaction","disabled":false}},"component":"data2-core-flow@If","displayName":"ping if queue"}]},"component":"data2-core-flow@Parallel","displayName":"queue agent"}]},"component":"data2-core-flow@Series"},"onTick":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"lTQRb152dXh5ddifgEM_J"}},"prop":"connect"}}}},{"_id":"66fc6d8915f9e8caddf5993e","component":"data2-rush@HTTPListener","reference":"PqjPbzpg-bFvxXV9qSA8T","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5c02","component":"data2-rush@HTTPListener","reference":"v4LXRPYyAgktlbttvZyTN","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5c00","component":"data2-rush@HTTPListener","reference":"fNnAMBBznAO9wvOX5V9Jf","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5bfe","component":"data2-rush@HTTPListener","reference":"AKlWpcgDjGl6n-TK_j4OY","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5bff","component":"data2-rush@HTTPListener","reference":"oV37yW1tSod7tpFyqKkxy","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5bfd","component":"data2-rush@HTTPListener","reference":"yrzdo5Ewbnp3ZaiLXV2rz","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"66b3a27020eac162e1908dd8","component":"data2-rush@HTTPListener","reference":"ecuador-entrypoint-prod","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e86a6d65a88348be5d5c01","component":"data2-rush@HTTPListener","reference":"W_7c3KvURCeog4RW9kzlh","system":"645b823726c1280637133f0e","params":{},"versioning":"enabled","bundleId":"6ae0140e580bb624d29b686f"},{"_id":"68e3c0ef9604ba32c7dee8e7","component":"data2-rush@HTTPListener","reference":"Y1O0oTlVo3601Jif1BxNB","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"68b90a5483a081944e4262ea","component":"data2-rush@HTTPListener","reference":"gJnyPaWs1JQSQ8CPGfzCO","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"68b9048e83a081944e4262e2","component":"data2-rush@HTTPListener","reference":"vRtbsuzMqlbWrwKCvjeS6","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"68b904ae83a081944e4262e6","component":"data2-rush@HTTPListener","reference":"xZ07GjXF6J-UE889zvhNv","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"68b8c02b83a081944e4262de","component":"data2-rush@HTTPListener","reference":"S5Smf36KVnpAgdlXt9xU4","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"66b3a25720eac162e1908dd4","component":"data2-rush@HTTPListener","reference":"ecuador-entrypoint-hml","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"68b9a282bd8a7de1fc59e0fd","component":"data2-rush@HTTPListener","reference":"hrfpkEcajH1t8HR61CXM2","system":"645b823726c1280637133f0e","params":{},"versioning":"disabled","bundleId":null},{"_id":"66de16dc6dfc2aedc01f4206","component":"data2-interface-services@VoiceRecorderService","reference":"VowdlGfa4t188GpvchEa4","system":"645b823726c1280637133f0e","params":{"mimeType":{"component":"data2-core-primitives@String","params":{"content":"audio/mp3"}}}},{"_id":"6abecbe5c22250a5e9c2023f","component":"data2-interface-services@DialogsService","reference":"Kt8jmnpclBKw8oivjCx59","system":"645b823726c1280637133f0e","params":{"confirmArtboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"alertArtboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"},"promptArtboard":{"params":{"preventEvaluation":true,"reference":"FC0I7t93gAJSZ4dI7VxG_"},"component":"data2-core-types@ArtboardReference"}}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6abaa0b39d2c4e1f33f10549","component":"data2-core-primitives@Router","system":"645b823726c1280637133f0e","displayName":"ChatBot-HispanicaRouter","params":{"initialPath":{"component":"data2-core-primitives@String","params":{"content":"/"}},"splash":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"A2t8iV5RYFlnbK-DsVVlJ"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/:region?"}},"content":{"disabled":false,"component":"data2-core-types@ArtboardReference","params":{"reference":"5Z95qM5PeYeeC4O7OtFKo"}},"onEnter":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.initializing"}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.chatId"}},"value":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.query.c"}}}},{"params":{},"component":"data2-core-id@NanoId"}]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":"filter","args":[{"chat_id":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.chatId"}}}}}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}}},"component":"data2-core-flow@AwaitReady"},{"params":{"compare":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dlcBFxPJbad7wz_jg2ovS"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"ticking"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"},"then":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dlcBFxPJbad7wz_jg2ovS"}},"prop":"start"},"component":"data2-core-types@Interaction"},"else":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dlcBFxPJbad7wz_jg2ovS"}},"prop":"start"},"component":"data2-core-types@Interaction"}},"component":"data2-core-flow@If"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"lTQRb152dXh5ddifgEM_J"}},"prop":"connect"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"lTQRb152dXh5ddifgEM_J"}},"prop":"subscribe","args":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.chatId"}}}}]}}]},"component":"data2-core-flow@Series"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},[]]},"component":"data2-core-logical-operators@Or"}}},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.initializing"}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}]},"component":"data2-core-flow@Series"}}}]},"reference":"fVQzha7r_BHHuSVVJvMmd"},{"_id":"6aba96039d2c4e1f33f104bc","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"Chatroom Artboard Refactor","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":583,"height":768,"exactWidth":583.25,"exactHeight":768}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(251,118,13,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"alternativeArtboards":{"params":{},"component":"data2-core-types@ResponsiveArtboards"}},"index":205,"reference":"5Z95qM5PeYeeC4O7OtFKo"},{"_id":"6abbe0bc8819561bd07d38a5","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"Chatbot Splash ","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":508,"height":407,"exactWidth":507.95,"exactHeight":407.43}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(245,243,239,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":219,"reference":"A2t8iV5RYFlnbK-DsVVlJ"},{"_id":"6aba96039d2c4e1f33f104bd","parent":"6aba96039d2c4e1f33f104bc","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":583,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"right":true,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"U6pOeAvCJ5Ob5_PgsLGvW"}}},"index":1},{"_id":"6aba96039d2c4e1f33f104be","parent":"6aba96039d2c4e1f33f104bc","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":583,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-1,"y":0,"exactX":-0.99,"exactY":0,"top":true,"left":true,"bottom":true,"growV":false,"right":true,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"fRASD__eyrT7AluAr-ayI"}},"hide":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.initializing"}}}}},"component":"data2-core-logical-operators@Not"},"opacity":{"params":{"compare":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"builder"}}},"component":"data2-core-types@Reference"},"else":{"disabled":false,"component":"data2-core-types@Opacity","params":{}},"then":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":0}}},"component":"data2-core-flow@If"},"index":{"component":"data2-core-primitives@Number","params":{"content":1}}},"index":2},{"_id":"6abbe0bc8819561bd07d38a6","parent":"6abbe0bc8819561bd07d38a5","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.49)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}},"offset":"100%"}}],"angle":235}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"QC1yDqsr3541Xhjo47S7I"}},"skipServerSideProcessing":true,"size":"contain","positionX":"center","positionY":"center","repeat":"no-repeat"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":175,"height":95,"exactWidth":174.51,"exactHeight":95.31}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":167,"y":156,"exactX":false,"exactY":false,"left":false,"top":false,"bottom":false,"growV":false}}},"index":0},{"_id":"6abbe0bc8819561bd07d38a7","parent":"6abbe0bc8819561bd07d38a5","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":321,"height":52,"exactWidth":320.52}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":94,"y":299,"exactX":false,"exactY":false}},"text":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SessionsDataSet"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"interactionError.message"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"SessionsDataSet"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"interactionError"}}}}]},"component":"data2-core-logical-operators@Or"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(243,63,63,1)"}}}},{"_id":"6abfd36b61464dae99bda405","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"chatbot","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":708,"exactWidth":421,"exactHeight":708}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"offset":"97%"}}]}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background","break":false}]},"component":"data2-core-types@Fill","break":false,"disabled":false},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[]},"index":199,"reference":"U6pOeAvCJ5Ob5_PgsLGvW"},{"_id":"6abbe0bc8819561bd07d38a3","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"Chatbot Loading","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":508,"height":407,"exactWidth":507.95,"exactHeight":407.43}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,151,59,1)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,98,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(244,165,50,1)"}},"offset":"100%"}}],"angle":255,"type":"linear"}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":217,"reference":"fRASD__eyrT7AluAr-ayI"},{"_id":"6abfd36b61464dae99bda406","parent":"6abfd36b61464dae99bda405","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"main-container","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":708,"exactWidth":420.65,"exactHeight":707.67}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false,"fixed":false}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":false}},"childrenMode":"reversed-rows","fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(245,243,239,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,235,226,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,235,226,1)"}},"offset":"42%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,235,226,1)"}},"offset":"83%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,235,226,1)"}},"offset":"100%"}}],"angle":140}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}}},"index":0},{"_id":"6abbe0bc8819561bd07d38a4","parent":"6abbe0bc8819561bd07d38a3","component":"data2-blocks@Spinner","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":45,"height":53,"exactWidth":44.67,"exactHeight":52.83}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":232,"y":177,"exactX":false,"exactY":false}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"spinner":"Dot"}},{"_id":"6abfd36b61464dae99bda41e","parent":"6abfd36b61464dae99bda406","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"background","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yWkGb2GDnsXfflMKMbfGK"}},"skipServerSideProcessing":true,"positionX":"center","positionY":"center","repeat":"repeat"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":708,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":true,"growV":false,"right":true,"growH":false}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":6}},"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}]},"index":0},{"_id":"6abfd36b61464dae99bda407","parent":"6abfd36b61464dae99bda406","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messages-main","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"exactWidth":421,"exactHeight":false,"height":{"params":{"components":[{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"height"}}}},{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"isPlaying"}}}}},"component":"data2-core-logical-operators@Not"}],"else":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DeviceController"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"height"}}}},"then":{"params":{"content":"685"},"component":"data2-core-primitives@Number"}},"component":"data2-core-flow@If"}]},"component":"data2-core-logical-operators@Or"},{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"height"}},"module":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"getBoundingClientRect"},"break":false},"module":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"querySelector"}},"args":[{"component":"data2-core-primitives@String","params":{"content":"#bottombar"}}],"module":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"document"}},"module":{"params":{},"component":"data2-core-web@Window"}}}}}}},"observe_fix_scroll":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.observe_fix_scroll"}}}}}},{"component":"data2-core-primitives@Number","params":{"content":62}}]},"component":"data2-core-numerical-operators@Subtract"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"exactX":false,"exactY":false,"bottom":false,"left":true,"top":true,"growV":false,"right":true,"growH":false,"fixed":false,"y":65}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true,"hideScrollBar":false}},"childrenMode":"reversed-rows","fill":{"disabled":true,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(24,0,255,0.2)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"id":{"component":"data2-core-primitives@String","params":{"content":"d2_chatbot"}},"children":{"locked":true}},"index":1},{"_id":"6abfd36b61464dae99bda415","parent":"6abfd36b61464dae99bda406","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"topBar","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":62,"exactWidth":421,"exactHeight":62}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false,"fixed":false,"bottom":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":2},{"_id":"6abfd36b61464dae99bda41d","parent":"6abfd36b61464dae99bda406","component":"natura@-jguSAn1uKZQCYdzXdCWy","system":"645b823726c1280637133f0e","displayName":"BottomBar","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"exactWidth":false,"exactHeight":false,"growHeightWithContent":false,"minHeight":92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-2,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false,"bottom":false}},"childrenMode":"rows","id":{"component":"data2-core-primitives@String","params":{"content":"bottombar"}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","spread":"2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(209,209,209,0.08)"}},"blur":"4"}}],"opacity":{"disabled":true,"component":"data2-core-types@Opacity","params":{"value":100}}},"dataset":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"field":{"params":{"content":"input"},"component":"data2-core-primitives@String"},"hide_mic":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"messageSend":{"params":{"actions":[{"params":{"action":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}}},"resultName":{"component":"data2-core-primitives@String","params":{"content":"text"}}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"audio_url"}},"action":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-flow@Step"},{"params":{"resultName":{"component":"data2-core-primitives@String","params":{"content":"attachment"}},"action":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment"}}},"component":"data2-core-types@Getter"}},"component":"data2-core-flow@Step"},{"params":{"action":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"text"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"params":{"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"text"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"text"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"content":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"audio_url"}}}}},"component":"data2-core-primitives@Boolean","break":true},"value":{"params":{"audio_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"audio_url"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"audio recording"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"image/png"}},{"component":"data2-core-primitives@String","params":{"content":"image/jpg"}},{"component":"data2-core-primitives@String","params":{"content":"image/jpeg"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.contentType"}}}}},"component":"data2-core-functions@Includes"},"value":{"params":{"image_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.fileUrl"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"images"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"video/mp4"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.contentType"}}}}},"component":"data2-core-functions@Includes"},"value":{"params":{"video_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.fileUrl"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"videos"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"audio/mp3"}},{"component":"data2-core-primitives@String","params":{"content":"audio/ogg"}},{"component":"data2-core-primitives@String","params":{"content":"audio/oga"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.contentType"}}}}},"component":"data2-core-functions@Includes"},"value":{"params":{"audio_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.fileUrl"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"audio"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"application/pdf"}}],"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.contentType"}}}}},"component":"data2-core-functions@Includes"},"value":{"params":{"document_url":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.fileUrl"}}}},"document_name":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"attachment.name"}}}}},"component":"natura@mgBbjVh0SaIqDfxHMTF9J"}},"displayName":"documents"}]},"component":"data2-core-flow@Switch"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"message_body"}}},"component":"data2-core-flow@Step"},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-flow@Delay"},{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}},"value":{"component":"data2-core-primitives@String","params":{"content":""}}},"disabled":false},{"component":"data2-core-types@Setter","params":{"value":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}},"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}},"value":{"params":{},"component":"data2-core-primitives@Null"}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Setter","params":{"value":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment_state"}},"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment"}},"value":{"params":{},"component":"data2-core-primitives@Null"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series","displayName":"Reset store","disabled":false},{"params":{"message":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message_body"}}}},"country":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.query.country"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.country"}}}},{"params":{"then":{"params":{"expression":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.region"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"AG"}},"value":{"component":"data2-core-primitives@String","params":{"content":"AR"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"PE"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PE"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"CL"}},"value":{"component":"data2-core-primitives@String","params":{"content":"CL"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"EC"}},"value":{"component":"data2-core-primitives@String","params":{"content":"EC"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"CO"}},"value":{"component":"data2-core-primitives@String","params":{"content":"CO"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"MX"}},"value":{"component":"data2-core-primitives@String","params":{"content":"MX"}}}}]},"component":"data2-core-flow@Switch"},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.region"}}}}},"component":"data2-core-flow@If"}]},"component":"data2-core-logical-operators@Or"}},"component":"natura@AuCj8ZWG-hVnzOdB66Amc","disabled":false}]},"component":"data2-core-flow@Series"},"resetChat":{"params":{"then":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":"open","args":[{"component":"data2-core-primitives@String","params":{"content":"/"}},"_self"]},"component":"data2-core-types@Interaction"},"compare":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"completed"}},{"component":"data2-core-primitives@String","params":{"content":"cancelled"}}],"pattern":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.status"}}}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"}},"index":3},{"_id":"6ac3e0d71f35620403195b2b","parent":"6abfd36b61464dae99bda406","component":"natura@r2Sbvp2xX8utXnEphcto7","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"yWkGb2GDnsXfflMKMbfGK"}},"skipServerSideProcessing":true,"positionX":"center","positionY":"center","repeat":"repeat"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":615,"exactWidth":false,"exactHeight":615.36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":0,"exactX":1.64,"exactY":0,"top":true,"left":true,"bottom":true,"growV":false,"right":true,"growH":false,"fixed":false}},"opacity":{"disabled":true,"component":"data2-core-types@Opacity","params":{"value":6}},"hide":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}}},"children":{"locked":true}},"index":4},{"_id":"6abfd36b61464dae99bda408","parent":"6abfd36b61464dae99bda407","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"repeaterContainer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":613,"exactWidth":false,"exactHeight":613.0300000000001,"growHeightWithContent":true},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"exactX":false,"exactY":false,"bottom":false,"left":true,"top":true,"growV":false,"right":true,"growH":false,"fixed":false,"y":0}},"scroll":{"disabled":true,"component":"data2-core-types@Scroll","params":{"y":true,"hideScrollBar":true}},"childrenMode":"rows","children":{"locked":true}},"index":0},{"_id":"6abfd36b61464dae99bda416","parent":"6abfd36b61464dae99bda415","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"TopbarContainer","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"},"disabled":false},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(235,102,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(235,102,25,1)"}},"offset":"100%"}}],"angle":180}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":62,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":0,"exactY":0,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"ignoreMouseEvents":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"width":{"bottom":"1"},"color":"#c9c9c9"}}},"index":0},{"_id":"6abfd36b61464dae99bda409","parent":"6abfd36b61464dae99bda408","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageRepeater","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,0,0,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"bottom":true,"left":true,"top":true,"growV":false,"right":true,"growH":false,"fixed":false}},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"message"}},"childrenMode":"rows","scroll":{"disabled":true,"component":"data2-core-types@Scroll","params":{"y":true}},"repeat":{"params":{"array":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}]},"component":"data2-core-logical-operators@Or"},"order":[{"field":{"component":"data2-core-primitives@String","params":{"content":"index"}},"order":"asc"}]},"component":"data2-core-functions@Sort"},"shadow":[],"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":584,"exactWidth":421,"exactHeight":584,"growHeightWithContent":true}},"children":{"locked":true}},"index":0},{"_id":"6abfd36b61464dae99bda414","parent":"6abfd36b61464dae99bda408","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageBorder","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":10,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"exactX":false,"exactY":false,"left":true,"top":true,"right":true,"growH":false,"fixed":false,"bottom":false,"growV":false,"y":0}},"id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}},"children":{"locked":true}},"index":1},{"_id":"6abfd400e5e0dc4d5bd6397f","parent":"6abfd36b61464dae99bda416","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Icono","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.49)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}},"offset":"100%"}}],"angle":235}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"_QnF6HwaqoLtawkiVc1fm"}},"skipServerSideProcessing":true,"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":55,"height":55,"exactWidth":54.54,"exactHeight":54.63}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":11,"y":2,"exactX":11.100000000000001,"exactY":1.71,"left":true,"top":false,"bottom":false,"growV":false}},"onVisibleOnScreen":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.observe_fix_scroll"}},"value":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-types@Setter"},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"47"},"color":"#fe7000","width":{"top":"1","right":"1","left":"1","bottom":"1"}}},"onClick":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"imprimir mensajes"}},"data":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},"store":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(7,7,7,0.16)"}},"offsetX":"1","offsetY":"-1","blur":"34"}}],"onMouseEnter":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"imprimir mensajes"}},"data":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},"store":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr"},"text":""},"index":0},{"_id":"6ac64764e8db3aa99f7ada9f","parent":"6abfd36b61464dae99bda416","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"online","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(46,158,106,1)"},"disabled":false},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.49)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}},"offset":"100%"}}],"angle":235}},"image":{"component":"data2-core-types@String","params":{"reference":"_QnF6HwaqoLtawkiVc1fm"},"disabled":true},"skipServerSideProcessing":true,"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":14,"height":14,"exactWidth":13.69,"exactHeight":14.36}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":50,"exactX":49.760000000000005,"exactY":41.760000000000005,"left":true,"top":false,"bottom":false,"growV":false,"y":42}},"onVisibleOnScreen":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.observe_fix_scroll"}},"value":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-types@Setter"},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"47"},"color":"#ffffff","width":{"top":"1","right":"1","left":"1","bottom":"1"}}},"onClick":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"imprimir mensajes"}},"data":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},"store":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr"},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"outset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(7,7,7,0.16)"}},"offsetX":"1","offsetY":"-1","blur":"34"}}],"onMouseEnter":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"imprimir mensajes"}},"data":{"key":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},"store":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr"},"text":""},"index":0},{"_id":"6abfd36b61464dae99bda419","parent":"6abfd36b61464dae99bda416","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Text","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":348,"height":42,"exactHeight":42,"exactWidth":347.8}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":65,"y":10,"exactX":65.2,"exactY":false,"top":false,"left":true,"right":true,"growH":false}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":3},{"_id":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"message-bottom-refactor","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":76,"exactWidth":421,"exactHeight":76}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"index":203,"reference":"-jguSAn1uKZQCYdzXdCWy"},{"_id":"6aba96349d2c4e1f33f104df","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"Hover","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(26,26,26,1)"}},"offset":"97%"}}]}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background","break":false}]},"component":"data2-core-types@Fill","break":false,"disabled":true},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}},"componentStates":[],"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":708,"exactWidth":421,"exactHeight":708}}},"index":199,"reference":"r2Sbvp2xX8utXnEphcto7"},{"_id":"6abfd36b61464dae99bda410","parent":"6abfd36b61464dae99bda409","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Date","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":45,"exactWidth":false,"exactHeight":45},"disabled":false},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"childrenMode":"cols","fill":{"disabled":true,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,0,0,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeaterIndex"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"params":{"content":0},"component":"data2-core-primitives@Number"}},"component":"data2-core-comparison-operators@Equal"},{"params":{"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":120000}},"subject":{"params":{"content":{"params":{"components":[{"params":{"date":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.time"}}},"component":"data2-core-types@Reference"},"format":{"component":"data2-core-primitives@String","params":{"content":"x"}}},"component":"data2-core-functions@DateFormat"},{"params":{"date":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"data.messages."}},{"params":{"components":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeaterIndex"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@Number","params":{"content":1}}]},"component":"data2-core-numerical-operators@Subtract"},{"component":"data2-core-primitives@String","params":{"content":".time"}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-types@Getter"},"format":{"component":"data2-core-primitives@String","params":{"content":"x"}}},"component":"data2-core-functions@DateFormat"}]},"component":"data2-core-numerical-operators@Subtract"}},"component":"data2-core-primitives@Number","break":true}},"component":"data2-core-comparison-operators@GreaterThan"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"},"ignoreMouseEvents":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0},{"_id":"6abfd36b61464dae99bda40e","parent":"6abfd36b61464dae99bda409","component":"natura@mAfIC8_tJYiaSMW0RobYg","system":"645b823726c1280637133f0e","displayName":"userMessage","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":421,"exactHeight":92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false,"exactX":false,"exactY":false}},"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"HUMAN"}}},"component":"data2-core-comparison-operators@Different"}},"width":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}},"component":"data2-core-types@Reference"},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater"}}},"component":"data2-core-types@Reference"}},"index":1},{"_id":"6abfd36b61464dae99bda40f","parent":"6abfd36b61464dae99bda409","component":"natura@lf30RIzlPswvA_jYUR4u5","system":"645b823726c1280637133f0e","displayName":"assistantMessage","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":421,"exactHeight":92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"20","exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"ASSISTANT"}}},"component":"data2-core-comparison-operators@Different"}},"width":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}},"component":"data2-core-types@Reference"},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater"}}},"component":"data2-core-types@Reference"},"on_reply_action":{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeaterIndex"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}},{"component":"data2-core-primitives@Number","params":{"content":1}}]},"component":"data2-core-numerical-operators@Subtract"}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"country":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.query.country"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.country"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"natura@6jYyIDb1rK9Yp7cc0qe4e"}},"component":"data2-core-flow@If"}},"index":2},{"_id":"6abfd36b61464dae99bda412","parent":"6abfd36b61464dae99bda409","component":"natura@lf30RIzlPswvA_jYUR4u5","system":"645b823726c1280637133f0e","displayName":"agentMessage","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":421,"exactHeight":92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"20","exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"AGENT"}}},"component":"data2-core-comparison-operators@Different"}},"width":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}},"component":"data2-core-types@Reference"},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater"}}},"component":"data2-core-types@Reference"}},"index":3},{"_id":"6abfd36b61464dae99bda413","parent":"6abfd36b61464dae99bda409","component":"natura@2W2NDYupjyt5eEgphM-Pr","system":"645b823726c1280637133f0e","displayName":"systemMessage","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":421,"exactHeight":92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"20","exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"hide":{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"SYSTEM"}}},"component":"data2-core-comparison-operators@Different"}},"width":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}},"component":"data2-core-types@Reference"},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater"}}},"component":"data2-core-types@Reference"}},"index":3},{"_id":"6abfd36b61464dae99bda40a","parent":"6abfd36b61464dae99bda409","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"typingMessageItemContainer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":92,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":"0","y":10,"exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"cols","hide":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}}}}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeaterIndex"}}}},"comparisonSubject":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}},{"component":"data2-core-primitives@Number","params":{"content":1}}]},"component":"data2-core-numerical-operators@Subtract"}},"component":"data2-core-comparison-operators@Different"}]},"component":"data2-core-logical-operators@Or"},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":33}}},"index":6},{"_id":"6abfdadada84dbb4e46300fd","parent":"6abfd36b61464dae99bda419","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":274,"height":20,"exactHeight":false,"exactWidth":274.32}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":4,"exactX":10.42,"exactY":3.82,"top":true,"left":true,"right":false,"growH":false}},"text":"Asistente Virtual AVI Natura","textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"fontWeight":500}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"16"}},"font":{"params":{"content":"Inter\n","fontFamily":"Inter"},"component":"data2-core-web@GoogleFont"}},"index":0},{"_id":"6abfdadada84dbb4e46300fa","parent":"6abfd36b61464dae99bda419","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":323,"height":17,"exactWidth":322.78999999999996,"exactHeight":16.96}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":11,"y":22,"exactX":11.06,"exactY":21.83,"left":true,"bottom":false,"top":true,"growV":false}},"text":{"params":{"then":{"component":"data2-core-primitives@String","params":{"content":"escribiendo..."}},"compare":{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}}},"component":"data2-core-types@Getter"},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"},"else":"Ecuador, Colombia, México, Argentina, Chile, Perú."},"component":"data2-core-flow@If"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"bottom","fontWeight":400}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":13}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}},"textColor":{"params":{"then":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,106,19,1)"}},"compare":{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.typing"}}},"component":"data2-core-types@Getter"},"comparisonSubject":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-comparison-operators@Equal"},"else":{"disabled":false,"component":"data2-core-types@Color","params":{}}},"component":"data2-core-flow@If"}},"index":2},{"_id":"6aba96349d2c4e1f33f10507","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":314,"height":42,"exactWidth":314.42,"exactHeight":42}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":15,"y":10,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"text":{"component":"data2-core-primitives@String","params":{"content":"Iniciar nueva atención"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(51,51,51,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}}},"component":"data2-core-logical-operators@Not"},"onClick":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}}},"index":0},{"_id":"6aba96349d2c4e1f33f10505","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"resetChat","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"600"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"dashed"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"372","y":"10","exactX":false,"exactY":false,"right":true,"top":true}},"children":{"locked":true},"cursor":"pointer","onClick":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6aba96349d2c4e1f33f10505"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6aba96349d2c4e1f33f10505"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","offsetY":"0","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(84,84,84,0.2)"}},"spread":"1"}}],"hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}}},"component":"data2-core-logical-operators@Not"},"tooltip":{"component":"data2-core-primitives@String","params":{"content":"Iniciar novo atendimento"}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":62}}},"index":1},{"_id":"6aba96349d2c4e1f33f104fe","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"sendButton","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"42"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"solid"},"disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"372","y":"10","exactX":false,"exactY":false,"right":true,"top":true}},"children":{"locked":true},"cursor":"pointer","onClick":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageSend"}}}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6aba96349d2c4e1f33f104fe"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6aba96349d2c4e1f33f104fe"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"inset","offsetY":"0","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(243,243,243,1)"}},"spread":"1"}}],"hide":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@Or"},"onVisibleOnScreen":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.observe_fix_scroll"}},"value":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-types@Setter"},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"fill":{"params":{"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}},"component":"data2-core-types@Getter"}],"then":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,151,59,1)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,98,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(244,165,50,1)"}},"offset":"100%"}}],"angle":255,"type":"linear"}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"component":"data2-core-flow@If"}},"index":2},{"_id":"6aba96349d2c4e1f33f1050a","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"audioButton","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":372,"y":8,"exactX":372,"exactY":8.09,"right":true,"top":true}},"children":{"locked":true},"cursor":"pointer","onClick":{"params":{"expression":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"value":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"value":{"component":"data2-core-primitives@String","params":{"content":"recording"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"VowdlGfa4t188GpvchEa4"}},"prop":"startRecording"}}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"recording"}},"value":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"value":{"component":"data2-core-primitives@String","params":{"content":"uploading"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"VowdlGfa4t188GpvchEa4"}},"prop":"stopRecording"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"L7oOSFzf31uZNC7rrSv8Y"}},"prop":"uploadFromFiles","args":[[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult"}}}}],{"folder":{"component":"data2-core-types@FileComponentReference","params":{"preventEvaluation":false,"reference":"xqYdvzTaZuEHhT2AztA2p"}}}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.0.fileUrl"}}}}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"value":{"component":"data2-core-primitives@String","params":{"content":"previewing"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}}]},"component":"data2-core-flow@Series"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"previewing"}},"value":{"params":{"actions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageSend"}}}}]},"component":"data2-core-flow@Series"}}}]},"component":"data2-core-flow@Switch"},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}],"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"42"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"solid"},"disabled":false},"hide":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-logical-operators@Or"},"fill":{"params":{"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}},"component":"data2-core-types@Getter"}],"then":{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,151,59,1)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,98,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(244,165,50,1)"}},"offset":"100%"}}],"angle":255,"type":"linear"}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}},"component":"data2-core-flow@If"}},"index":3},{"_id":"6aba96349d2c4e1f33f10502","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"attachmentInput","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":42}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"327","y":10,"top":true,"exactX":false,"exactY":false,"right":true}},"hide":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-logical-operators@Or"},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"42"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"solid"},"disabled":false},"onClick":{"params":{"then":{"params":{"expression":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment_state"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"value":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"value":{"component":"data2-core-primitives@String","params":{"content":"uploading"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment_state"}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"L7oOSFzf31uZNC7rrSv8Y"}},"prop":"uploadFromPrompt","args":[{"folder":{"component":"data2-core-types@FileComponentReference","params":{"preventEvaluation":false,"reference":"_Mne-qkcC3vuAT38aJm2y"}}}]}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"prevResult.0"}}}}},"component":"data2-core-types@Setter"},{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"value":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment_state"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageSend"}}}}]},"component":"data2-core-flow@Series"}}}]},"component":"data2-core-flow@Switch"},"compare":{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}}},"component":"data2-core-comparison-operators@Equal"}},"component":"data2-core-flow@If"},"cursor":"pointer","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}]},"index":4},{"_id":"6aba96349d2c4e1f33f10509","parent":"6aba96349d2c4e1f33f104fd","component":"data2-blocks@VideoBlock","system":"645b823726c1280637133f0e","displayName":"audio preview","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"30"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":{"params":{"then":{"component":"data2-core-primitives@Number","params":{"content":316}},"else":{"component":"data2-core-primitives@Number","params":{"content":273}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}}}},"component":"data2-core-flow@If"},"height":42,"exactWidth":272.7,"exactHeight":42,"growHeightWithContent":false,"minHeight":42},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"hide":{"component":"data2-core-logical-operators@Or","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}},"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"previewing"}}},"component":"data2-core-comparison-operators@Equal"},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}}}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}]}},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"200","scope":"DIMENSIONS"}}],"opacity":{"params":{"then":{"params":{"value":25},"component":"data2-core-types@Opacity"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}}},"component":"data2-core-flow@If"}},"showControls":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"videoFile":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}},"component":"data2-core-types@Getter"}},"index":5},{"_id":"6aba96349d2c4e1f33f10508","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"audio recording","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":{"params":{"then":{"component":"data2-core-primitives@Number","params":{"content":360}},"else":{"component":"data2-core-primitives@Number","params":{"content":"316"}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}}}},"component":"data2-core-flow@If"},"height":42,"exactWidth":312.7,"exactHeight":42,"growHeightWithContent":false,"minHeight":42}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":"10","y":10,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"hide":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},{"params":{"subject":{"params":{"pattern":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},"subject":[{"component":"data2-core-primitives@String","params":{"content":"uploading"}},{"component":"data2-core-primitives@String","params":{"content":"recording"}}]},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@Or"},"opacity":{"params":{"then":{"params":{"value":25},"component":"data2-core-types@Opacity"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}}},"component":"data2-core-flow@If"},"text":{"component":"data2-core-primitives@String","params":{"content":"Grabando audio..."}},"fill":{"disabled":false,"component":"data2-core-types@Fill","params":{"backgrounds":[{"params":{"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(112,112,112,1)"}}},"index":6},{"_id":"6aba96349d2c4e1f33f10500","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"inputContainer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"20"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"dashed"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":{"params":{"then":{"component":"data2-core-primitives@Number","params":{"content":360}},"else":{"component":"data2-core-primitives@Number","params":{"content":"316"}},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}}}},"component":"data2-core-flow@If"},"height":42,"exactWidth":312.7,"exactHeight":42,"growHeightWithContent":false,"minHeight":42},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":10,"exactX":10,"exactY":10,"fixed":false,"top":true,"left":true,"right":true,"growH":false}},"opacity":{"params":{"then":{"params":{"value":25},"component":"data2-core-types@Opacity"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}}},"component":"data2-core-flow@If"},"hide":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"standby"}}},"component":"data2-core-comparison-operators@Different"}]},"component":"data2-core-logical-operators@Or"},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"DykoX6YpIIAVWfTTPp0XP"}},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"200","scope":"DIMENSIONS"}}],"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}]},"index":7},{"_id":"6aba96349d2c4e1f33f1050d","parent":"6aba96349d2c4e1f33f104fd","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":283,"y":9,"exactX":282.73,"exactY":9.44,"top":true,"right":true}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":""}},"onClick":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"value":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}},"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}}}},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}},"value":{"params":{},"component":"data2-core-primitives@Null"}},"component":"data2-core-types@Setter"}]},"component":"data2-core-flow@Series"},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"previewing"}}},"component":"data2-core-comparison-operators@Equal"},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}}},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-close-circle-fill","iconSet":"remix"}},"size":{"component":"data2-core-primitives@Number","params":{"content":"23"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(159,159,159,1)"}},"text":""},"index":8},{"_id":"6aba96349d2c4e1f33f10501","parent":"6aba96349d2c4e1f33f104fd","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":411,"height":10,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false}}},"index":9},{"_id":"6aba96349d2c4e1f33f104f9","parent":"6aba96349d2c4e1f33f104df","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Empty State Message","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":20,"rightBottom":18},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-2,"y":1,"exactX":-1.6,"exactY":1.27,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false,"fixed":false}},"ignoreMouseEvents":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"preventUserSelection":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"children":{"locked":true},"fill":{"disabled":true,"component":"data2-core-types@Fill","params":{}},"onClick":{"disabled":false,"component":"data2-core-types@Interaction","params":{}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":421,"height":703,"exactWidth":421,"exactHeight":703.2199999999999}},"text":""},"index":1},{"_id":"6abfd36b61464dae99bda411","parent":"6abfd36b61464dae99bda410","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#ffffff","radius":{"leftTop":"80","rightBottom":"80"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(252,252,251,0.79)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":229,"height":45,"exactWidth":229.42,"exactHeight":45,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":96,"y":1,"exactX":false,"exactY":false,"top":true,"bottom":true,"growV":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(141,141,141,1)"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"fontWeight":500,"textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"params":{"portions":[{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":{"params":{"components":[{"params":{"components":[{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"x"}},"date":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-functions@DateFormat"},{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"x"}},"date":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.time"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@DateFormat"}]},"component":"data2-core-numerical-operators@Subtract"},{"component":"data2-core-primitives@Number","params":{"content":1000}}]},"component":"data2-core-numerical-operators@Divide"},"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":172800}}},"component":"data2-core-comparison-operators@GreaterThan"},"value":{"params":{"date":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.time"}}},"component":"data2-core-types@Reference"},"format":{"component":"data2-core-primitives@String","params":{"content":"MMM DD,"}}},"component":"data2-core-functions@DateFormat"}}},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"subject":{"params":{"components":[{"params":{"components":[{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"x"}},"date":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-functions@DateFormat"},{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"x"}},"date":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.time"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@DateFormat"}]},"component":"data2-core-numerical-operators@Subtract"},{"component":"data2-core-primitives@Number","params":{"content":1000}}]},"component":"data2-core-numerical-operators@Divide"},"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":86400}}},"component":"data2-core-comparison-operators@GreaterThan"},"value":{"component":"data2-core-primitives@String","params":{"content":"Ayer"}}}}],"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"Hoy"}}},"component":"data2-core-flow@Switch"},{"component":"data2-core-primitives@String","params":{"content":" "}},{"params":{"date":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.time"}}},"component":"data2-core-types@Reference"},"format":{"component":"data2-core-primitives@String","params":{"content":"HH:mm "}}},"component":"data2-core-functions@DateFormat"}]},"component":"data2-core-functions@StringConcat"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":1},{"_id":"6abfd36b61464dae99bda40d","parent":"6abfd36b61464dae99bda40a","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"borderSide","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":10,"height":1,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":0,"exactY":0}}},"index":0},{"_id":"6abfd36b61464dae99bda40b","parent":"6abfd36b61464dae99bda40a","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageItem","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"5","rightTop":"22","rightBottom":"22","leftBottom":"22"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(243,243,243,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":85,"height":32,"growWidthWithContent":false,"growHeightWithContent":false,"minWidth":20,"minHeight":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"bottom":false,"right":false,"top":true}},"childrenMode":"cols","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"500"}}],"filter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"brightness","unit":"%","value":80}}]},"index":1},{"_id":"6aba96349d2c4e1f33f10506","parent":"6aba96349d2c4e1f33f10505","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","blur":"0.2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.24)"}},"offsetY":"1"}}]},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-refresh-line","iconSet":"remix"}},"color":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(201,199,199,1)"}},"size":{"component":"data2-core-primitives@Number","params":{"content":20}}}},{"_id":"6aba96349d2c4e1f33f104ff","parent":"6aba96349d2c4e1f33f104fe","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"shadow":[{"component":"data2-core-types@Shadow","params":{"type":"complex","blur":"0.2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.24)"}},"offsetY":"1"}}]},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-send-plane-fill","iconSet":"remix"}},"color":{"params":{"then":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(159,159,159,1)"}},"else":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"dCKhvrTGA0OHPdPfM4GGh"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.input"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-flow@If"},"size":{"component":"data2-core-primitives@Number","params":{"content":20}}}},{"_id":"6aba96349d2c4e1f33f1050b","parent":"6aba96349d2c4e1f33f1050a","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":""}}},"icon":{"params":{"defaultCase":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-mic-2-line","iconSet":"remix"}},"expression":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}},"component":"data2-core-types@Getter"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"recording"}},"value":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-stop-circle-fill","iconSet":"remix"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"previewing"}},"value":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-send-plane-fill","iconSet":"remix"}}}}]},"component":"data2-core-flow@Switch"},"size":{"component":"data2-core-primitives@Number","params":{"content":"23"}},"color":{"params":{"then":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"else":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(159,159,159,1)"}},"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-flow@If"}},"index":0},{"_id":"6aba96349d2c4e1f33f1050c","parent":"6aba96349d2c4e1f33f1050a","component":"data2-blocks@Spinner","system":"645b823726c1280637133f0e","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":42,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}},"textColor":{"params":{"rgba":"rgba(213,213,213,1)"},"component":"data2-core-types@Color"},"hide":{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"uploading"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_state"}}}}},"component":"data2-core-comparison-operators@Different"}},"spinner":"Bounce"},"index":1},{"_id":"6aba96349d2c4e1f33f10503","parent":"6aba96349d2c4e1f33f10502","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":43,"height":42,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"icon":"ri-attachment-line","iconSet":"remix"}},"color":{"params":{"then":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"else":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(159,159,159,1)"}},"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.audio_url"}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-flow@If"},"size":{"component":"data2-core-primitives@Number","params":{"content":"23"}}},"index":0},{"_id":"6aba96349d2c4e1f33f10504","parent":"6aba96349d2c4e1f33f10502","component":"data2-blocks@Spinner","system":"645b823726c1280637133f0e","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":40,"height":41,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":2,"y":0,"exactX":2,"exactY":0}},"textColor":{"params":{"rgba":"rgba(213,213,213,1)"},"component":"data2-core-types@Color"},"hide":{"params":{"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"uploading"}},"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.attachment_state"}}}}},"component":"data2-core-comparison-operators@Different"}},"spinner":"Bounce"},"index":1},{"_id":"6abd5ac871f7856bad37e1d6","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":" message-input-refactor","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":315,"height":42,"exactWidth":314.6,"exactHeight":42,"growHeightWithContent":false,"minHeight":42}}},"index":208,"reference":"DykoX6YpIIAVWfTTPp0XP"},{"_id":"6aba96349d2c4e1f33f104fa","parent":"6aba96349d2c4e1f33f104f9","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Message Container","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#d4d3fd","radius":{"leftTop":"6"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,151,59,1)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,98,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(244,165,50,1)"}},"offset":"100%"}}],"angle":255,"type":"linear"}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":260,"height":67,"exactWidth":260.44,"exactHeight":66.55999999999999,"growHeightWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":81,"y":100,"exactX":false,"exactY":false,"left":false,"top":true,"right":false,"growH":false}},"text":"","ignoreMouseEvents":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"preventUserSelection":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":0}}],"shadow":[{"component":"data2-core-types@Shadow","params":{"offsetY":"2","blur":"2","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}}}}]},"index":0},{"_id":"6abe952802e3174bd5fa1378","parent":"6aba96349d2c4e1f33f104f9","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.49)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,0.15)"}},"offset":"100%"}}],"angle":235}},"image":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"ftJBDLQCbnV94TtFggYTs"}},"skipServerSideProcessing":true,"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain"},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":false},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":244,"height":239,"exactWidth":244.21,"exactHeight":238.92,"growWidthWithContent":false,"growHeightWithContent":false},"disabled":false},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":89,"exactX":false,"exactY":false,"left":false,"top":false,"bottom":true,"growV":false,"y":464,"fixed":false}},"onVisibleOnScreen":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.observe_fix_scroll"}},"value":{"params":{},"component":"data2-core-functions@DateNow"}},"component":"data2-core-types@Setter"},"border":{"disabled":true,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"47"}}}},"index":0},{"_id":"6abe70a02dfff06e13c634a6","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"UserMessageNatura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":1949,"exactWidth":420,"exactHeight":1949.18}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":201,"reference":"mAfIC8_tJYiaSMW0RobYg"},{"_id":"6abe70a02dfff06e13c634b7","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"AssistantMessageNatura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":1960,"exactWidth":420,"exactHeight":1959.94}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":202,"reference":"lf30RIzlPswvA_jYUR4u5"},{"_id":"6abe8860418acdc10ef24c10","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"SystemMessage - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":373,"height":99,"exactWidth":373.48,"exactHeight":99.18}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":207,"reference":"2W2NDYupjyt5eEgphM-Pr"},{"_id":"6abfd36b61464dae99bda40c","parent":"6abfd36b61464dae99bda40b","component":"data2-blocks@Spinner","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":70,"height":18,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":7,"y":"9","exactX":false,"exactY":false}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(64,64,64,1)"}}},"spinner":"Beat","speed":{"component":"data2-core-primitives@Number","params":{"content":0.7}}}},{"_id":"6abd5ac871f7856bad37e1d7","parent":"6abd5ac871f7856bad37e1d6","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"inputContainer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"20"},"width":{"left":"0","top":"0","right":"0","bottom":"0"},"type":"dashed"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":315,"height":42,"exactWidth":314.6,"exactHeight":42,"growHeightWithContent":false,"minHeight":42}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}},"component":"data2-core-primitives@Boolean"}},{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"shadow":[{"params":{"compare":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"}],"then":{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"0","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(20,20,20,0.45)"}},"spread":"1"}},"else":{"component":"data2-core-types@Shadow","params":{"type":"outset","offsetY":"0","blur":"0","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(201,201,201,1)"}},"spread":"1"}}},"component":"data2-core-flow@If"}],"onMouseDown":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseUp":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}],"opacity":{"params":{"then":{"params":{"value":25},"component":"data2-core-types@Opacity"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}}}},"component":"data2-core-flow@If"},"hide":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"resetChat"}}}},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"index":6},{"_id":"6aba96349d2c4e1f33f104fb","parent":"6aba96349d2c4e1f33f104fa","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":208,"height":52,"exactWidth":207.68,"exactHeight":51.62,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":26,"y":7,"exactX":false,"exactY":6.52,"left":false,"right":false,"growH":false,"fixed":false,"top":true}},"text":"Hola! Soy AVI, la asistente virtual de Natura y estoy aquí para ayudarte.","font":{"params":{"content":"inter"},"component":"data2-core-primitives@String"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"top","fontWeight":300}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}}},{"_id":"6abe70a02dfff06e13c634b4","parent":"6abe70a02dfff06e13c634a6","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":" metadata","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":24,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"childrenMode":"reversed-cols","hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}},"component":"data2-core-logical-operators@Not"}},"index":0},{"_id":"6abe70a02dfff06e13c634a7","parent":"6abe70a02dfff06e13c634a6","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"userMessageItemContainer","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":410,"height":1896,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"reversed-cols","shadow":[],"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"index":1},{"_id":"6abe70a02dfff06e13c634c5","parent":"6abe70a02dfff06e13c634b7","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"metadata","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":24,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":false,"exactY":false,"top":true,"left":true,"right":true,"growH":false}},"childrenMode":"cols","hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":0},{"_id":"6abe70a02dfff06e13c634b8","parent":"6abe70a02dfff06e13c634b7","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"robotMessageItemContainer","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":420,"height":1906,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"cols","hide":{"params":{"components":[{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"user"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"typing"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@Or"},"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"index":1},{"_id":"6abe8860418acdc10ef24c11","parent":"6abe8860418acdc10ef24c10","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"systemMessageItemContainer","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,140,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":373,"height":96,"growWidthWithContent":false,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":false,"exactHeight":95.87}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"fixed":false,"bottom":false,"right":true,"top":true,"left":true,"growH":false}},"childrenMode":"cols","hide":{"params":{"components":[{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"user"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageRepeater.sender"}}},"component":"data2-core-types@Reference"},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"typing"}}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@Or"},"shadow":[{"component":"data2-core-types@BitmapFilter","params":{"type":"invert","unit":"%","value":100}}],"font":{"params":{"content":"NaturaCo"},"component":"data2-core-primitives@String"}},"index":1},{"_id":"6abd5ac871f7856bad37e1d8","parent":"6abd5ac871f7856bad37e1d7","component":"data2-blocks@DataTextBlock","system":"645b823726c1280637133f0e","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":322,"height":42,"exactWidth":322.07,"exactHeight":false,"growHeightWithContent":false,"minHeight":42}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":-2,"y":0,"exactX":-2.29,"exactY":0.47,"fixed":false,"top":true,"left":true,"right":true,"growH":false,"bottom":true,"growV":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"middle","letterSpacing":"","wordWrap":"break-word"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(51,51,51,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":16}},"transitions":[{"component":"data2-core-types@Transition","params":{"duration":"110","scope":"ALL","easing":"cubic-bezier(0.03289473684210526,0.682375,0.21710526315789475,0.738375)","delay":"0"}}],"fill":{"params":{"expression":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"cases":[{"component":"data2-core-flow@Case","params":{"value":{"params":{"rgba":"rgba(246,246,246,1)"},"component":"data2-core-types@Color"},"expression":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}}},"component":"data2-core-types@Getter"}},"displayName":"focused"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}},"component":"data2-core-types@Getter"},{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}}}}},"component":"data2-core-types@Getter"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"},"value":{"params":{"rgba":"rgba(243,243,243,1)"},"component":"data2-core-types@Color"}},"displayName":"hovered"},{"component":"data2-core-flow@Case","params":{"value":{"params":{"rgba":"rgba(243,243,243,1)"},"component":"data2-core-types@Color"},"expression":{"params":{"components":[{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}},"component":"data2-core-types@Getter"}},"component":"data2-core-logical-operators@Not"},{"params":{"subject":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}}}}},"component":"data2-core-types@Getter"}},"component":"data2-core-logical-operators@Not"}]},"component":"data2-core-logical-operators@And"}},"displayName":"default"},{"component":"data2-core-flow@Case","params":{"expression":{"params":{"components":[{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hovered"}}}}},"component":"data2-core-types@Getter"},{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"clicked"}}}}},"component":"data2-core-types@Getter"}]},"component":"data2-core-logical-operators@And","displayName":"clicked"},"value":{"params":{"rgba":"rgba(226,226,225,1)"},"component":"data2-core-types@Color"}},"displayName":"clicked"}],"defaultCase":{"params":{"rgba":"rgba(245,243,239,1)"},"component":"data2-core-types@Color"}},"component":"data2-core-flow@Switch"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"placeholder":{"component":"data2-core-primitives@String","params":{"content":"Mensaje..."}},"padding":{"left":{"component":"data2-core-primitives@Number","params":{"content":16}},"right":{"component":"data2-core-primitives@Number","params":{"content":16}},"top":{"params":{"content":11},"component":"data2-core-primitives@Number"}},"spellCheck":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"onFocus":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onBlur":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abd5ac871f7856bad37e1d7"}},"key":{"component":"data2-core-primitives@String","params":{"content":"focused"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"disabled":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"disabled"}}},"component":"data2-core-types@Reference"},"onKeyPress":{"params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"event"}}],"body":{"component":"data2-core-types@Getter","params":{"module":{"execute":{"params":{"compare":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"event.key"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"Enter"}}},"component":"data2-core-comparison-operators@Equal"},{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"event.shiftKey"}}}}},"component":"data2-core-logical-operators@Not"}],"then":{"params":{"actions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messageSend"}}}}]},"component":"data2-core-flow@Series"}},"component":"data2-core-flow@If"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"execute"}}}}},"component":"data2-core-functions@Function","break":true},"dataset":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"field":{"params":{"content":"data.input"},"component":"data2-core-primitives@String"},"text":""},"index":0},{"_id":"6abe70a02dfff06e13c634b6","parent":"6abe70a02dfff06e13c634b4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Sender","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":68,"height":13,"growWidthWithContent":true,"exactWidth":67.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":6,"fixed":false,"exactX":false,"exactY":false,"top":false,"left":true,"right":false,"growH":false}},"text":{"params":{"portions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.sender"}}},"component":"data2-core-types@Reference"},{"params":{"compare":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.agent_name"}}},"component":"data2-core-types@Reference"},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":" ("}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.agent_name"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":")"}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"fontWeight":500,"horizontalAlignment":"right"}}},"index":0},{"_id":"6abe70a02dfff06e13c634b5","parent":"6abe70a02dfff06e13c634b4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":87,"height":10,"exactWidth":86.85,"exactHeight":9.72,"growHeightWithContent":false,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"y":7,"exactX":false,"exactY":false,"fixed":false,"top":false,"left":true,"right":false,"growH":false,"x":10}},"text":{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"HH:mm DD/MM/YYYY"}},"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-functions@DateFormat"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top","fontWeight":300,"fontStyle":"italic"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":10}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}},"hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":1},{"_id":"6abe70a02dfff06e13c634a8","parent":"6abe70a02dfff06e13c634a7","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"borderSide","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(0,120,220,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":10,"height":1,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":0,"exactY":0}}},"index":1},{"_id":"6abe70a02dfff06e13c634a9","parent":"6abe70a02dfff06e13c634a7","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageItem","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"10","rightTop":"2","rightBottom":"","leftBottom":""},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":345,"height":1777,"growWidthWithContent":true,"growHeightWithContent":true,"minWidth":100,"minHeight":10,"exactWidth":false,"exactHeight":1777.24}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-10,"y":0,"exactX":-10,"exactY":0,"fixed":false,"bottom":false,"right":false,"top":true}},"childrenMode":"rows","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"500"}}],"shadow":{"params":{"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}}},"subject":{"component":"data2-core-primitives@String","params":{"content":"sticker"}}},"component":"data2-core-functions@Includes"},"else":[{"component":"data2-core-types@Shadow","params":{"spread":"2","type":"inset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.21)"}}}}]},"component":"data2-core-flow@If"},"fill":{"params":{"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}}},"subject":{"component":"data2-core-primitives@String","params":{"content":"sticker"}}},"component":"data2-core-functions@Includes"},"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"background_color"}}}},{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(246,151,59,1)"},"disabled":true},"gradient":{"disabled":false,"component":"data2-core-types@ColorGradient","params":{"colors":[{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(250,98,25,1)"}},"offset":"0%"}},{"component":"data2-core-types@ColorGradientStop","params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(244,165,50,1)"}},"offset":"100%"}}],"angle":255,"type":"linear"}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}]},"component":"data2-core-logical-operators@Or"},"then":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(72,72,72,1)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}},"component":"data2-core-flow@If"}},"index":2},{"_id":"6abe70a02dfff06e13c634c7","parent":"6abe70a02dfff06e13c634c5","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Sender","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":68,"height":13,"growWidthWithContent":true,"exactWidth":67.88}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":10,"y":6,"fixed":false,"exactX":false,"exactY":false,"top":false,"left":true}},"text":{"params":{"portions":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.sender"}}},"component":"data2-core-types@Reference"},{"params":{"compare":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.agent_name"}}},"component":"data2-core-types@Reference"},"then":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":" ("}},{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.agent_name"}}},"component":"data2-core-types@Reference"},{"component":"data2-core-primitives@String","params":{"content":")"}}]},"component":"data2-core-functions@StringConcat"}},"component":"data2-core-flow@If"}]},"component":"data2-core-functions@StringConcat"},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"fontWeight":500}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":0},{"_id":"6abe70a02dfff06e13c634c6","parent":"6abe70a02dfff06e13c634c5","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":87,"height":10,"exactWidth":86.85,"exactHeight":9.72,"growWidthWithContent":true}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"y":7,"exactX":false,"exactY":false,"fixed":false,"top":false,"left":true,"right":false,"growH":false,"x":10}},"text":{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"HH:mm DD/MM/YYYY"}},"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-functions@DateFormat"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top","fontWeight":300,"fontStyle":"italic"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":10}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}},"hide":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":1},{"_id":"6abe70a02dfff06e13c634b9","parent":"6abe70a02dfff06e13c634b8","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"borderSide","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(220,0,0,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":10,"height":1,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"fixed":false,"exactX":0,"exactY":0}}},"index":2},{"_id":"6abe70a02dfff06e13c634ba","parent":"6abe70a02dfff06e13c634b8","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageItem","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"2","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":345,"height":1775,"growWidthWithContent":true,"growHeightWithContent":true,"minWidth":100,"exactWidth":false,"exactHeight":false,"minHeight":10}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":-0.34,"fixed":false,"bottom":false,"right":false,"top":true,"left":false,"growH":false}},"childrenMode":"rows","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"500"}}],"fill":{"params":{"then":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"},"disabled":true},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"else":{"params":{"components":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"background_color"}}}},{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"},"disabled":false},"gradient":{"disabled":true,"component":"data2-core-types@ColorGradient","params":{}},"image":{"disabled":true,"component":"data2-core-types@String","params":{}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"}]},"component":"data2-core-logical-operators@Or"},"compare":{"params":{"pattern":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}}},"subject":{"component":"data2-core-primitives@String","params":{"content":"sticker"}}},"component":"data2-core-functions@Includes"}},"component":"data2-core-flow@If"}},"index":3},{"_id":"6abe8860418acdc10ef24c12","parent":"6abe8860418acdc10ef24c11","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageItem","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#828282","radius":{"leftTop":"10","rightTop":"10","rightBottom":"10","leftBottom":"10"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":345,"height":85,"growWidthWithContent":true,"growHeightWithContent":true,"minWidth":20,"minHeight":20,"exactWidth":345,"exactHeight":84.75999999999999}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":1,"exactX":false,"exactY":false,"fixed":false,"bottom":false,"right":false,"top":true,"left":false,"growH":false}},"childrenMode":"rows","transitions":[{"component":"data2-core-types@Transition","params":{"duration":"500"}}],"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(212,212,212,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"shadow":[{"component":"data2-core-types@Shadow","params":{"spread":"2","type":"inset","color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.05)"}}}}],"childrenOverflow":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":1},{"_id":"6abe70a02dfff06e13c634aa","parent":"6abe70a02dfff06e13c634a9","component":"natura@9rHMYfjk9FF5_T0hONlYt","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":0,"exactX":14,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"exactWidth":false,"exactHeight":113.5,"growHeightWithContent":true,"growWidthWithContent":true,"height":114}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"transcription"}}}}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"text":""},"index":0},{"_id":"6abe70a02dfff06e13c634ab","parent":"6abe70a02dfff06e13c634a9","component":"natura@xDq2_hWqK4qE3AgRwC-Og","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":3,"exactX":14,"exactY":3.07,"right":true,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":58,"exactWidth":317.87,"exactHeight":54,"growHeightWithContent":false,"growWidthWithContent":false}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"audio"}},{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"index":1},{"_id":"6abe70a02dfff06e13c634ac","parent":"6abe70a02dfff06e13c634a9","component":"natura@eErAKBMldOmqdEgJlSylQ","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":101,"exactWidth":317.87,"exactHeight":100.92,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"document"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"index":2},{"_id":"6abe70a02dfff06e13c634ad","parent":"6abe70a02dfff06e13c634a9","component":"natura@SBPFUnxM3-4s9UfwqWds7","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":13,"y":1,"exactX":13.19,"exactY":1.31,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":357,"exactWidth":318.09,"exactHeight":357.01,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"image"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":800}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"index":3},{"_id":"6abe70a02dfff06e13c634b2","parent":"6abe70a02dfff06e13c634a9","component":"natura@jkyG3DBCjV8-NV545KVc8","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":24,"y":36,"exactX":24.47,"exactY":36.370000000000005,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":298,"height":170,"exactWidth":298.48,"exactHeight":170.27,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"sticker"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":300}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"}},"index":4},{"_id":"6abe70a02dfff06e13c634ae","parent":"6abe70a02dfff06e13c634a9","component":"natura@FA2OyxFZZYvm_qJAX_b0A","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":17,"exactX":13.75,"exactY":16.58,"right":true,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":323,"height":223,"exactWidth":322.96,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":false}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"video"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":800}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"index":5},{"_id":"6abe70a02dfff06e13c634af","parent":"6abe70a02dfff06e13c634a9","component":"natura@yLsNKO9lFSrMqMRNoTP2G","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":110,"exactWidth":317.87,"exactHeight":109.85000000000001,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"cta_url"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"text":""},"index":6},{"_id":"6abe70a02dfff06e13c634b0","parent":"6abe70a02dfff06e13c634a9","component":"natura@C8QEZbGAzoCSzzIBo3YGN","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":185,"exactWidth":317.87,"exactHeight":184.64,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"button"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"on_reply_action":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}},"component":"data2-core-types@Reference"}},"index":7},{"_id":"6abe70a02dfff06e13c634b1","parent":"6abe70a02dfff06e13c634a9","component":"natura@0ZTUFcjjb7C5AGgsAM__E","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":13,"y":4,"exactX":12.69,"exactY":4.33,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":155,"exactWidth":317.87,"exactHeight":155.15,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"list"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"on_reply_action":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}},"component":"data2-core-types@Reference"}},"index":9},{"_id":"6abe70a02dfff06e13c634b3","parent":"6abe70a02dfff06e13c634a9","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":54,"height":16,"exactWidth":54.470000000000006,"exactHeight":15.899999999999999,"growHeightWithContent":false,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"y":3,"exactX":7.8,"exactY":2.74,"fixed":false,"top":false,"left":true,"right":false,"growH":false,"x":8}},"text":{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"hh:mm a"}},"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-functions@DateFormat"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top","fontWeight":300,"fontStyle":"italic"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":10}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}},"hide":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-logical-operators@Not"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}]},"component":"data2-core-logical-operators@And"},"super":{"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":11},{"_id":"6abe70a02dfff06e13c634bb","parent":"6abe70a02dfff06e13c634ba","component":"natura@9rHMYfjk9FF5_T0hONlYt","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":0,"exactX":14,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":128,"exactWidth":317.87,"exactHeight":127.6,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"transcription"}}}}]},"component":"data2-core-logical-operators@And"}]},"component":"data2-core-logical-operators@Or"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":1},{"_id":"6abe70a02dfff06e13c634bc","parent":"6abe70a02dfff06e13c634ba","component":"natura@xDq2_hWqK4qE3AgRwC-Og","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":58,"exactWidth":317.87,"exactHeight":54,"growHeightWithContent":false,"growWidthWithContent":false}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"audio"}},{"component":"data2-core-primitives@String","params":{"content":"text+audio"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":2},{"_id":"6abe70a02dfff06e13c634be","parent":"6abe70a02dfff06e13c634ba","component":"natura@eErAKBMldOmqdEgJlSylQ","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":101,"exactWidth":317.87,"exactHeight":100.92,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"document"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":3},{"_id":"6abe70a02dfff06e13c634bd","parent":"6abe70a02dfff06e13c634ba","component":"natura@SBPFUnxM3-4s9UfwqWds7","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":-1,"y":0,"exactX":-1.08,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":345,"height":379,"exactWidth":false,"exactHeight":379.34999999999997,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"image"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":800}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":4},{"_id":"6abe70a02dfff06e13c634c3","parent":"6abe70a02dfff06e13c634ba","component":"natura@jkyG3DBCjV8-NV545KVc8","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":24,"y":22,"exactX":23.76,"exactY":21.78,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":297,"height":188,"exactWidth":297.48,"exactHeight":188.12,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"sticker"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":300}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":4},{"_id":"6abe70a02dfff06e13c634bf","parent":"6abe70a02dfff06e13c634ba","component":"natura@FA2OyxFZZYvm_qJAX_b0A","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":11,"y":0,"exactX":10.57,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":314,"height":236,"exactWidth":314.32,"exactHeight":236.15,"growHeightWithContent":true,"growWidthWithContent":false}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"video"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}},"max_width":{"component":"data2-core-primitives@Number","params":{"content":800}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":5},{"_id":"6abe70a02dfff06e13c634c0","parent":"6abe70a02dfff06e13c634ba","component":"natura@yLsNKO9lFSrMqMRNoTP2G","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":110,"exactWidth":317.87,"exactHeight":109.85000000000001,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"cta_url"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":6},{"_id":"6abe70a02dfff06e13c634c1","parent":"6abe70a02dfff06e13c634ba","component":"natura@C8QEZbGAzoCSzzIBo3YGN","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":4,"exactX":14,"exactY":4,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":185,"exactWidth":317.87,"exactHeight":184.64,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"button"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"on_reply_action":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}},"component":"data2-core-types@Reference"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":7},{"_id":"6abe70a02dfff06e13c634c2","parent":"6abe70a02dfff06e13c634ba","component":"natura@0ZTUFcjjb7C5AGgsAM__E","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":16,"y":12,"exactX":15.91,"exactY":12.39,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":149,"exactWidth":317.87,"exactHeight":148.91,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(94,94,94,1)"}},"hide":{"params":{"subject":{"params":{"components":[{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"interactive"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"},{"params":{"comparisonSubject":{"params":{"content":"list"},"component":"data2-core-primitives@String"},"subject":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-comparison-operators@Equal"}]},"component":"data2-core-logical-operators@And"}},"component":"data2-core-logical-operators@Not"},"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"on_reply_action":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}},"component":"data2-core-types@Reference"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":8},{"_id":"6abe70a02dfff06e13c634c4","parent":"6abe70a02dfff06e13c634ba","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":50,"height":17,"exactWidth":50.02,"exactHeight":17.2,"growHeightWithContent":false,"growWidthWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"y":4,"exactX":282.79999999999995,"exactY":4,"fixed":false,"top":false,"left":true,"right":true,"growH":false,"x":283}},"text":{"params":{"format":{"component":"data2-core-primitives@String","params":{"content":"hh:mm a"}},"date":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-functions@DateFormat"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"textOverflow":false,"verticalAlignment":"top","fontWeight":300,"fontStyle":"italic","horizontalAlignment":"right"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":10}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}},"hide":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.time"}}}}},"component":"data2-core-logical-operators@Not"},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"timestamp"}}}}]},"component":"data2-core-logical-operators@And"},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}},"super":{"font":{"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}}},"index":11},{"_id":"6abe8860418acdc10ef24c13","parent":"6abe8860418acdc10ef24c12","component":"natura@9rHMYfjk9FF5_T0hONlYt","system":"645b823726c1280637133f0e","displayName":"","params":{"super":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":0,"exactX":14,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":318,"height":61,"exactWidth":317.87,"exactHeight":61.09,"growHeightWithContent":true,"growWidthWithContent":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(0,0,0,1)"}},"hide":{"params":{"subject":{"params":{"subject":[{"component":"data2-core-primitives@String","params":{"content":"text"}},{"component":"data2-core-primitives@String","params":{"content":"text+audio"}},{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},{"component":"data2-core-primitives@String","params":{"content":"list_reply"}}],"pattern":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}},"component":"data2-core-types@Reference"}},"component":"data2-core-functions@Includes"}},"component":"data2-core-logical-operators@Not"},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"max_width":{"params":{"width":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"width"}}}}},"component":"natura@5R94Ej5hKTCJKGS6RQfoq"},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"index":0},{"_id":"6abe8860418acdc10ef24c14","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatText - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":180,"exactWidth":308,"exactHeight":179.96}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":242,"reference":"9rHMYfjk9FF5_T0hONlYt"},{"_id":"6abe8860418acdc10ef24c17","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatAudio - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":54,"exactWidth":308,"exactHeight":54}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":243,"reference":"xDq2_hWqK4qE3AgRwC-Og"},{"_id":"6abe8860418acdc10ef24c1d","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatDocument - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":127,"exactWidth":308,"exactHeight":126.63000000000001}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":245,"reference":"eErAKBMldOmqdEgJlSylQ"},{"_id":"6abe8860418acdc10ef24c19","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatImage - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":201,"exactWidth":308,"exactHeight":200.81}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":244,"reference":"SBPFUnxM3-4s9UfwqWds7"},{"_id":"6abe8860418acdc10ef24c45","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatSticker - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":140,"exactWidth":308,"exactHeight":140}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":252,"reference":"jkyG3DBCjV8-NV545KVc8"},{"_id":"6abe8860418acdc10ef24c22","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatVideo - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":237,"exactWidth":308,"exactHeight":236.59}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":246,"reference":"FA2OyxFZZYvm_qJAX_b0A"},{"_id":"6abe8860418acdc10ef24c25","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatCtaUrl - Natura","params":{"0":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":184,"exactWidth":308,"exactHeight":183.82}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":247,"reference":"yLsNKO9lFSrMqMRNoTP2G"},{"_id":"6abe8860418acdc10ef24c2a","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatReplyButtons - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":198,"exactWidth":308,"exactHeight":197.58}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":248,"reference":"C8QEZbGAzoCSzzIBo3YGN"},{"_id":"6abeab5136a4476fe237dea4","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"List - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":136,"exactWidth":308,"exactHeight":135.95999999999998}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":249,"reference":"0ZTUFcjjb7C5AGgsAM__E"},{"_id":"6abe8860418acdc10ef24c15","parent":"6abe8860418acdc10ef24c14","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"messageText","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":20,"exactWidth":306,"exactHeight":19.75,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":-1,"exactX":0,"exactY":-0.78,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"text"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.text.body"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"text+audio"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.text.body"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},"value":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.button_reply.title"}}}},{"component":"data2-core-primitives@String","params":{"content":"\n"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.button_reply.description"}}}}]},"component":"data2-core-functions@StringConcat"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}},"value":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.list_reply.title"}}}},{"component":"data2-core-primitives@String","params":{"content":"\n"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.list_reply.description"}}}}]},"component":"data2-core-functions@StringConcat"}}}]},"component":"data2-core-flow@Switch"}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abe8860418acdc10ef24c16","parent":"6abe8860418acdc10ef24c14","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"messageTextRaw","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":1,"exactWidth":306,"exactHeight":3.37,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":46,"exactX":0,"exactY":46.02,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"14"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"hide":{"params":{"content":true},"component":"data2-core-primitives@Boolean"},"text":{"params":{"haystack":{"params":{"string":{"params":{"expression":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.type"}}}},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"text"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.text.body"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"text+audio"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.text.body"}}}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},"value":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.button_reply.title"}}}},{"component":"data2-core-primitives@String","params":{"content":"\n"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.button_reply.description"}}}}]},"component":"data2-core-functions@StringConcat"}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}},"value":{"params":{"portions":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.list_reply.title"}}}},{"component":"data2-core-primitives@String","params":{"content":"\n"}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.list_reply.description"}}}}]},"component":"data2-core-functions@StringConcat"}}}]},"component":"data2-core-flow@Switch"}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"},"style":{"padding":{"component":"data2-core-primitives@String","params":{"content":"1em 0 1em 0 "}}}},"index":1},{"_id":"6abe8860418acdc10ef24c18","parent":"6abe8860418acdc10ef24c17","component":"data2-blocks@VideoBlock","system":"645b823726c1280637133f0e","displayName":"audio","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":54,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"},"exactWidth":false,"exactHeight":false,"growWidthWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"videoFile":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.audio.link"}}},"component":"data2-core-types@Reference"},"showControls":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"poster":{"disabled":true,"component":"data2-core-types@FileComponentUrlReference","params":{}}},"index":1},{"_id":"6abe8860418acdc10ef24c1f","parent":"6abe8860418acdc10ef24c1d","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":208,"height":55,"exactWidth":false,"exactHeight":55.31,"growWidthWithContent":false,"growHeightWithContent":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"top":true,"left":true,"bottom":false,"growV":false,"right":false,"growH":false,"fixed":false}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(241,243,245,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"onClick":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__DeviceController"}},"prop":"downloadUrl","args":[{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.document.filename"}}}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.document.link"}}}}]}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"10"}}}},"index":0},{"_id":"6abe8860418acdc10ef24c1e","parent":"6abe8860418acdc10ef24c1d","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"messageText","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":61,"exactWidth":306,"exactHeight":61.09,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"},"minHeight":{"component":"data2-core-primitives@Number","params":{"content":4}}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.document.caption"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abe8860418acdc10ef24c1a","parent":"6abe8860418acdc10ef24c19","component":"data2-blocks@ImageBlock","system":"645b823726c1280637133f0e","displayName":"Image","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":140,"exactWidth":false,"exactHeight":139.66,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"4"}}}},"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain","src":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.image.link"}}},"component":"data2-core-types@Reference"}},"index":0},{"_id":"6abe8860418acdc10ef24c1b","parent":"6abe8860418acdc10ef24c19","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"messageText","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":294,"height":61,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.image.caption"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abe8860418acdc10ef24c1c","parent":"6abe8860418acdc10ef24c19","component":"data2-blocks@LinkBlock","system":"645b823726c1280637133f0e","displayName":"messageTextURL","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":201,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":true},"break":false},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":true,"left":true,"growV":false,"growH":false},"break":false}},"link":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.image.link"}}},"component":"data2-core-types@Reference"},"target":"_blank","text":""},"index":1},{"_id":"6abe8860418acdc10ef24c46","parent":"6abe8860418acdc10ef24c45","component":"data2-blocks@ImageBlock","system":"645b823726c1280637133f0e","displayName":"sticker","params":{"super":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":140,"exactWidth":false,"exactHeight":139.66,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"right":false,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"border":{"disabled":false,"component":"data2-core-types@Border","params":{"radius":{"leftTop":"4"}}}},"positionX":"center","positionY":"center","repeat":"no-repeat","size":"contain","src":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.sticker.link"}}},"component":"data2-core-types@Reference"}},"index":0},{"_id":"6abe8860418acdc10ef24c24","parent":"6abe8860418acdc10ef24c22","component":"data2-blocks@VideoBlock","system":"645b823726c1280637133f0e","displayName":"Copy of audio","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":176,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"},"exactWidth":false,"exactHeight":176.11,"growWidthWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"-2","exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"videoFile":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.video.link"}}},"component":"data2-core-types@Reference"},"showControls":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"index":0},{"_id":"6abe8860418acdc10ef24c23","parent":"6abe8860418acdc10ef24c22","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"Copy of messageText","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":294,"height":61,"exactWidth":false,"exactHeight":false,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":14,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.video.caption"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":2},{"_id":"6abe8860418acdc10ef24c26","parent":"6abe8860418acdc10ef24c25","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"body","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":42,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.body.text"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abe8860418acdc10ef24c27","parent":"6abe8860418acdc10ef24c25","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"footer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":19,"exactWidth":306,"exactHeight":18.79,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"12"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":39}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.footer.text"}}}}},"index":1},{"_id":"6abe8860418acdc10ef24c28","parent":"6abe8860418acdc10ef24c25","component":"data2-blocks@LinkBlock","system":"645b823726c1280637133f0e","displayName":"cta","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#e8e8e8","radius":{},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":36,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"6","exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"center"}}},"label":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"🔗 "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.parameters.display_text"}}}}]},"component":"data2-core-functions@StringConcat"},"link":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.parameters.url"}}}},"target":"_blank"},"index":1},{"_id":"6abe8860418acdc10ef24c29","parent":"6abe8860418acdc10ef24c25","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Spacer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":168,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":false,"growV":false,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{}},"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":10,"exactWidth":10,"height":4,"exactHeight":4}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"index":8},{"_id":"6abe8860418acdc10ef24c2b","parent":"6abe8860418acdc10ef24c2a","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"body","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":42,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.body.text"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abe8860418acdc10ef24c2c","parent":"6abe8860418acdc10ef24c2a","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"footer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":19,"exactWidth":306,"exactHeight":18.79,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"12"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":39}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.footer.text"}}}}},"index":1},{"_id":"6abe8860418acdc10ef24c2d","parent":"6abe8860418acdc10ef24c2a","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"buttons","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#e8e8e8","radius":{},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":119,"exactWidth":false,"exactHeight":119.35,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":6,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","textOverflow":false,"verticalAlignment":"top","horizontalAlignment":"center"}},"repeat":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.buttons"}}},"showAllConditionals":true},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"button"}}},"index":1},{"_id":"6abe8860418acdc10ef24c2f","parent":"6abe8860418acdc10ef24c2a","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Spacer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":168,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":false,"growV":false,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{}},"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":10,"exactWidth":10,"height":4,"exactHeight":4}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"index":8},{"_id":"6abeab5136a4476fe237dea9","parent":"6abeab5136a4476fe237dea4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"header","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":19,"exactWidth":306,"exactHeight":18.79,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","fontWeight":700}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.header.text"}}}}},"index":0},{"_id":"6abeab5136a4476fe237dea5","parent":"6abeab5136a4476fe237dea4","component":"data2-blocks@MarkdownViewer","system":"645b823726c1280637133f0e","displayName":"body","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":42,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":0,"exactY":0,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}}},"markdown":{"params":{"string":{"params":{"haystack":{"params":{"string":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.body.text"}}}}},"component":"data2-core-functions@StringTrim"},"needle":{"component":"data2-core-primitives@String","params":{"content":"&lrm;"}},"patch":{"component":"data2-core-primitives@String","params":{"content":""}}},"component":"data2-core-functions@Replace"}},"component":"natura@7HixitXSKJU54CCc5pv7r"}},"index":1},{"_id":"6abeab5136a4476fe237dea6","parent":"6abeab5136a4476fe237dea4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"footer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":19,"exactWidth":306,"exactHeight":18.79,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":"12"}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":39}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.footer.text"}}}}},"index":2},{"_id":"6abeab5136a4476fe237dea7","parent":"6abeab5136a4476fe237dea4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"cta","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#e8e8e8","radius":{},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":36,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":6,"exactX":0,"exactY":6,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"📃 "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.button"}}}}]},"component":"data2-core-functions@StringConcat"},"onClick":{"params":{"then":{"disabled":false,"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Kt8jmnpclBKw8oivjCx59"}},"prop":"prompt","args":[{"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message"}}},"component":"data2-core-types@Reference"}}]}},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"component":"data2-core-flow@If"},"cursor":{"params":{"then":{"params":{"content":"pointer"},"component":"data2-core-primitives@String"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}},"else":{"params":{"content":"default"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"},"backdropFilter":{"params":{"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}},"else":[{"params":{"type":"brightness","unit":"%","value":90},"component":"data2-core-types@BitmapFilter"}]},"component":"data2-core-flow@If"},"filter":{"params":{"then":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":1}}],"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"component":"data2-core-logical-operators@Not"}},"component":"data2-core-flow@If"}},"index":3},{"_id":"6abeab5136a4476fe237dea8","parent":"6abeab5136a4476fe237dea4","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Spacer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":168,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":false,"growV":false,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{}},"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":10,"exactWidth":10,"height":4,"exactHeight":4}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"index":4},{"_id":"6abe8860418acdc10ef24c20","parent":"6abe8860418acdc10ef24c1f","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"6"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":48,"height":55,"exactWidth":47.54,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"fixed":false,"top":true,"left":false,"right":false,"growH":true}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(130,130,130,1)"}}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-file-list-2-line"}},"size":{"component":"data2-core-primitives@Number","params":{"content":24}}}},{"_id":"6abe8860418acdc10ef24c21","parent":"6abe8860418acdc10ef24c1f","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":153,"height":16,"exactWidth":152.55,"growHeightWithContent":false,"growWidthWithContent":false,"exactHeight":15.66}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":49,"y":-36,"exactX":false,"exactY":-35.62,"left":true,"bottom":false,"right":true,"growH":false,"fixed":false,"top":true}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.document.filename"}}}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"horizontalAlignment":"left","textOverflow":true,"verticalAlignment":"top"}},"textColor":{"disabled":false,"component":"data2-core-types@Color","params":{"rgba":"rgba(15,15,15,1)"}},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}}}},{"_id":"6abe8860418acdc10ef24c2e","parent":"6abe8860418acdc10ef24c2d","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"button","params":{"border":{"params":{"then":{"component":"data2-core-types@Border","params":{"color":"#f2f2f2","radius":{"leftTop":""},"width":{"left":"0","top":"1","right":"0","bottom":"0"}}},"compare":{"params":{"comparisonSubject":{"component":"data2-core-primitives@Number","params":{"content":0}},"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"buttonRepeaterIndex"}}}}},"component":"data2-core-comparison-operators@GreaterThan"}},"component":"data2-core-flow@If"},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":36,"exactWidth":306,"exactHeight":42.19,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":-2,"exactX":1.16,"exactY":-2,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","textOverflow":false,"verticalAlignment":"middle","horizontalAlignment":"center"}},"text":{"params":{"portions":[{"component":"data2-core-primitives@String","params":{"content":"↩️ "}},{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"buttonRepeater.reply.title"}}}}]},"component":"data2-core-functions@StringConcat"},"onClick":{"params":{"then":{"params":{"actions":[{"component":"data2-core-types@Getter","params":{"module":{"op":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"op"}},"args":[{"type":{"component":"data2-core-primitives@String","params":{"content":"button_reply"}},"button_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"buttonRepeater.reply"}}}}}]}}]},"component":"data2-core-flow@Series"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"component":"data2-core-flow@If"},"backdropFilter":{"params":{"compare":{"params":{"components":[{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"component":"data2-core-logical-operators@Not"},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}}]},"component":"data2-core-logical-operators@Or"},"then":[{"params":{"type":"brightness","unit":"%","value":90},"component":"data2-core-types@BitmapFilter"}]},"component":"data2-core-flow@If"},"cursor":{"params":{"then":{"params":{"content":"pointer"},"component":"data2-core-primitives@String"},"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}},"else":{"params":{"content":"default"},"component":"data2-core-primitives@String"}},"component":"data2-core-flow@If"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c2e"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"filter":{"params":{"then":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":1}}],"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"component":"data2-core-logical-operators@Not"}},"component":"data2-core-flow@If"}},"index":1},{"_id":"6abe8860418acdc10ef24c40","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatListOptionsModal - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":827,"height":768,"exactWidth":827.48}}},"index":251,"reference":"FC0I7t93gAJSZ4dI7VxG_"},{"_id":"6abe8860418acdc10ef24c41","parent":"6abe8860418acdc10ef24c40","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(48,48,48,0.43)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":827,"height":768,"exactWidth":false,"exactHeight":false}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":0,"y":3,"exactX":0,"exactY":2.7,"top":true,"left":true,"bottom":true,"growV":false,"right":true,"growH":false,"fixed":true}},"onClick":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"close"}}},"component":"data2-core-types@Reference"},"cursor":"default","backdropFilter":[{"component":"data2-core-types@BitmapFilter","params":{"type":"blur","unit":"px","value":4}}]}},{"_id":"6abe8860418acdc10ef24c42","parent":"6abe8860418acdc10ef24c41","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"10"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":310,"height":360,"exactWidth":310.07}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":276,"y":173,"exactX":276,"exactY":173}},"scroll":{"disabled":false,"component":"data2-core-types@Scroll","params":{"y":true}},"cursor":"default"}},{"_id":"6abe8860418acdc10ef24c43","parent":"6abe8860418acdc10ef24c42","component":"natura@ejf5o7CYvs1-7bgmKWCE6","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":289,"height":331,"exactWidth":288.55,"exactHeight":330.92}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":10,"y":9,"exactX":9.8,"exactY":8.69}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"chat_message":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"message.chat_message"}}},"component":"data2-core-types@Reference"},"on_reply_action":{"params":{"country":{"params":{"components":[{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"routeParams.query.country"}}}},{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.country"}}}}]},"component":"data2-core-logical-operators@Or"}},"component":"natura@6jYyIDb1rK9Yp7cc0qe4e"}}},{"_id":"6abe8860418acdc10ef24c44","parent":"6abe8860418acdc10ef24c42","component":"data2-blocks@IconBlock","system":"645b823726c1280637133f0e","params":{"super":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{"leftTop":"20"},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(178,178,178,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":20,"height":20,"exactWidth":20,"exactHeight":20}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"x":284,"y":7,"exactX":284.22,"exactY":7.140000000000001,"top":true,"right":true}},"onClick":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"close"}}},"component":"data2-core-types@Reference"}},"icon":{"disabled":false,"component":"data2-core-web@Icon","params":{"iconSet":"remix","icon":"ri-close-fill"}}}},{"_id":"6abe8860418acdc10ef24c36","component":"data2-core-primitives@Artboard","system":"645b823726c1280637133f0e","displayName":"ChatListOptions - Natura","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":379,"exactWidth":308,"exactHeight":379.22}},"componentClass":{"disabled":false,"component":"data2-core-types@ComponentClass","params":{}}},"index":250,"reference":"ejf5o7CYvs1-7bgmKWCE6"},{"_id":"6abe8860418acdc10ef24c38","parent":"6abe8860418acdc10ef24c36","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"header","params":{"1":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.button"}}}},"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":31,"exactWidth":306,"exactHeight":31.47,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","fontWeight":700,"horizontalAlignment":"center","textOverflow":false,"verticalAlignment":"middle"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.button"}}}}},"index":0},{"_id":"6abe8860418acdc10ef24c39","parent":"6abe8860418acdc10ef24c36","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"sections","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":345,"exactWidth":306,"exactHeight":344.79,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":"-14","exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"repeat":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"chat_message.interactive.action.sections"}}},"component":"data2-core-types@Reference","showAllConditionals":true},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"section"}}},"index":3},{"_id":"6abe8860418acdc10ef24c37","parent":"6abe8860418acdc10ef24c36","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"Spacer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":168,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":false,"growV":false,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{}},"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":10,"exactWidth":10,"height":4,"exactHeight":4}},"hide":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"index":4},{"_id":"6abe8860418acdc10ef24c3a","parent":"6abe8860418acdc10ef24c39","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"section title","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#e8e8e8","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"1"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":20,"exactWidth":306,"exactHeight":20.42,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":20,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word","textOverflow":false,"verticalAlignment":"bottom","fontWeight":600}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":62}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sectionRepeater.title"}}}}},"index":0},{"_id":"6abe8860418acdc10ef24c3b","parent":"6abe8860418acdc10ef24c39","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"section rows","params":{"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":167,"exactWidth":306,"exactHeight":167.08999999999997,"growHeightWithContent":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":5,"exactX":0,"exactY":5.18,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"repeat":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"sectionRepeater.rows"}}},"component":"data2-core-types@Reference","showAllConditionals":true},"repeatReference":{"component":"data2-core-primitives@String","params":{"content":"row"}}},"index":3},{"_id":"6abe8860418acdc10ef24c3c","parent":"6abe8860418acdc10ef24c3b","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"row","params":{"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":58,"exactWidth":306,"exactHeight":57.97,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":1,"y":6,"exactX":1.46,"exactY":6,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"border":{"component":"data2-core-types@Border","params":{"color":"#e8e8e8","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"1"}}},"onClick":{"params":{"actions":[{"params":{"actions":[{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":10}}},"component":"data2-core-flow@Delay"},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"Kt8jmnpclBKw8oivjCx59"}},"prop":"close"},"disabled":false}]},"component":"data2-core-flow@Series"},{"component":"data2-core-types@Getter","params":{"module":{"op":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"on_reply_action"}}}}},"prop":{"component":"data2-core-primitives@String","params":{"content":"op"}},"args":[{"type":{"component":"data2-core-primitives@String","params":{"content":"list_reply"}},"list_reply":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rowRepeater"}}}}}]}}]},"component":"data2-core-flow@Series"},"stateDefinitions":[{"component":"data2-core-user-interface@StateDefinition","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}},"component":"data2-core-primitives@Boolean"}}],"onMouseEnter":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c3c"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}},"disabled":false},"value":{"params":{"content":true},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"onMouseLeave":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c3c"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}},"value":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}},"component":"data2-core-types@Setter"},"backdropFilter":{"params":{"then":[{"component":"data2-core-types@BitmapFilter","params":{"type":"brightness","unit":"%","value":90}}],"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__UIState"}},"prop":{"component":"data2-core-user-interface@StateProp","params":{"componentId":{"component":"data2-core-primitives@String","params":{"content":"6abe8860418acdc10ef24c3c"}},"key":{"component":"data2-core-primitives@String","params":{"content":"hover"}}}}}}},"component":"data2-core-flow@If"}},"index":0},{"_id":"6abe8860418acdc10ef24c3d","parent":"6abe8860418acdc10ef24c3c","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"row title","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":22,"exactWidth":306,"exactHeight":22.29,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":0,"exactX":false,"exactY":false,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":14}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rowRepeater.title"}}}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":1},{"_id":"6abe8860418acdc10ef24c3e","parent":"6abe8860418acdc10ef24c3c","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"row description","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(255,255,255,0.3)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill","disabled":true},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":308,"height":19,"exactWidth":306,"exactHeight":18.79,"growHeightWithContent":true,"growWidthWithContent":true,"maxWidth":{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"max_width"}}},"component":"data2-core-types@Reference"}},"break":true},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":0,"y":2,"exactX":0,"exactY":2,"right":true,"top":true,"fixed":false,"bottom":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"left":true,"growV":false,"growH":false},"break":false},"textSize":{"component":"data2-core-primitives@Number","params":{"content":12}},"textFormat":{"disabled":false,"component":"data2-core-types@TextFormat","params":{"lineHeight":1.3,"wordWrap":"break-word"}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":39}},"text":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"rowRepeater.description"}}}},"font":{"disabled":false,"component":"data2-core-web@GoogleFont","params":{"fontFamily":"Inter"}}},"index":2},{"_id":"6abe8860418acdc10ef24c3f","parent":"6abe8860418acdc10ef24c3c","component":"data2-core-primitives@Block","system":"645b823726c1280637133f0e","displayName":"spacer","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":false,"x":149,"y":0,"exactX":false,"exactY":false,"right":false,"top":true,"fixed":false,"bottom":false,"left":false,"growV":false,"growH":false}},"childrenMode":"reference","childrenReference":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{}},"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":10,"exactWidth":10,"height":6,"exactHeight":6}}},"index":4}]}},{"_id":"5fc4faeec8da12be8bf3d08a","component":"data2-core@Data2TableDataSource","system":"5e3b796d6228227ca637d0f4","params":{"paginate":{"default":1000},"super":{},"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"fileId"}},"title":"File ID","component":"data2-core-primitives@ObjectId"},"break":true}],"hooks":{"before":{"all":[{"hook":"softDelete"}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"timestamp","options":{"fields":["createdAt","updatedAt"]}}],"update":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}],"patch":[{"hook":"timestamp","options":{"fields":["updatedAt"]}}]},"after":{"all":[{"hook":"fileUrl","options":{"downloadField":"params.fileUrl","uploadField":"params.uploadFileUrl","enhanceSchema":false}}],"find":[{"hook":"useCache","options":{"additionalGroupKeys":["$and.0.system","$and.1.system"],"skipCache":true}}],"create":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"update":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"patch":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}],"remove":[{"hook":"invalidateCache","options":{"additionalGroupKeys":["system"],"secondaryUniqueKeys":["reference"]}},{"hook":"invalidateEnvCache"}]}},"multi":["create"],"useEstimatedDocumentCount":true},"reference":"FileComponentInstancesTableDataSource","updatedAt":"2022-12-19T20:42:51.837Z","createdAt":"2020-11-30T13:59:52.294Z"},{"reference":"ApplicationsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6abaa0b39d2c4e1f33f10548","displayName":"Chatbot  - Hispanica Refactor","reference":"0iBs9NoXIDEizw9IxlsFn","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"hispanicahml"}},"entryPoint":{"disabled":false,"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"fVQzha7r_BHHuSVVJvMmd"}},"custom-fonts":[{"component":"data2-core-web@Font","params":{"family":{"component":"data2-core-primitives@String","params":{"content":"NaturaCo"}},"faces":[{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"WlsMxAuCpOzeSIrWjEA2d"}},"format":"opentype","style":"normal","weight":"600"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"PwFn-zce9Ori54cZdzuEb"}},"format":"opentype","style":"normal","weight":"400"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"0MbzdVtBT9Z9Dk7fw1QYh"}},"format":"opentype","style":"italic","weight":"500"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"q3VPlA9gnaYU4xx-soq9O"}},"format":"opentype","style":"normal","weight":"300"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"WxGhuZlyx4XOzWKEwdR3z"}},"format":"opentype","style":"normal","weight":"500"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"StxbTdvnOo63A4xNNqK4s"}},"format":"opentype","style":"italic","weight":"300"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"d_GnVMy8hLx-HoYzHZRdN"}},"format":"opentype","style":"italic","weight":"400"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"6tl98UKSJ1MsTw346LctN"}},"format":"opentype","style":"italic","weight":"700"},{"src":{"component":"data2-core-types@FileComponentUrlReference","params":{"reference":"mjL7ukNvj3cX8r0LcRJPn"}},"format":"opentype","style":"normal","weight":"700"}]},"displayName":"NaturaCo"}],"customScripts":[{"params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"ht"}},"src":{"component":"data2-core-primitives@String","params":{"content":"https://natura.data2.media/file/4fuODp9d9yYPZsfVHxFSJ.js"}}},"component":"data2-core-web@Script"}],"font":{"params":{"fonts":[]},"component":"data2-core-web@Fonts"}},"system":"645b823726c1280637133f0e","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6aba976d9d2c4e1f33f10547","component":"data2-core@Store","system":"645b823726c1280637133f0e","params":{"initialData":{"params":{"fields":{"responding":{"component":"data2-core-primitives@Boolean","params":{}},"messages":{"params":{},"component":"data2-core-primitives@String"},"startTime":{"component":"data2-core-primitives@String","params":{}},"chatId":{"params":{},"component":"data2-core-primitives@String"},"observe_fix_scroll":{"params":{},"component":"data2-core-functions@DateNow"},"typing":{"params":{},"component":"data2-core-primitives@Boolean"},"audio_url":{"component":"data2-core-primitives@String","params":{}},"audio_state":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"attachment_state":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"attachment":{"component":"data2-core-primitives@String","params":{}},"input":{"component":"data2-core-primitives@String","params":{}},"env":{"params":{"defaultCase":{"component":"data2-core-primitives@String","params":{"content":"HML"}},"expression":{"params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fVQzha7r_BHHuSVVJvMmdInterface"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"location.href"}}},"component":"data2-core-types@Getter"},"cases":[{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portaldeatencion-ecuador-hml"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HML"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portaldeatencion-ecuador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PRD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"auth-portaldeatencion-ecuador-hml"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HML"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"auth-portaldeatencion-ecuador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PRD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portalagents-ecuador"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PRD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portalagents-ecuador-hml"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HML"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portal-konecta"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PRD"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portal-konecta-hml"}},"value":{"component":"data2-core-primitives@String","params":{"content":"HML"}}}},{"component":"data2-core-flow@Case","params":{"expression":{"component":"data2-core-primitives@String","params":{"content":"portaldeatencionhispanica"}},"value":{"component":"data2-core-primitives@String","params":{"content":"PRD"}}}}]},"component":"data2-core-flow@Switch"},"mock":{"index":0,"sender":"HUMAN","time":"2024-08-24T16:19:41-03:00","id":"vuYhF_8e6NSsj8nskd-Eg","type":"text","text":{"body":{"component":"data2-core-primitives@String","params":{"content":"Perfumería, cosméticos, cuidado personal y belleza consciente. Compra en línea productos naturales con propósito y transforma tu rutina con Natura."}}},"audio":{"link":"https://natura.data2.media/file/Vi-SUuGJBZrWceOO6dEpL"},"image":{"link":{"component":"data2-core-primitives@String","params":{"content":"https://natura.data2.media/file/DTV60LKmEwXs7KaG-lBoZ"}},"caption":{"component":"data2-core-primitives@String","params":{"content":"Hola! Soy AVI"}}},"document":{"link":{"component":"data2-core-primitives@String","params":{"content":"https://natura.data2.media/file/KHXgxQpdLYZGoRTFk7SOZ"}},"caption":{"component":"data2-core-primitives@String","params":{"content":"Natura Manual"}},"filename":{"component":"data2-core-primitives@String","params":{"content":"Natura_manual.pdf"}}},"video":{"link":{"component":"data2-core-primitives@String","params":{"content":"https://natura.data2.media/file/F5u4QdOYQftYLGj2YFAeg"}},"caption":{"component":"data2-core-primitives@String","params":{"content":"Cool video here!"}}},"interactive":{"type":"cta_url","header":{"text":{"component":"data2-core-primitives@String","params":{"content":"Shiba Inu"}},"type":"text"},"body":{"text":{"component":"data2-core-primitives@String","params":{"content":"Check ou these Shiba Inus"}},"type":"text"},"footer":{"text":{"component":"data2-core-primitives@String","params":{"content":"They are so cute!"}},"type":"text"},"action":{"name":{"component":"data2-core-primitives@String","params":{"content":"cta_url"}},"parameters":{"display_text":{"component":"data2-core-primitives@String","params":{"content":"See Cuteness"}},"url":{"component":"data2-core-primitives@String","params":{"content":"https://en.wikipedia.org/wiki/Shiba_Inu"}}},"buttons":[{"type":{"component":"data2-core-primitives@String","params":{"content":"reply"}},"reply":{"id":{"component":"data2-core-primitives@String","params":{"content":"shibainu_red"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Red"}}}},{"type":{"component":"data2-core-primitives@String","params":{"content":"reply"}},"reply":{"id":{"component":"data2-core-primitives@String","params":{"content":"shibainu_black_tan"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Black & Tan"}}}},{"type":{"component":"data2-core-primitives@String","params":{"content":"reply"}},"reply":{"id":{"component":"data2-core-primitives@String","params":{"content":"cream"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cream"}}}}],"button":{"component":"data2-core-primitives@String","params":{"content":"Color options"}},"sections":[{"title":"I want it ASAP!","rows":[{"id":{"component":"data2-core-primitives@String","params":{"content":"red"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Red"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Like a fox"}}},{"id":{"component":"data2-core-primitives@String","params":{"content":"black_tan"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Black & Tan"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Like a tanuki"}}},{"id":{"component":"data2-core-primitives@String","params":{"content":"cream"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Cream"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Like a mochi"}}}]},{"title":"I can wait a bit","rows":[{"id":{"component":"data2-core-primitives@String","params":{"content":"sesame"}},"title":{"component":"data2-core-primitives@String","params":{"content":"Sesame"}},"description":{"component":"data2-core-primitives@String","params":{"content":"Rare color"}}}]}]}},"sticker":{"link":{"params":{"content":"https://natura.data2.media/file/zRcpL28e4LbLmtHSeq0Pr"},"component":"data2-core-primitives@String"},"caption":{"component":"data2-core-primitives@String","params":{"content":"Hola soy Avi! "}}}}}},"component":"data2-core-types@FieldSet"}},"reference":"OTsxKbZ6-l2tbSA_uBvPI"},{"_id":"66cbefe8da243b18365bcf78","component":"data2-core@DataSet","system":"645b823726c1280637133f0e","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SLmNv-LV-cJKTjap-64uJ"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}},"master":{"params":{"dataset":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"masterField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"chat_id"}},"localField":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"chat_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"3euPAXpP7r3NHYY19q_HG"},{"_id":"682f4b450529d4658f96a0cd","component":"data2-core-connect@PowerCordSocket","system":"645b823726c1280637133f0e","params":{"onMessage":{"params":{"actions":[{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"event"}},{"component":"data2-core-primitives@String","params":{"content":"data"}}],"body":{"component":"data2-core-types@Getter","params":{"prop":{"component":"data2-core-primitives@String","params":{"content":"ex"}},"module":{"ex":{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"user OnMessage"}},{"event":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"event"}}}},"data":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"data"}}}}}]},"disabled":true},{"params":{"actions":[{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"fvKZ9V-3Rrmp2GMO4qInI"}},"prop":"refresh"}}]},"component":"data2-core-flow@Series","displayName":"filter/refresh"},{"params":{"actions":[{"params":{"actions":[{"params":{"then":{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"Skip sync because it is already responding"}},"code":{"component":"data2-core-primitives@Number","params":{"content":400}}},"component":"data2-core-types@Error"},"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.responding"}}}}},"component":"data2-core-flow@If"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":"refresh"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":"refresh"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":"refresh"}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":"sync"}}]},"component":"data2-core-flow@Parallel","displayName":"Fetch session and messages"},{"params":{"actions":[{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":"paginate","args":[{"size":{"component":"data2-core-primitives@Number","params":{"content":100}}}]},"disabled":true},{"params":{"actions":[{"params":{"action":{"params":{"array":{"params":{"messages_1":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"messages_2":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}},"component":"natura@PV4KIz6EZyjdWP2Eb7Laj"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m._id"}}}}}}},"component":"data2-core-functions@ArrayFilter"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"next_messages"}}},"component":"data2-core-flow@Step"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"msg lenght"}},"data":{"next msg lenght":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}},"msg lenght":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages.length"}}}},"Mns":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages"}}}},"DAta":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr","disabled":true},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages.length"}}}},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}}},"component":"data2-core-comparison-operators@EqualOrGreaterThan"},"then":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"MESCROLLA"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"},"else":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"MESCROLLA"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"}},"component":"data2-core-flow@If","displayName":"merge messages if new message"}]},"component":"data2-core-flow@Series","displayName":"merge messages"},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.status"}}}},"comparisonSubject":{"component":"data2-core-primitives@String","params":{"content":"queue"}}},"component":"data2-core-comparison-operators@Equal"},"then":{"params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"PqjPbzpg-bFvxXV9qSA8T"}},"prop":"invoke","args":[{"body":{"chat_id":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"ewDp8c4XuPQHsmcZkYlwj"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"cursor.current.chat_id"}}}}}}]},"component":"data2-core-types@Interaction","disabled":false}},"component":"data2-core-flow@If","displayName":"ping if queue"},{"component":"data2-core-flow@If","displayName":"merge messages chatbot-store (ChatBot-HispanicaRouter)","params":{"compare":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.chatId"}}}},"then":{"params":{"actions":[{"params":{"action":{"params":{"array":{"params":{"messages_1":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}},"messages_2":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}},"component":"natura@PV4KIz6EZyjdWP2Eb7Laj"},"filter":{"disabled":false,"component":"data2-core-functions@Function","params":{"parameters":[{"component":"data2-core-primitives@String","params":{"content":"m"}}],"body":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"m._id"}}}}}}},"component":"data2-core-functions@ArrayFilter"},"resultName":{"component":"data2-core-primitives@String","params":{"content":"next_messages_chatbot"}}},"component":"data2-core-flow@Step"},{"params":{"message":{"component":"data2-core-primitives@String","params":{"content":"msg lenght"}},"data":{"next msg lenght":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}},"msg lenght":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages_chatbot.length"}}}},"Mns":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages_chatbot"}}}},"DAta":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}}},"component":"natura@3UcTJBMDap5uV1yKV_uLr","disabled":true},{"params":{"compare":{"params":{"subject":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages_chatbot.length"}}}},"comparisonSubject":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages.length"}}}}},"component":"data2-core-comparison-operators@EqualOrGreaterThan"},"then":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"next_messages_chatbot"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"},"else":{"params":{"actions":[{"component":"data2-core-types@Setter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"OTsxKbZ6-l2tbSA_uBvPI"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}},"value":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"3euPAXpP7r3NHYY19q_HG"}},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.records"}}}}}},{"params":{"delay":{"component":"data2-core-primitives@Number","params":{"content":500}}},"component":"data2-core-flow@Delay"},{"params":{"alignment":"end","id":{"component":"data2-core-primitives@String","params":{"content":"BASE-SCROLL"}}},"component":"data2-core-web@ScrollIntoView"}]},"component":"data2-core-flow@Series"}},"component":"data2-core-flow@If","displayName":"merge messages if new message"}]},"component":"data2-core-flow@Series","displayName":"merge messages chatbot-store"}}}],"concurrency":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-flow@Parallel"}]},"component":"data2-core-flow@Series"}],"concurrency":{"component":"data2-core-primitives@Number","params":{"content":1}}},"component":"data2-core-flow@Parallel","disabled":false}]},"component":"data2-core-flow@Parallel","disabled":false}]},"component":"data2-core-flow@Series"}}}}}},{"component":"data2-core-types@Interaction","params":{"module":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"__LoggerService"}},"prop":"log","args":[{"component":"data2-core-primitives@String","params":{"content":"Actual array"}},{"0":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"messages"}}}},"1":{"component":"data2-core-types@Getter","params":{"module":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"9pAH9qpiLrLvBOR6qKz6_"},"break":false},"prop":{"component":"data2-core-primitives@String","params":{"content":"data.messages"}}}}}]},"disabled":true}]},"component":"data2-core-flow@Series"},"autoConnect":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"reference":"lTQRb152dXh5ddifgEM_J"},{"_id":"66bc01b0223588da6c2118b1","component":"data2-core@DataSet","system":"645b823726c1280637133f0e","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"wLgYrXeVHjZmUvrnzu_XR"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"}},"reference":"ewDp8c4XuPQHsmcZkYlwj"},{"_id":"66cbeec6da243b18365bcf76","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"SLmNv-LV-cJKTjap-64uJ","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"session","key":"session","component":"data2-core-types@Lookup","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}},"table":"wLgYrXeVHjZmUvrnzu_XR"}},{"component":"data2-core-types@Field","params":{"title":"chat_id","key":"chat_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"id","key":"id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"index","key":"index","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"time","key":"time","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"sender","key":"sender","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"HUMAN,ASSISTANT,AGENT,SYSTEM"}}}}},{"component":"data2-core-types@Field","params":{"title":"agent","key":"agent","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@String","title":"agent_name","key":"agent_name"}},{"component":"data2-core-types@Field","params":{"title":"type","key":"type","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"text,audio,text+audio,image,video,document,sticker,interactive,button_reply,list_reply"}}}}},{"component":"data2-core-types@Field","params":{"title":"text","key":"text","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"audio","key":"audio","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"image","key":"image","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"video","key":"video","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"document","key":"document","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"sticker","key":"sticker","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"interactive","key":"interactive","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"button_reply","key":"button_reply","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"list_reply","key":"list_reply","component":"data2-core-primitives@Object"}}]},"reference":"SLmNv-LV-cJKTjap-64uJ"},{"_id":"66bbfea2c30926feb2325ba2","component":"data2-core@Store","system":"645b823726c1280637133f0e","params":{"initialData":{"params":{"fields":{"responding":{"component":"data2-core-primitives@Boolean","params":{}},"messages":{"params":{"then":[{"index":0,"sender":"HUMAN","time":"2024-08-23T22:24:36+00:00","id":"rYQ8O7e_q8W0eL4rO10a5","assistant":{},"type":"text","text":{"body":"hola! "}},{"index":1,"sender":"ASSISTANT","time":"2024-08-23T22:24:37+00:00","id":"gVt2oHC_-sFE8pZVtTf1u","assistant":{},"type":"text","text":{"body":"Hola Soy Avi/Nat la asistente virtual de Natura y estoy aquí para ayudarte 😃"}},{"index":2,"sender":"ASSISTANT","time":"2024-08-23T22:24:38+00:00","id":"BiJT1RqXJqJOoe28rq1F5","assistant":{},"type":"interactive","interactive":{"type":"list","body":{"text":"Ahora elige como quieres ingresar: ⬇️","type":"text"},"action":{"button":"Perfiles","sections":[{"title":"Perfiles","rows":[{"id":"consultant","title":"Consultor(a) de Belleza Natura y digital. ❤️","description":"Consultor(a)"},{"id":"leader","title":"Nuestros líderes. 🫱🏽‍🫲🏿","description":"Líder"},{"id":"manager","title":"Nuestros gerentes. ⭐","description":"Gerente"}]}]}}}],"compare":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"builder"}}}},"else":[]},"component":"data2-core-flow@If"},"startTime":{"component":"data2-core-primitives@String","params":{}},"chatId":{"params":{},"component":"data2-core-primitives@String"},"observe_fix_scroll":{"params":{},"component":"data2-core-functions@DateNow"},"typing":{"params":{},"component":"data2-core-primitives@Boolean"},"audio_url":{"component":"data2-core-primitives@String","params":{}},"audio_state":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"attachment_state":{"component":"data2-core-primitives@String","params":{"content":"standby"}},"attachment":{"component":"data2-core-primitives@String","params":{}}}},"component":"data2-core-types@FieldSet"}},"reference":"9pAH9qpiLrLvBOR6qKz6_"},{"_id":"66e10963257e5a810bc9ef28","component":"data2-core@DataSet","system":"645b823726c1280637133f0e","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"LjY69zNPBf-S4iKWcJzWT"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"filter":{"params":{"_id":{"component":"data2-core-primitives@String","params":{"content":"000000000000000000000000"}}},"component":"data2-core-types@DataSetFilter"},"pagination":{"size":20}},"reference":"fvKZ9V-3Rrmp2GMO4qInI"},{"_id":"66bc01b0223588da6c2118b0","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"wLgYrXeVHjZmUvrnzu_XR","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"chat_id","key":"chat_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"whatsapp","key":"whatsapp","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"profile","key":"profile","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"consultant,leader,manager,consumer,be_consultant,consumer_online,N/I,"}}}}},{"component":"data2-core-types@Field","params":{"title":"identification_method","key":"identification_method","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"identification","key":"identification","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"identification_document","key":"identification_document","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"consultant_id","key":"consultant_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"cesada","key":"cesada","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"authenticated_consultant_id","key":"authenticated_consultant_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"user_id_whatsapp","key":"user_id_whatsapp","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"impersonation_usecase","key":"impersonation_usecase","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"impersonation_identification","key":"impersonation_identification","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"impersonation_consultant"}}}}},{"component":"data2-core-types@Field","params":{"title":"impersonation_IdRequest","key":"impersonation_id_request","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":""}}}}},{"component":"data2-core-types@Field","params":{"title":"impersonation_option","key":"impersonation_option","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"impersonation_myself,impersonation_consultant"}}}}},{"component":"data2-core-types@Field","params":{"title":"impersonation_consultant_id","key":"impersonation_consultant_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"sector","key":"sector","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"sector_code","key":"sector_code","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"status","key":"status","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"profile,identification,proactivo,ai,queue,agent,survey,cancelled,completed"}}}}},{"component":"data2-core-types@Field","params":{"title":"country","key":"country","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"MX,AR,EC,CL,PE,CO"}}}}},{"component":"data2-core-types@Field","params":{"title":"channel","key":"channel","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"web,whatsapp"}}}}},{"component":"data2-core-types@Field","params":{"title":"env","key":"env","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"PRD,HML,DEV"}}}}},{"component":"data2-core-types@Field","params":{"title":"profile_started_at","key":"profile_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"profile_time","key":"profile_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"identification_started_at","key":"identification_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"identification_time","key":"identification_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"proactivo_started_at","key":"proactivo_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"proactivo_time","key":"proactivo_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"ai_started_at","key":"ai_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"ai_time","key":"ai_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"queue_started_at","key":"queue_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"queue_time","key":"queue_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"agent_started_at","key":"agent_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"agent_rejected_at","key":"agent_rejected_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"agent_time","key":"agent_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"survey_started_at","key":"survey_started_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"survey_time","key":"survey_time","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"ended_at","key":"ended_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"queue","key":"queue","component":"data2-core-types@Lookup","table":"mz3UXiIKmZSpvLYDhjAM5","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}}},{"component":"data2-core-types@Field","params":{"title":"queue_label","key":"queue_label","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"agent","key":"agent","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}},"break":false},{"component":"data2-core-types@Field","params":{"title":"agent_name","key":"agent_name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"agent_internal_number","key":"agent_internal_number","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"agent_started_by","key":"agent_started_by","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}},"break":false,"disabled":false},{"component":"data2-core-types@Field","params":{"title":"agent_ended_by","key":"agent_ended_by","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}},"disabled":false},{"component":"data2-core-types@Field","params":{"title":"agent_rejected_by","key":"agent_rejected_by","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":0}}},"disabled":false},{"component":"data2-core-types@Field","params":{"title":"last_user_message_at","key":"last_user_message_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"last_assistant_message_at","key":"last_assistant_message_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"last_agent_message_at","key":"last_agent_message_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"sended_recommendation","key":"sended_recommendation","component":"data2-core-primitives@Boolean","validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"sensitive":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}},{"component":"data2-core-types@Field","params":{"title":"location_substatus","key":"location_substatus","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@String","title":"number_order","key":"number_order"}},{"component":"data2-core-types@Field","params":{"title":"status_Order","key":"status_order","component":"data2-core-primitives@String"},"disabled":false},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@Object","title":"invoice_list","key":"invoice_list"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@Object","title":"order_list","key":"order_list"}},{"component":"data2-core-types@Field","params":{"component":"data2-core-primitives@Object","title":"orders_cancel","key":"orders_cancel"}},{"component":"data2-core-types@Field","params":{"title":"api_error","key":"api_error","component":"data2-core-primitives@Boolean","validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"sensitive":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}},{"component":"data2-core-types@Field","params":{"title":"impersonation_error","key":"impersonation_error","component":"data2-core-primitives@Boolean","validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"sensitive":{"component":"data2-core-primitives@Boolean","params":{"content":false}}}},{"component":"data2-core-types@Field","params":{"title":"last_use_case","key":"last_use_case","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"last_faq","key":"last_faq","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"maia","key":"maia","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"certificate","key":"certificate","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"certificate_data","key":"certificate_data","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"started_ai_conversation","key":"started_ai_conversation","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"start_cycle","key":"start_cycle","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"end_cycle","key":"end_cycle","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"proactivo_msg","key":"proactivo_msg","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"send_proactivo","key":"send_proactivo","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"external_transfer_conversation_id","key":"external_transfer_conversation_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"external_transfer_status","key":"external_transfer_status","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"external_transfer_interaction_id","key":"external_transfer_interaction_id","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"all_external_transfer_conversation_id","key":"all_external_transfer_conversation_id","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@Field","params":{"title":"all_external_transfer_message_uuid","key":"all_external_transfer_message_uuid","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@Field","params":{"title":"last_message","key":"last_message","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"temporal_session","key":"temporal_session","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"bypass","key":"bypass","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"count_queue","key":"count_queue","component":"data2-core-primitives@Number","validation":{"integer":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}}},{"component":"data2-core-types@Field","params":{"title":"impure_retention","key":"impure_retention","component":"data2-core-primitives@Boolean","sensitive":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@Field","params":{"title":"return_bot_ia","key":"return_bot_ia","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"faq_fluxe_boton","key":"faq_fluxe_boton","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"auth_count","key":"auth_count","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"last_message_user_preauth","key":"last_message_user_preauth","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"title":"user_name","key":"user_name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"correo_electronico","key":"correo_electronico","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"gerencia","key":"gerencia","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"gerencia_code","key":"gerencia_code","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"grupo","key":"grupo","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"grupo_code","key":"grupo_code","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"flag_csat","key":"flag_csat","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"send_autocsat","key":"send_autocsat","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"abandoned","key":"abandoned","component":"data2-core-types@Formula","sensitive":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"validation":{"required":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":""}},"formula":{"component":"data2-core-primitives@String","params":{"content":"if({{$record.cesada}} or {{$record.status}} == 'completed' or {{$record.status}} == 'closed', 1 == 0, {{$record.ended_at}} != {{$record.zzz_no_existe}} and {{$record.ai_started_at}} == {{$record.zzz_no_existe}} and {{$record.started_ai_conversation}} == {{$record.zzz_no_existe}} and {{$record.last_use_case}} == {{$record.zzz_no_existe}} and {{$record.queue_started_at}} == {{$record.zzz_no_existe}} and {{$record.all_external_transfer_conversation_id}} == {{$record.zzz_no_existe}} and {{$record.external_transfer_status}} == {{$record.zzz_no_existe}} and {{$record.profile}} != 'consumer_online')"}}}},{"component":"data2-core-types@Field","params":{"title":"gn_ar_piloto","key":"gn_ar_piloto","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"respond_csat","key":"respond_csat","component":"data2-core-primitives@Boolean"}}]},"reference":"wLgYrXeVHjZmUvrnzu_XR"},{"_id":"66bf88b2aef89125ec215fc0","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"1RQmj18MSuMkFbexypg2l","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"email","key":"email","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"password","key":"password","component":"data2-core-types@Password"}},{"component":"data2-core-types@Field","params":{"title":"name","key":"name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"role","key":"role","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"agent,supervisor"}}}}},{"component":"data2-core-types@Field","params":{"title":"internal_number","key":"internal_number","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"env","key":"env","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"HML,PRD"}}}}},{"component":"data2-core-types@Field","params":{"title":"country","key":"country","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"EC,CL"}}}}}]},"reference":"1RQmj18MSuMkFbexypg2l"},{"_id":"66bc01b0223588da6c2118c5","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"LjY69zNPBf-S4iKWcJzWT","schema":[{"component":"data2-core-types@Field","params":{"title":"agent","key":"agent","component":"data2-core-types@Lookup","table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":1}}},"break":false},{"component":"data2-core-types@Field","params":{"title":"status","key":"status","component":"data2-core-types@Lookup","table":"CqSALqg7f_W_s_fzWoo_H","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@Field","params":{"title":"status_type","key":"status_type","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"online,offline,stop,pause"}}}}},{"component":"data2-core-types@Field","params":{"title":"in_service","key":"in_service","component":"data2-core-primitives@Boolean"}},{"component":"data2-core-types@Field","params":{"title":"transfers_count","key":"transfers_count","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"last_transfer_at","key":"last_transfer_at","component":"data2-core-primitives@Date"}},{"component":"data2-core-types@Field","params":{"title":"env","key":"env","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"DEV,HML,PRD"}}}}}],"multi":["create"]},"reference":"LjY69zNPBf-S4iKWcJzWT"},{"_id":"66d0a8e72b24551bb1097c68","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"mz3UXiIKmZSpvLYDhjAM5","schema":[{"component":"data2-core-types@Field","params":{"title":"label","key":"label","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"name","key":"name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"country","key":"country","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"EC,CL,CO,MX,PE,AR"}}}}},{"component":"data2-core-types@Field","params":{"title":"profiles","key":"profiles","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"consultant,leader,manager,sales_manager"}}},"list":{"component":"data2-core-primitives@Boolean","params":{"content":true}}}},{"component":"data2-core-types@Field","params":{"title":"channels","key":"channels","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"web,whatsapp"}}}}},{"component":"data2-core-types@Field","params":{"title":"agents","key":"agents","component":"data2-core-types@Lookup","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"table":"1RQmj18MSuMkFbexypg2l","populateDepth":{"component":"data2-core-primitives@Number","params":{"content":1}}}},{"component":"data2-core-types@Field","params":{"title":"time_from","key":"time_from","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"time_to","key":"time_to","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"time_zone","key":"time_zone","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"days_week","key":"days_week","component":"data2-core-primitives@String","list":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"mon,tue,wed,thu,fri"}}}}},{"component":"data2-core-types@Field","params":{"title":"saturday_time_from","key":"saturday_time_from","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"saturday_time_to","key":"saturday_time_to","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"sunday_time_from","key":"sunday_time_from","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"sunday_time_to","key":"sunday_time_to","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"abandon_timeout_seconds","key":"abandon_timeout_seconds","component":"data2-core-primitives@Number"}},{"component":"data2-core-types@Field","params":{"title":"agent_inactivity_timeout_seconds","key":"agent_inactivity_timeout_seconds","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"user_inactivity_timeout_seconds","key":"user_inactivity_timeout_seconds","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"outside_hours_message","key":"outside_hours_message","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"unavailable_agent_message","key":"unavailable_agent_message","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"env","key":"env","component":"data2-core-primitives@String","validation":{"oneOf":{"component":"data2-core-primitives@String","params":{"content":"DEV,HML,PRD"}}}}}],"multi":["create"]},"reference":"mz3UXiIKmZSpvLYDhjAM5"},{"_id":"66d88c066e412f6a5f478fbd","component":"data2-core@Data2TableDataSource","system":"645b823726c1280637133f0e","params":{"table":"CqSALqg7f_W_s_fzWoo_H","multi":["create"],"schema":[{"component":"data2-core-types@Field","params":{"title":"title","key":"title","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"title":"type","key":"type","component":"data2-core-primitives@String"}}]},"reference":"CqSALqg7f_W_s_fzWoo_H"},{"_id":"66bbfea2c30926feb2325ba3","component":"data2-core@Store","system":"645b823726c1280637133f0e","params":{"initialData":{"params":{"fields":{"input":{"component":"data2-core-primitives@String","params":{}}}},"component":"data2-core-types@FieldSet"}},"reference":"dCKhvrTGA0OHPdPfM4GGh"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}