{"context":{"domain":"granado-app"},"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}],"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":"2025-11-05T19:23:47.135Z","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":"6a62e4640613f70fa449ff5d","name":"app","domain":"granado-app","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z","createdAt":"2026-07-24T04:04:52.993Z"}]}},{"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":"6a63007ffd7945abd1edc83e","component":"data2-core-types@Component","system":"6a62e4640613f70fa449ff5d","params":{"extends":"data2-core-primitives@Block","component":"kFarmaceutico","package":"granado-app","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"function esc(s){ return (s==null?'':String(s)).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;'); }\nfunction money(d2,v){ const n = Number(v)||0; return d2.fmt.currency(n,'BRL',{maximumFractionDigits: (n%1===0?0:2)}); }\nfunction disc(p){ return (Number(p.listPrice)>Number(p.price)) ? Math.round((1-Number(p.price)/Number(p.listPrice))*100) : 0; }\nfunction initial(name){ const m=(name||'').replace(/^(Eau de Toilette|Perfume|Sabonete|Hidratante|Vela|Difusor|Óleo|Shampoo|Kit)\\s*/i,'').trim(); return (m||name||'G').charAt(0).toUpperCase(); }\n\nfunction productCard(d2,p){\n  if(!p) return '';\n  const d = disc(p);\n  return `<article class=\"pcard\" data-key=\"${esc(p.productId)}\">\n    <div class=\"pcard-imgwrap\">\n      <span class=\"pcard-mono\">${esc(initial(p.name))}</span>\n      <div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div>\n      ${d>0?`<span class=\"pcard-disc\">-${d}%</span>`:''}\n    </div>\n    <div class=\"pcard-body\">\n      <span class=\"pcard-line\">${esc(p.brandLine)}</span>\n      <h4 class=\"pcard-name\">${esc(p.name)}</h4>\n      <div class=\"pcard-price\">\n        <span class=\"pcard-now\">${money(d2,p.price)}</span>\n        ${d>0?`<span class=\"pcard-was\">${money(d2,p.listPrice)}</span>`:''}\n      </div>\n      <button class=\"add-bag\" data-add=\"${esc(p.productId)}\"><span class=\"add-ic\">+</span> Adicionar à sacola</button>\n    </div>\n  </article>`;\n}\n\nfunction railHTML(d2,r,idx){\n  const cards=(r.products||[]).map(p=>productCard(d2,p)).filter(Boolean).join('');\n  if(!cards) return '';\n  return `<section class=\"rail\" data-key=\"rail-${idx}\">\n    <div class=\"rail-head\">\n      <h3 class=\"rail-title\">${esc(r.title)}</h3>\n      ${r.subtitle?`<span class=\"rail-sub\">${esc(r.subtitle)}</span>`:''}\n    </div>\n    <div class=\"rail-scroll\">${cards}</div>\n  </section>`;\n}\n\nfunction boxCard(d2){\n  const bullets=['5 a 6 produtos da linha Vintage','Curadoria com valor de ~R$250','+20% de desconto exclusivo','Frete grátis, renova sozinha'];\n  return `<section class=\"boxcard\" data-key=\"box\">\n    <div class=\"box-left\">\n      <span class=\"box-kicker\">Assinatura Granado</span>\n      <h3 class=\"box-title\">Granado Box</h3>\n      <p class=\"box-desc\">Uma caixa da nossa perfumaria e banho a cada 2 meses. Você economiza e ganha novidade sem pensar.</p>\n      <ul class=\"box-bul\">${bullets.map(b=>`<li>${esc(b)}</li>`).join('')}</ul>\n    </div>\n    <div class=\"box-right\">\n      <div class=\"box-off\">−20%</div>\n      <div class=\"box-price\"><b>${money(d2,150)}</b><span>a cada 2 meses</span></div>\n      <button class=\"box-cta\" data-subscribe>Assinar a Box</button>\n      <span class=\"box-fine\">cancele quando quiser</span>\n    </div>\n  </section>`;\n}\n\nfunction renderBlock(d2, b, byId, idx){\n  const delay = `style=\"animation-delay:${idx*120}ms\"`;\n  if(b.type==='say'){\n    if(!b.text) return '';\n    return `<div class=\"blk say\" ${delay}>\n      <div class=\"say-attr\"><span class=\"say-glyph\">✦</span> Seleção para você</div>\n      <p class=\"say-text\">${esc(b.text)}</p>\n    </div>`;\n  }\n  if(b.type==='whyChips'){\n    const chips=(b.chips||[]).map(c=>`<span class=\"why\">${esc(c)}</span>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk whyrow\" ${delay}><span class=\"why-label\">por que combina</span>${chips}</div>`;\n  }\n  if(b.type==='productRail'){\n    const items=(b.ids||[]).map(id=>byId[id]).filter(Boolean);\n    const cards=items.map(p=>productCard(d2,p)).join('');\n    if(!cards) return '';\n    return `<div class=\"blk rail\" ${delay}>\n      ${b.title?`<div class=\"rail-head\"><h3 class=\"rail-title\">${esc(b.title)}</h3></div>`:''}\n      <div class=\"rail-scroll\">${cards}</div>\n    </div>`;\n  }\n  if(b.type==='ritual'){\n    const items=(b.ids||[]).map(id=>byId[id]).filter(Boolean);\n    if(!items.length) return '';\n    const total=items.reduce((a,p)=>a+(Number(p.price)||0),0);\n    const listTotal=items.reduce((a,p)=>a+(Number(p.listPrice)||Number(p.price)||0),0);\n    const save=listTotal-total;\n    const ids=items.map(p=>p.productId).join(',');\n    const rows=items.map(p=>`<div class=\"kit-item\" data-key=\"${esc(p.productId)}\">\n        <div class=\"kit-thumb\"><span class=\"pcard-mono sm\">${esc(initial(p.name))}</span><div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div></div>\n        <div class=\"kit-meta\"><span class=\"kit-name\">${esc(p.name)}</span><span class=\"kit-line\">${esc(p.brandLine)}</span></div>\n        <span class=\"kit-price\">${money(d2,p.price)}</span>\n      </div>`).join('');\n    return `<div class=\"blk kit\" ${delay}>\n      <div class=\"kit-head\"><span class=\"kit-kicker\">Kit sugerido</span><h3 class=\"kit-title\">${esc(b.title||'Seu kit Granado')}</h3></div>\n      ${b.story?`<p class=\"kit-story\">${esc(b.story)}</p>`:''}\n      <div class=\"kit-items\">${rows}</div>\n      <div class=\"kit-foot\">\n        <div class=\"kit-total\"><span>total do kit${save>0?` · você economiza ${money(d2,save)}`:''}</span><b>${money(d2,total)}</b></div>\n        <button class=\"kit-cta\" data-addkit=\"${esc(ids)}\">Adicionar kit à sacola</button>\n      </div>\n    </div>`;\n  }\n  if(b.type==='followUps'){\n    const chips=(b.chips||[]).map(c=>`<button class=\"fu\" data-followup=\"${esc(c)}\">${esc(c)} <i>→</i></button>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk furow\" ${delay}><span class=\"fu-label\">continue explorando</span>${chips}</div>`;\n  }\n  return '';\n}\n\nfunction md(s){\n  let t = esc(s==null?'':String(s));\n  t = t.replace(/\\*\\*([^*]+)\\*\\*/g,'<b>$1</b>');\n  t = t.replace(/(^|[^*])\\*([^*]+)\\*/g,'$1<i>$2</i>');\n  t = t.replace(/\\n/g,'<br/>');\n  return t;\n}\n\nfunction heroCard(d2,p){\n  if(!p) return '';\n  const d = disc(p);\n  return `<article class=\"hcard\" data-key=\"${esc(p.productId)}\">\n    <div class=\"hcard-imgwrap\"><span class=\"pcard-mono\">${esc(initial(p.name))}</span><div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div>${d>0?`<span class=\"pcard-disc\">-${d}%</span>`:''}</div>\n    <div class=\"hcard-body\">\n      <span class=\"pcard-line\">${esc(p.brandLine)}</span>\n      <h4 class=\"hcard-name\">${esc(p.name)}</h4>\n      <div class=\"pcard-price\"><span class=\"pcard-now\">${money(d2,p.price)}</span>${d>0?`<span class=\"pcard-was\">${money(d2,p.listPrice)}</span>`:''}</div>\n      <button class=\"add-bag\" data-add=\"${esc(p.productId)}\"><span class=\"add-ic\">+</span> Adicionar à sacola</button>\n    </div>\n  </article>`;\n}\n\nfunction kitCard(d2,part,byId){\n  const items=(part.ids||[]).map(id=>byId[id]).filter(Boolean);\n  if(!items.length) return '';\n  const total=items.reduce((a,p)=>a+(Number(p.price)||0),0);\n  const listTotal=items.reduce((a,p)=>a+(Number(p.listPrice)||Number(p.price)||0),0);\n  const save=listTotal-total;\n  const ids=items.map(p=>p.productId).join(',');\n  const rows=items.map(p=>`<div class=\"kit-item\" data-key=\"${esc(p.productId)}\">\n      <div class=\"kit-thumb\"><span class=\"pcard-mono sm\">${esc(initial(p.name))}</span><div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div></div>\n      <div class=\"kit-meta\"><span class=\"kit-name\">${esc(p.name)}</span><span class=\"kit-line\">${esc(p.brandLine)}</span></div>\n      <span class=\"kit-price\">${money(d2,p.price)}</span>\n    </div>`).join('');\n  return `<div class=\"kit\">\n    <div class=\"kit-head\"><span class=\"kit-kicker\">Kit sugerido</span><h3 class=\"kit-title\">${esc(part.title||'Seu kit Granado')}</h3></div>\n    ${part.story?`<p class=\"kit-story\">${esc(part.story)}</p>`:''}\n    <div class=\"kit-items\">${rows}</div>\n    <div class=\"kit-foot\">\n      <div class=\"kit-total\"><span>total do kit${save>0?` · você economiza ${money(d2,save)}`:''}</span><b>${money(d2,total)}</b></div>\n      <button class=\"kit-cta\" data-addkit=\"${esc(ids)}\">${esc(part.cta||'Adicionar kit à sacola')}</button>\n    </div>\n  </div>`;\n}\n\nfunction compareCard(d2,part,byId){\n  const items=(part.ids||[]).map(id=>byId[id]).filter(Boolean);\n  if(!items.length) return '';\n  const cols=items.map(p=>{\n    const d=disc(p);\n    return `<div class=\"cmp-col\" data-key=\"${esc(p.productId)}\">\n      <div class=\"cmp-imgwrap\"><span class=\"pcard-mono sm\">${esc(initial(p.name))}</span><div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div></div>\n      <span class=\"pcard-line\">${esc(p.brandLine)}</span>\n      <h4 class=\"cmp-name\">${esc(p.name)}</h4>\n      <div class=\"cmp-cat\">${esc(p.category||'')}</div>\n      <div class=\"pcard-price\"><span class=\"pcard-now\">${money(d2,p.price)}</span>${d>0?`<span class=\"pcard-was\">${money(d2,p.listPrice)}</span>`:''}</div>\n      <button class=\"add-bag\" data-add=\"${esc(p.productId)}\"><span class=\"add-ic\">+</span> Adicionar</button>\n    </div>`;\n  }).join('');\n  return `<div class=\"cmp\"><span class=\"wg-label\">comparando</span><div class=\"cmp-grid\">${cols}</div></div>`;\n}\n\nfunction valueMathCard(d2,part){\n  const lines=(part.lines||[]);\n  if(!lines.length) return '';\n  const rows=lines.map(l=>{\n    if(typeof l==='string') return `<li><span>${esc(l)}</span></li>`;\n    const val=(l.value!=null)?(typeof l.value==='number'?money(d2,l.value):esc(l.value)):'';\n    return `<li><span>${esc(l.label||l.text||'')}</span>${val?`<b>${val}</b>`:''}</li>`;\n  }).join('');\n  return `<div class=\"vmath\"><span class=\"wg-label\">a conta que faz sentido</span><ul class=\"vmath-list\">${rows}</ul></div>`;\n}\n\nfunction scentCard(d2,part){\n  const notes=(part.notes||[]);\n  if(!notes.length) return '';\n  const rows=notes.map(n=>{\n    const lvl=Math.max(0,Math.min(5,Math.round(Number(n.intensity)||0)));\n    let dots='';\n    for(let i=0;i<5;i++){ dots+=`<span class=\"scent-dot ${i<lvl?'on':''}\"></span>`; }\n    return `<div class=\"scent-row\"><span class=\"scent-label\">${esc(n.label)}</span><span class=\"scent-meter\">${dots}</span></div>`;\n  }).join('');\n  return `<div class=\"scent\"><span class=\"wg-label\">perfil olfativo</span>${rows}</div>`;\n}\n\nfunction heritageCard(d2,part){\n  return `<div class=\"heritage\"><span class=\"wg-label\">✦ herança Granado</span>${part.title?`<h4 class=\"her-title\">${esc(part.title)}</h4>`:''}<p class=\"her-text\">${md(part.text||'')}</p></div>`;\n}\n\nfunction renderPart(d2, part, byId, idx){\n  if(!part || !part.type) return '';\n  const delay = `style=\"animation-delay:${idx*90}ms\"`;\n  if(part.type==='text'){\n    if(!part.md) return '';\n    return `<div class=\"blk txt\" ${delay}><div class=\"bubble\">${md(part.md)}</div></div>`;\n  }\n  const w = part.widget;\n  let inner='';\n  if(w==='productRail'){\n    const cards=(part.ids||[]).map(id=>byId[id]).filter(Boolean).map(p=>productCard(d2,p)).join('');\n    if(!cards) return '';\n    return `<div class=\"blk rail\" ${delay}>${part.title?`<div class=\"rail-head\"><h3 class=\"rail-title\">${esc(part.title)}</h3></div>`:''}<div class=\"rail-scroll\">${cards}</div></div>`;\n  }\n  if(w==='productCard'){\n    const p=byId[part.id]; if(!p) return '';\n    return `<div class=\"blk\" ${delay}>${heroCard(d2,p)}</div>`;\n  }\n  if(w==='kit'){ inner=kitCard(d2,part,byId); return inner?`<div class=\"blk\" ${delay}>${inner}</div>`:''; }\n  if(w==='boxOffer'){ return `<div class=\"blk\" ${delay}>${boxCard(d2)}</div>`; }\n  if(w==='valueMath'){ inner=valueMathCard(d2,part); return inner?`<div class=\"blk\" ${delay}>${inner}</div>`:''; }\n  if(w==='scentProfile'){ inner=scentCard(d2,part); return inner?`<div class=\"blk\" ${delay}>${inner}</div>`:''; }\n  if(w==='compare'){ inner=compareCard(d2,part,byId); return inner?`<div class=\"blk\" ${delay}>${inner}</div>`:''; }\n  if(w==='whyChips'){\n    const chips=(part.chips||[]).map(c=>`<span class=\"why\">${esc(c)}</span>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk whyrow\" ${delay}>${chips}</div>`;\n  }\n  if(w==='heritage'){ return `<div class=\"blk\" ${delay}>${heritageCard(d2,part)}</div>`; }\n  if(w==='followUps'){\n    const chips=(part.chips||[]).map(c=>`<button class=\"fu\" data-followup=\"${esc(c)}\">${esc(c)} <i>→</i></button>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk furow\" ${delay}>${chips}</div>`;\n  }\n  return '';\n}\n\nfunction bagDrawer(d2){\n  const cart = d2.state.cart || {};\n  const items = Object.keys(cart).map(k=>cart[k]);\n  const total = items.reduce((a,i)=>a+(Number(i.product.price)||0)*i.qty,0);\n  const open = !!d2.state.bagOpen;\n  const rows = items.length ? items.map(i=>`<div class=\"bag-row\" data-key=\"${esc(i.product.productId)}\">\n      <div class=\"bag-thumb\"><div class=\"pcard-img\" style=\"background-image:url('${esc(i.product.imageUrl||'')}')\"></div></div>\n      <div class=\"bag-info\"><span class=\"bag-name\">${esc(i.product.name)}</span><span class=\"bag-unit\">${money(d2,i.product.price)}${i.qty>1?` · ${i.qty}×`:''}</span></div>\n      <div class=\"bag-qty\">\n        <button class=\"qbtn qdec\" data-dec=\"${esc(i.product.productId)}\">−</button>\n        <span>${i.qty}</span>\n        <button class=\"qbtn qinc\" data-inc=\"${esc(i.product.productId)}\">+</button>\n      </div>\n    </div>`).join('') : `<div class=\"bag-empty\">Sua sacola está vazia.<br/>Explore a vitrine ou peça uma sugestão.</div>`;\n  return `<div class=\"bag-scrim ${open?'on':''}\" data-bag-close></div>\n    <aside class=\"bag ${open?'on':''}\">\n      <div class=\"bag-top\"><h3>Sua sacola</h3><button class=\"bag-x\" data-bag-close>✕</button></div>\n      <div class=\"bag-list\">${rows}</div>\n      <div class=\"bag-foot\">\n        <div class=\"bag-sum\"><span>Subtotal</span><b>${money(d2,total)}</b></div>\n        <button class=\"bag-checkout\" ${items.length?'':'disabled'} data-checkout>Finalizar compra</button>\n        <span class=\"bag-fine\">frete e pagamento na próxima etapa</span>\n      </div>\n    </aside>`;\n}\n\nexport default {\n  css: `\n  :host{--green:#004030;--green-2:#025a44;--sage:#81ada2;--bg:#f6f3f8;--bg-2:#f9f9f9;--card:#ffffff;--ink:#1d1d1d;--ink-2:#4a4a4a;--gold:#e08e00;--yellow:#ffee9c;--yellow-2:#ffeaaf;--red:#ff0000;--line:rgba(29,29,29,.12)}\n  .wrap{height:100%;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box;color:var(--ink);background:var(--bg);\n    font-family:'Matria',Georgia,'Iowan Old Style','Palatino Linotype',serif;-webkit-font-smoothing:antialiased}\n  .wrap *{box-sizing:border-box}\n  .disp{font-family:'Granado','Matria',Georgia,serif}\n\n  /* HEADER */\n  .bar{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:16px;padding:12px 22px;\n    background:var(--green);color:#fff;box-shadow:0 6px 24px -14px rgba(0,64,48,.9)}\n  .bar-brand{font-family:'Granado','Matria',serif;font-size:26px;letter-spacing:.02em;line-height:1;color:#fff;cursor:pointer}\n  .bar-brand span{font-family:'Matria',serif;font-size:9px;letter-spacing:.34em;display:block;color:var(--sage);margin-top:2px}\n  .bar-search{flex:1;display:flex;align-items:center;gap:8px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);\n    border-radius:10px;padding:8px 12px;max-width:520px;margin:0 auto}\n  .bar-search input{flex:1;border:0;background:transparent;outline:0;color:#fff;font-family:inherit;font-size:14px}\n  .bar-search input::placeholder{color:rgba(255,255,255,.6)}\n  .bar-search .mag{color:var(--sage);font-size:15px}\n  .bag-btn{cursor:pointer;border:0;font-family:inherit;font-size:13.5px;font-weight:600;color:var(--green);\n    background:var(--yellow);border-radius:10px;padding:9px 15px;display:inline-flex;align-items:center;gap:7px;white-space:nowrap}\n  .bag-btn:hover{background:var(--yellow-2)}\n  .bag-btn b{background:var(--green);color:#fff;border-radius:999px;min-width:19px;height:19px;display:inline-grid;place-items:center;font-size:11px;padding:0 5px}\n\n  /* HERO */\n  .hero{position:relative;text-align:center;padding:52px 24px 40px;\n    background:radial-gradient(1100px 460px at 50% -30%, rgba(2,90,68,.14), transparent 60%),linear-gradient(180deg,#fff,var(--bg))}\n  .hero-kick{font-size:11px;letter-spacing:.4em;text-transform:uppercase;color:var(--gold);font-weight:700}\n  .hero-word{font-family:'Granado','Matria',serif;font-size:clamp(52px,10vw,110px);line-height:.9;color:var(--green);margin:8px 0 4px;letter-spacing:.01em}\n  .hero-sub{max-width:560px;margin:6px auto 0;font-size:16px;line-height:1.6;color:var(--ink-2)}\n  .ask{display:flex;align-items:center;gap:10px;width:min(660px,94vw);margin:22px auto 0;background:var(--card);\n    border:1px solid var(--line);border-radius:14px;padding:8px 8px 8px 16px;box-shadow:0 20px 48px -26px rgba(0,64,48,.5)}\n  .ask .mag{font-size:18px;color:var(--green-2);flex:0 0 auto}\n  .ask input{flex:1;border:0;background:transparent;outline:0;font-size:16px;color:var(--ink);font-family:inherit;padding:9px 2px}\n  .ask input::placeholder{color:#9aa39f}\n  .ask button{flex:0 0 auto;border:0;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;letter-spacing:.01em;\n    color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));padding:12px 22px;border-radius:10px}\n  .ask button:hover{filter:brightness(1.08)}\n  .presets{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;max-width:680px;margin:14px auto 0}\n  .preset{cursor:pointer;font-size:13.5px;color:var(--green);background:#fff;border:1px solid var(--line);border-radius:999px;padding:8px 15px}\n  .preset:hover{border-color:var(--gold);background:var(--yellow)}\n  .hero-note{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-2);margin-top:16px}\n  .hero-note .dot{width:7px;height:7px;border-radius:50%;background:var(--green-2)}\n\n  /* STOREFRONT */\n  .shop{max-width:1120px;margin:0 auto;padding:8px 22px 60px;display:flex;flex-direction:column;gap:38px}\n  .rail{display:flex;flex-direction:column;gap:2px}\n  .rail-head{display:flex;align-items:baseline;gap:12px;margin:6px 0 12px;flex-wrap:wrap}\n  .rail-title{font-family:'Matria',serif;font-weight:700;font-size:22px;color:var(--green);margin:0}\n  .rail-sub{font-size:13px;color:var(--ink-2)}\n  .rail-scroll{display:flex;gap:16px;overflow-x:auto;padding:4px 2px 16px;scroll-snap-type:x mandatory}\n  .rail-scroll::-webkit-scrollbar{height:8px}\n  .rail-scroll::-webkit-scrollbar-thumb{background:var(--sage);border-radius:8px}\n  .pcard{scroll-snap-align:start;flex:0 0 218px;width:218px;background:var(--card);border:1px solid var(--line);border-radius:14px;overflow:hidden;\n    box-shadow:0 16px 36px -28px rgba(0,64,48,.6);transition:transform .22s,box-shadow .22s;display:flex;flex-direction:column}\n  .pcard:hover{transform:translateY(-4px);box-shadow:0 24px 46px -26px rgba(0,64,48,.6)}\n  .pcard-imgwrap{position:relative;height:196px;background:linear-gradient(160deg,#eef4f1,#dfeae5)}\n  .pcard-mono{position:absolute;inset:0;display:grid;place-items:center;font-family:'Granado','Matria',serif;font-size:56px;color:rgba(2,90,68,.28)}\n  .pcard-mono.sm{font-size:20px}\n  .pcard-img{position:absolute;inset:0;background-size:cover;background-position:center}\n  .pcard-disc{position:absolute;top:10px;left:10px;background:var(--red);color:#fff;font-size:11px;font-weight:700;padding:4px 8px;border-radius:6px}\n  .pcard-body{padding:12px 13px 14px;display:flex;flex-direction:column;gap:6px;flex:1}\n  .pcard-line{font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--gold);font-weight:700}\n  .pcard-name{font-family:'Matria',serif;font-weight:400;font-size:15px;line-height:1.28;color:var(--ink);margin:0;min-height:38px}\n  .pcard-price{display:flex;align-items:baseline;gap:9px;margin-top:auto}\n  .pcard-now{font-size:18px;font-weight:700;color:var(--green)}\n  .pcard-was{font-size:13px;color:#9aa39f;text-decoration:line-through}\n  .add-bag{margin-top:9px;cursor:pointer;border:1px solid var(--green);background:#fff;color:var(--green);font-family:inherit;\n    font-size:13px;font-weight:600;border-radius:9px;padding:9px 10px;display:flex;align-items:center;justify-content:center;gap:6px;transition:.16s}\n  .add-bag:hover{background:var(--green);color:#fff}\n  .add-bag .add-ic{font-size:15px;line-height:1}\n\n  /* BOX CARD */\n  .boxcard{display:flex;gap:24px;flex-wrap:wrap;align-items:center;justify-content:space-between;\n    background:linear-gradient(135deg,var(--green),var(--green-2));color:#fff;border-radius:20px;padding:28px 30px;position:relative;overflow:hidden}\n  .boxcard:before{content:\"\";position:absolute;right:-40px;top:-40px;width:220px;height:220px;border-radius:50%;background:rgba(129,173,162,.22)}\n  .box-left{flex:1;min-width:260px;position:relative;z-index:1}\n  .box-kicker{font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--yellow)}\n  .box-title{font-family:'Granado','Matria',serif;font-size:34px;margin:6px 0 8px;color:#fff}\n  .box-desc{font-size:14.5px;line-height:1.55;color:rgba(255,255,255,.86);max-width:440px;margin:0 0 12px}\n  .box-bul{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:1fr 1fr;gap:6px 18px}\n  .box-bul li{font-size:13px;color:rgba(255,255,255,.92);padding-left:16px;position:relative}\n  .box-bul li:before{content:\"✦\";position:absolute;left:0;color:var(--yellow)}\n  .box-right{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;min-width:180px}\n  .box-off{background:var(--yellow);color:var(--green);font-weight:700;font-size:18px;border-radius:999px;padding:6px 16px}\n  .box-price{display:flex;flex-direction:column;line-height:1.1}\n  .box-price b{font-family:'Granado','Matria',serif;font-size:34px}\n  .box-price span{font-size:11px;color:rgba(255,255,255,.7);letter-spacing:.04em}\n  .box-cta{cursor:pointer;border:0;font-family:inherit;font-size:14px;font-weight:700;color:var(--green);background:var(--yellow);\n    padding:13px 26px;border-radius:11px}\n  .box-cta:hover{background:var(--yellow-2)}\n  .box-fine{font-size:11px;color:rgba(255,255,255,.6)}\n\n  /* RESULTS */\n  .results{max-width:960px;margin:0 auto;padding:22px 22px 56px;display:flex;flex-direction:column;gap:30px}\n  .results-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n  .back-shop{cursor:pointer;border:1px solid var(--line);background:#fff;color:var(--green);font-family:inherit;font-size:13px;font-weight:600;border-radius:999px;padding:8px 16px}\n  .back-shop:hover{border-color:var(--gold)}\n  .turn{display:flex;flex-direction:column;gap:16px}\n  .user-q{align-self:flex-end;max-width:80%;font-size:16px;color:var(--green);background:#fff;border:1px solid var(--line);\n    border-right:3px solid var(--gold);border-radius:12px;padding:11px 16px}\n  .answer{display:flex;flex-direction:column;gap:18px}\n  .blk{animation:rise .5s both cubic-bezier(.2,.7,.2,1)}\n  @keyframes rise{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\n  .say-attr{display:flex;align-items:center;gap:8px;font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--gold);font-weight:700;margin-bottom:2px}\n  .say-text{font-family:'Matria',serif;font-size:clamp(20px,3.2vw,27px);line-height:1.34;color:var(--green);margin:0;max-width:660px}\n  .whyrow{display:flex;flex-wrap:wrap;align-items:center;gap:9px}\n  .why-label,.fu-label{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--ink-2);margin-right:2px}\n  .why{font-size:12.5px;font-weight:600;color:var(--green);background:var(--yellow);border:1px solid rgba(224,142,0,.4);border-radius:999px;padding:6px 13px}\n\n  .kit{background:linear-gradient(180deg,var(--green),var(--green-2));color:#fff;border-radius:18px;padding:24px 24px 20px;\n    border:1px solid rgba(129,173,162,.4);box-shadow:0 30px 60px -34px rgba(0,64,48,.9);position:relative;overflow:hidden}\n  .kit-kicker{font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--yellow)}\n  .kit-title{font-family:'Granado','Matria',serif;font-size:26px;margin:6px 0 0;color:#fff}\n  .kit-story{font-size:15px;line-height:1.5;color:rgba(255,255,255,.85);margin:10px 0 14px;max-width:640px}\n  .kit-items{display:flex;flex-direction:column;border-top:1px solid rgba(129,173,162,.3)}\n  .kit-item{display:flex;align-items:center;gap:14px;padding:11px 2px;border-bottom:1px solid rgba(129,173,162,.2)}\n  .kit-thumb{position:relative;width:46px;height:46px;flex:0 0 auto;border-radius:9px;overflow:hidden;background:rgba(255,255,255,.1)}\n  .kit-meta{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}\n  .kit-name{font-size:14px;color:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .kit-line{font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--yellow)}\n  .kit-price{font-size:14px;font-weight:700;color:#fff;flex:0 0 auto}\n  .kit-foot{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:16px;flex-wrap:wrap}\n  .kit-total{display:flex;flex-direction:column;gap:1px}\n  .kit-total span{font-size:11px;color:var(--yellow)}\n  .kit-total b{font-family:'Granado','Matria',serif;font-size:26px;color:#fff}\n  .kit-cta{cursor:pointer;border:0;font-family:inherit;font-size:14px;font-weight:700;color:var(--green);background:var(--yellow);padding:13px 22px;border-radius:11px}\n  .kit-cta:hover{background:var(--yellow-2)}\n\n  .furow{display:flex;flex-wrap:wrap;align-items:center;gap:10px}\n  .fu{cursor:pointer;font-size:13.5px;color:var(--green);background:#fff;border:1px solid var(--line);border-radius:999px;padding:9px 16px;display:inline-flex;align-items:center;gap:7px}\n  .fu i{font-style:normal;color:var(--gold);transition:transform .2s}\n  .fu:hover{border-color:var(--gold)}\n  .fu:hover i{transform:translateX(3px)}\n\n  /* THINKING + skeleton */\n  .thinking{display:flex;flex-direction:column;gap:12px}\n  .th-steps{display:flex;flex-direction:column;gap:8px}\n  .th-step{display:flex;align-items:center;gap:11px;font-size:14px;color:var(--ink-2);opacity:0;animation:stepin .5s forwards}\n  .th-step:nth-child(1){animation-delay:.05s}.th-step:nth-child(2){animation-delay:.6s}.th-step:nth-child(3){animation-delay:1.2s}\n  .th-step:before{content:\"\";width:9px;height:9px;border-radius:50%;background:var(--green-2);animation:pulse 1.4s infinite}\n  @keyframes stepin{from{opacity:0;transform:translateX(-6px)}to{opacity:1}}\n  @keyframes pulse{0%{box-shadow:0 0 0 0 rgba(2,90,68,.5)}70%{box-shadow:0 0 0 9px rgba(2,90,68,0)}100%{box-shadow:0 0 0 0 rgba(2,90,68,0)}}\n  .th-bar{height:3px;border-radius:3px;background:rgba(2,90,68,.16);overflow:hidden;max-width:420px}\n  .th-bar i{display:block;height:100%;width:40%;background:linear-gradient(90deg,transparent,var(--green-2),transparent);animation:sweep 1.3s infinite}\n  @keyframes sweep{from{transform:translateX(-120%)}to{transform:translateX(320%)}}\n  .sk-rail{display:flex;gap:16px;overflow:hidden}\n  .sk-card{flex:0 0 218px;height:300px;border-radius:14px;background:linear-gradient(100deg,#eef2f0 30%,#e2ebe7 50%,#eef2f0 70%);background-size:200% 100%;animation:sweep2 1.3s infinite}\n  @keyframes sweep2{from{background-position:180% 0}to{background-position:-80% 0}}\n\n  .err{max-width:960px;margin:0 auto;color:var(--red);font-size:14px;padding:0 22px 10px}\n\n  /* BAG DRAWER */\n  .bag-scrim{position:fixed;inset:0;background:rgba(0,32,24,.42);opacity:0;pointer-events:none;transition:opacity .25s;z-index:40}\n  .bag-scrim.on{opacity:1;pointer-events:auto}\n  .bag{position:fixed;top:0;right:0;height:100%;width:min(400px,92vw);background:var(--bg-2);z-index:50;\n    display:flex;flex-direction:column;transform:translateX(102%);transition:transform .3s cubic-bezier(.3,.7,.2,1);box-shadow:-20px 0 50px -20px rgba(0,64,48,.5)}\n  .bag.on{transform:none}\n  .bag-top{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;background:var(--green);color:#fff}\n  .bag-top h3{font-family:'Granado','Matria',serif;font-size:22px;margin:0}\n  .bag-x{cursor:pointer;border:0;background:transparent;color:#fff;font-size:18px}\n  .bag-list{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:10px}\n  .bag-empty{color:var(--ink-2);text-align:center;padding:50px 20px;line-height:1.6;font-size:15px}\n  .bag-row{display:flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:10px}\n  .bag-thumb{width:52px;height:52px;border-radius:8px;overflow:hidden;position:relative;flex:0 0 auto;background:#eef4f1}\n  .bag-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n  .bag-name{font-size:13.5px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .bag-unit{font-size:12px;color:var(--ink-2)}\n  .bag-qty{display:flex;align-items:center;gap:8px}\n  .qbtn{cursor:pointer;width:26px;height:26px;border-radius:7px;border:1px solid var(--line);background:#fff;color:var(--green);font-size:15px;line-height:1}\n  .qbtn:hover{background:var(--yellow)}\n  .bag-foot{padding:16px 20px;border-top:1px solid var(--line);background:#fff;display:flex;flex-direction:column;gap:10px}\n  .bag-sum{display:flex;align-items:baseline;justify-content:space-between}\n  .bag-sum span{font-size:13px;color:var(--ink-2)}\n  .bag-sum b{font-family:'Granado','Matria',serif;font-size:26px;color:var(--green)}\n  .bag-checkout{cursor:pointer;border:0;font-family:inherit;font-size:15px;font-weight:700;color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));padding:14px;border-radius:11px}\n  .bag-checkout:disabled{opacity:.4;cursor:not-allowed}\n  .bag-fine{font-size:11px;color:var(--ink-2);text-align:center}\n\n  /* CHAT SHELL */\n  .bar{justify-content:space-between}\n  .conv{flex:1;overflow-y:auto;background:radial-gradient(900px 380px at 50% -12%, rgba(2,90,68,.08), transparent 60%),var(--bg)}\n  .conv-inner{max-width:760px;margin:0 auto;padding:26px 20px 34px;display:flex;flex-direction:column;gap:26px}\n  .turn{display:flex;flex-direction:column;gap:14px}\n  .answer{display:flex;flex-direction:column;gap:16px}\n  .blk{animation:rise .5s both cubic-bezier(.2,.7,.2,1)}\n  .blk.txt{display:flex}\n  .txt .bubble{max-width:660px;background:#fff;border:1px solid var(--line);border-radius:4px 16px 16px 16px;padding:14px 18px;font-size:16px;line-height:1.55;color:var(--ink);box-shadow:0 14px 30px -26px rgba(0,64,48,.6)}\n  .txt .bubble b{color:var(--green);font-weight:700}\n  .wl-hi{font-family:'Granado','Matria',serif;font-size:24px;color:var(--green);margin:0 0 6px}\n  .user-q{align-self:flex-end;max-width:82%;font-size:15.5px;color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));border-radius:16px 16px 4px 16px;padding:11px 16px;box-shadow:0 12px 26px -20px rgba(0,64,48,.9)}\n  .wg-label{display:block;font-size:10px;letter-spacing:.24em;text-transform:uppercase;color:var(--gold);font-weight:700;margin-bottom:8px}\n  .hcard{display:flex;gap:16px;background:var(--card);border:1px solid var(--line);border-radius:16px;overflow:hidden;padding:14px;box-shadow:0 18px 40px -28px rgba(0,64,48,.6);max-width:520px}\n  .hcard-imgwrap{position:relative;width:150px;height:180px;flex:0 0 auto;border-radius:12px;overflow:hidden;background:linear-gradient(160deg,#eef4f1,#dfeae5)}\n  .hcard-body{display:flex;flex-direction:column;gap:7px;flex:1;min-width:0;padding:4px 4px 2px}\n  .hcard-name{font-family:'Matria',serif;font-weight:400;font-size:19px;line-height:1.25;color:var(--ink);margin:0}\n  .cmp-grid{display:flex;gap:14px;overflow-x:auto;padding-bottom:6px}\n  .cmp-col{flex:1 1 0;min-width:180px;background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px;display:flex;flex-direction:column;gap:6px}\n  .cmp-imgwrap{position:relative;height:150px;border-radius:10px;overflow:hidden;background:linear-gradient(160deg,#eef4f1,#dfeae5)}\n  .cmp-name{font-family:'Matria',serif;font-weight:400;font-size:15px;line-height:1.25;margin:0;min-height:36px;color:var(--ink)}\n  .cmp-cat{font-size:11.5px;color:var(--ink-2)}\n  .vmath{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px 16px;max-width:440px}\n  .vmath-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}\n  .vmath-list li{display:flex;align-items:baseline;justify-content:space-between;gap:14px;padding:8px 0;border-bottom:1px dashed var(--line);font-size:14px;color:var(--ink-2)}\n  .vmath-list li:last-child{border-bottom:0;color:var(--green);font-weight:700}\n  .vmath-list li b{font-family:'Matria',serif;font-size:16px;color:var(--green)}\n  .scent{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px 16px;max-width:420px;display:flex;flex-direction:column;gap:9px}\n  .scent-row{display:flex;align-items:center;justify-content:space-between;gap:14px}\n  .scent-label{font-size:13.5px;color:var(--ink)}\n  .scent-meter{display:flex;gap:5px}\n  .scent-dot{width:11px;height:11px;border-radius:50%;background:rgba(2,90,68,.14)}\n  .scent-dot.on{background:var(--green-2)}\n  .heritage{border-left:3px solid var(--gold);background:linear-gradient(90deg,rgba(224,142,0,.06),transparent);border-radius:0 12px 12px 0;padding:12px 18px;max-width:640px}\n  .her-title{font-family:'Granado','Matria',serif;font-size:20px;color:var(--green);margin:2px 0 6px}\n  .her-text{font-size:15px;line-height:1.55;color:var(--ink-2);margin:0}\n  .thinking{display:flex;align-items:center;gap:12px;padding:6px 2px}\n  .th-glyph{width:34px;height:34px;border-radius:50%;background:var(--green);color:#fff;display:grid;place-items:center;font-size:19px;flex:0 0 auto}\n  .th-dots{display:flex;gap:5px}\n  .th-dots span{width:8px;height:8px;border-radius:50%;background:var(--green-2);animation:bounce 1.2s infinite}\n  .th-dots span:nth-child(2){animation-delay:.18s}.th-dots span:nth-child(3){animation-delay:.36s}\n  @keyframes bounce{0%,80%,100%{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-5px)}}\n  .th-cap{font-size:13px;color:var(--ink-2);font-style:italic}\n  .composer{flex:0 0 auto;background:rgba(246,243,248,.92);backdrop-filter:blur(8px);border-top:1px solid var(--line);padding:12px 20px 14px}\n  .composer .ask{margin:0 auto;width:100%;max-width:720px;box-shadow:0 14px 34px -26px rgba(0,64,48,.5)}\n  .chat-input{flex:1;border:0;background:transparent;outline:0;font-size:16px;color:var(--ink);font-family:inherit;padding:10px 4px}\n  .chat-input::placeholder{color:#9aa39f}\n  .chat-send{flex:0 0 auto;border:0;cursor:pointer;font-family:inherit;font-size:20px;font-weight:600;line-height:1;color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));width:46px;height:46px;border-radius:11px}\n  .chat-send:hover{filter:brightness(1.08)}\n  .composer-fine{text-align:center;font-size:11px;color:var(--ink-2);margin-top:7px;letter-spacing:.02em}\n\n  @media(max-width:560px){.bar-brand{font-size:22px}.bar-search{display:none}.box-bul{grid-template-columns:1fr}.conv-inner{padding:18px 14px 26px}.composer{padding:10px 12px 12px}.hcard{flex-direction:column}.hcard-imgwrap{width:100%;height:200px}}\n  `,\n  render(d2){\n    const cart = d2.state.cart || {};\n    const bagCount = Object.keys(cart).reduce((a,k)=>a+cart[k].qty,0);\n    const turns = d2.state.turns || [];\n    const loading = !!d2.state.loading;\n\n    const header = `<header class=\"bar\">\n      <div class=\"bar-brand disp\" data-home>Granado<span>Tradição desde 1870</span></div>\n      <button class=\"bag-btn\" data-bag-open>🛍 Sacola${bagCount?` <b>${bagCount}</b>`:''}</button>\n    </header>`;\n\n    const starters = ['um presente amadeirado até R$200','um perfume que lembra o Rio antigo','cuidado para pele ressecada','como funciona a Granado Box'];\n    const welcome = `<div class=\"turn\" data-key=\"welcome\">\n      <div class=\"answer\">\n        <div class=\"blk txt\"><div class=\"bubble\">\n          <p class=\"wl-hi\">Bem-vindo à Granado.</p>\n          Posso ajudar a encontrar um <b>presente</b>, um <b>perfume</b>, um <b>cuidado para a pele</b> ou os <b>cabelos</b> — ou falar sobre a nossa <b>Box</b>. Me conte o que você procura.\n        </div></div>\n        <div class=\"blk furow\">${starters.map(c=>`<button class=\"fu\" data-followup=\"${esc(c)}\">${esc(c)} <i>→</i></button>`).join('')}</div>\n      </div>\n    </div>`;\n\n    const feed = turns.map((t,ti)=>{\n      const byId={}; (t.products||[]).forEach(p=>{byId[p.productId]=p;});\n      const parts=(t.parts||[]).map((p,pi)=>renderPart(d2,p,byId,pi)).join('');\n      return `<div class=\"turn\" data-key=\"turn-${ti}\">\n        <div class=\"user-q\">${esc(t.q)}</div>\n        <div class=\"answer\">${parts}</div>\n      </div>`;\n    }).join('');\n\n    const think = loading ? `<div class=\"turn\" data-key=\"thinking\">\n      <div class=\"user-q\">${esc(d2.state.pendingQ||'')}</div>\n      <div class=\"answer\"><div class=\"thinking\">\n        <span class=\"th-glyph disp\">G</span>\n        <div class=\"th-dots\"><span></span><span></span><span></span></div>\n        <span class=\"th-cap\">consultando o acervo Granado…</span>\n      </div></div>\n    </div>` : '';\n\n    const err = d2.state.error ? `<div class=\"err\">${esc(d2.state.error)}</div>` : '';\n\n    const composer = `<div class=\"composer\">\n      <div class=\"ask\">\n        <input class=\"chat-input\" placeholder=\"Escreva para o assistente Granado…\" autocomplete=\"off\"/>\n        <button class=\"chat-send\" aria-label=\"Enviar\">→</button>\n      </div>\n      <div class=\"composer-fine\">assistente de compras · catálogo real Granado</div>\n    </div>`;\n\n    return `<div class=\"wrap\">${header}\n      <div class=\"conv\" data-conv>\n        <div class=\"conv-inner\">\n          ${turns.length?'':welcome}\n          ${feed}${think}${err}\n        </div>\n      </div>\n      ${composer}\n      ${bagDrawer(d2)}\n    </div>`;\n  },\n  mounted(d2){\n    if(!d2.state._fontsTried){\n      d2.state._fontsTried = true;\n      d2.rush('fontEmbed').invoke({}).then(res=>{\n        const f = (res && res.granado) ? res : ((res && res.data) ? res.data : res);\n        if(!f || !f.granado) return;\n        const mk = (arr)=>{ try{ return URL.createObjectURL(new Blob([new Uint8Array(arr)],{type:'font/woff2'})); }catch(e){ return null; } };\n        const defs = [['Granado',f.granado,'400'],['Matria',f.matriaR,'400'],['Matria',f.matriaB,'700']];\n        defs.forEach(([fam,arr,wt])=>{\n          if(!arr || !arr.length) return;\n          const url = mk(arr); if(!url) return;\n          try{\n            const ff = new FontFace(fam, 'url('+url+')', {weight:wt, style:'normal', display:'swap'});\n            ff.load().then(loaded=>{ (document.fonts||d2.root.ownerDocument.fonts).add(loaded); }).catch(()=>{});\n          }catch(e){}\n        });\n      }).catch(e=>{ d2.log('font error', e); });\n    }\n\n    const indexProducts = (arr)=>{\n      const idx = d2.state.catalogById || {};\n      (arr||[]).forEach(p=>{ if(p&&p.productId) idx[p.productId]=p; });\n      d2.state.catalogById = idx;\n    };\n\n    const addToBag = (product, qty)=>{\n      if(!product || !product.productId) return;\n      const cart = Object.assign({}, d2.state.cart||{});\n      const cur = cart[product.productId];\n      cart[product.productId] = { product, qty: (cur? cur.qty:0) + (qty||1) };\n      d2.state.cart = cart;\n      d2.state.bagOpen = true;\n    };\n    const changeQty = (id, delta)=>{\n      const cart = Object.assign({}, d2.state.cart||{});\n      const cur = cart[id]; if(!cur) return;\n      const q = cur.qty + delta;\n      if(q<=0){ delete cart[id]; } else { cart[id] = { product:cur.product, qty:q }; }\n      d2.state.cart = cart;\n    };\n\n    const scrollBottom = ()=>{ setTimeout(()=>{ const c=d2.$('[data-conv]'); if(c) c.scrollTop=c.scrollHeight; },60); };\n    const send = async (text)=>{\n      const q=(text||'').trim();\n      if(!q || d2.state.loading) return;\n      d2.state.error=null;\n      d2.state.pendingQ=q;\n      d2.state.loading=true;\n      scrollBottom();\n      const history=[];\n      (d2.state.turns||[]).forEach(t=>{\n        history.push({ role:'user', content:t.q });\n        const txt=(t.parts||[]).filter(p=>p&&p.type==='text').map(p=>p.md).join(' ');\n        history.push({ role:'assistant', content: txt || '[sugestões de produtos]' });\n      });\n      try{\n        const res = await d2.rush('farmaceutico').invoke({ message:q, history });\n        const payload = (res && res.parts) ? res : ((res && res.data) ? res.data : (res||{}));\n        indexProducts(payload.products);\n        const turns = d2.state.turns || [];\n        d2.state.turns = [...turns, { q, parts:payload.parts||[], products:payload.products||[] }];\n      }catch(e){\n        d2.state.error = 'Não consegui responder agora. Tente novamente em instantes.';\n        d2.log('chat error', e);\n      }finally{\n        d2.state.loading=false;\n        d2.state.pendingQ=null;\n        scrollBottom();\n      }\n    };\n    const fromInput = (sel)=>{ const el=d2.$(sel); if(el){ const v=el.value; el.value=''; send(v); } };\n\n    d2.on('.chat-send','click',()=>fromInput('.chat-input'));\n    d2.on('.chat-input','keydown',(e,el)=>{ if(e.key==='Enter'){ const v=el.value; el.value=''; send(v); } });\n    d2.on('.fu','click',(e,el)=>send(el.dataset.followup));\n\n    d2.on('.add-bag','click',(e,el)=>{ const p=(d2.state.catalogById||{})[el.dataset.add]; addToBag(p,1); });\n    d2.on('.kit-cta','click',(e,el)=>{\n      const ids=(el.dataset.addkit||'').split(',').filter(Boolean);\n      const idx=d2.state.catalogById||{};\n      ids.forEach(id=>{ if(idx[id]) addToBag(idx[id],1); });\n    });\n    d2.on('.box-cta','click',()=>{ addToBag({productId:'granado-box',name:'Granado Box — assinatura bimestral',price:150,imageUrl:'',brandLine:'Assinatura'},1); });\n    d2.on('.qdec','click',(e,el)=>changeQty(el.dataset.dec,-1));\n    d2.on('.qinc','click',(e,el)=>changeQty(el.dataset.inc,1));\n\n    d2.on('.bag-btn','click',()=>{ d2.state.bagOpen=true; });\n    d2.on('.bag-x','click',()=>{ d2.state.bagOpen=false; });\n    d2.on('.bag-scrim','click',()=>{ d2.state.bagOpen=false; });\n    d2.on('[data-home]','click',()=>{ d2.state.turns=[]; d2.state.error=null; });\n    d2.on('.bag-checkout','click',()=>{});\n  }\n};\n"}}}}}},"__d2PrevCode":{"code":"function esc(s){ return (s==null?'':String(s)).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/\"/g,'&quot;'); }\nfunction money(d2,v){ const n = Number(v)||0; return d2.fmt.currency(n,'BRL',{maximumFractionDigits: (n%1===0?0:2)}); }\nfunction disc(p){ return (Number(p.listPrice)>Number(p.price)) ? Math.round((1-Number(p.price)/Number(p.listPrice))*100) : 0; }\nfunction initial(name){ const m=(name||'').replace(/^(Eau de Toilette|Perfume|Sabonete|Hidratante|Vela|Difusor|Óleo|Shampoo|Kit)\\s*/i,'').trim(); return (m||name||'G').charAt(0).toUpperCase(); }\n\nfunction productCard(d2,p){\n  if(!p) return '';\n  const d = disc(p);\n  return `<article class=\"pcard\" data-key=\"${esc(p.productId)}\">\n    <div class=\"pcard-imgwrap\">\n      <span class=\"pcard-mono\">${esc(initial(p.name))}</span>\n      <div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div>\n      ${d>0?`<span class=\"pcard-disc\">-${d}%</span>`:''}\n    </div>\n    <div class=\"pcard-body\">\n      <span class=\"pcard-line\">${esc(p.brandLine)}</span>\n      <h4 class=\"pcard-name\">${esc(p.name)}</h4>\n      <div class=\"pcard-price\">\n        <span class=\"pcard-now\">${money(d2,p.price)}</span>\n        ${d>0?`<span class=\"pcard-was\">${money(d2,p.listPrice)}</span>`:''}\n      </div>\n      <button class=\"add-bag\" data-add=\"${esc(p.productId)}\"><span class=\"add-ic\">+</span> Adicionar à sacola</button>\n    </div>\n  </article>`;\n}\n\nfunction railHTML(d2,r,idx){\n  const cards=(r.products||[]).map(p=>productCard(d2,p)).filter(Boolean).join('');\n  if(!cards) return '';\n  return `<section class=\"rail\" data-key=\"rail-${idx}\">\n    <div class=\"rail-head\">\n      <h3 class=\"rail-title\">${esc(r.title)}</h3>\n      ${r.subtitle?`<span class=\"rail-sub\">${esc(r.subtitle)}</span>`:''}\n    </div>\n    <div class=\"rail-scroll\">${cards}</div>\n  </section>`;\n}\n\nfunction boxCard(d2){\n  const bullets=['5 a 6 produtos da linha Vintage','Curadoria com valor de ~R$250','+20% de desconto exclusivo','Frete grátis, renova sozinha'];\n  return `<section class=\"boxcard\" data-key=\"box\">\n    <div class=\"box-left\">\n      <span class=\"box-kicker\">Assinatura Granado</span>\n      <h3 class=\"box-title\">Granado Box</h3>\n      <p class=\"box-desc\">Uma caixa da nossa perfumaria e banho a cada 2 meses. Você economiza e ganha novidade sem pensar.</p>\n      <ul class=\"box-bul\">${bullets.map(b=>`<li>${esc(b)}</li>`).join('')}</ul>\n    </div>\n    <div class=\"box-right\">\n      <div class=\"box-off\">−20%</div>\n      <div class=\"box-price\"><b>${money(d2,150)}</b><span>a cada 2 meses</span></div>\n      <button class=\"box-cta\" data-subscribe>Assinar a Box</button>\n      <span class=\"box-fine\">cancele quando quiser</span>\n    </div>\n  </section>`;\n}\n\nfunction renderBlock(d2, b, byId, idx){\n  const delay = `style=\"animation-delay:${idx*120}ms\"`;\n  if(b.type==='say'){\n    if(!b.text) return '';\n    return `<div class=\"blk say\" ${delay}>\n      <div class=\"say-attr\"><span class=\"say-glyph\">✦</span> Seleção para você</div>\n      <p class=\"say-text\">${esc(b.text)}</p>\n    </div>`;\n  }\n  if(b.type==='whyChips'){\n    const chips=(b.chips||[]).map(c=>`<span class=\"why\">${esc(c)}</span>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk whyrow\" ${delay}><span class=\"why-label\">por que combina</span>${chips}</div>`;\n  }\n  if(b.type==='productRail'){\n    const items=(b.ids||[]).map(id=>byId[id]).filter(Boolean);\n    const cards=items.map(p=>productCard(d2,p)).join('');\n    if(!cards) return '';\n    return `<div class=\"blk rail\" ${delay}>\n      ${b.title?`<div class=\"rail-head\"><h3 class=\"rail-title\">${esc(b.title)}</h3></div>`:''}\n      <div class=\"rail-scroll\">${cards}</div>\n    </div>`;\n  }\n  if(b.type==='ritual'){\n    const items=(b.ids||[]).map(id=>byId[id]).filter(Boolean);\n    if(!items.length) return '';\n    const total=items.reduce((a,p)=>a+(Number(p.price)||0),0);\n    const listTotal=items.reduce((a,p)=>a+(Number(p.listPrice)||Number(p.price)||0),0);\n    const save=listTotal-total;\n    const ids=items.map(p=>p.productId).join(',');\n    const rows=items.map(p=>`<div class=\"kit-item\" data-key=\"${esc(p.productId)}\">\n        <div class=\"kit-thumb\"><span class=\"pcard-mono sm\">${esc(initial(p.name))}</span><div class=\"pcard-img\" style=\"background-image:url('${esc(p.imageUrl)}')\"></div></div>\n        <div class=\"kit-meta\"><span class=\"kit-name\">${esc(p.name)}</span><span class=\"kit-line\">${esc(p.brandLine)}</span></div>\n        <span class=\"kit-price\">${money(d2,p.price)}</span>\n      </div>`).join('');\n    return `<div class=\"blk kit\" ${delay}>\n      <div class=\"kit-head\"><span class=\"kit-kicker\">Kit sugerido</span><h3 class=\"kit-title\">${esc(b.title||'Seu kit Granado')}</h3></div>\n      ${b.story?`<p class=\"kit-story\">${esc(b.story)}</p>`:''}\n      <div class=\"kit-items\">${rows}</div>\n      <div class=\"kit-foot\">\n        <div class=\"kit-total\"><span>total do kit${save>0?` · você economiza ${money(d2,save)}`:''}</span><b>${money(d2,total)}</b></div>\n        <button class=\"kit-cta\" data-addkit=\"${esc(ids)}\">Adicionar kit à sacola</button>\n      </div>\n    </div>`;\n  }\n  if(b.type==='followUps'){\n    const chips=(b.chips||[]).map(c=>`<button class=\"fu\" data-followup=\"${esc(c)}\">${esc(c)} <i>→</i></button>`).join('');\n    if(!chips) return '';\n    return `<div class=\"blk furow\" ${delay}><span class=\"fu-label\">continue explorando</span>${chips}</div>`;\n  }\n  return '';\n}\n\nfunction bagDrawer(d2){\n  const cart = d2.state.cart || {};\n  const items = Object.keys(cart).map(k=>cart[k]);\n  const total = items.reduce((a,i)=>a+(Number(i.product.price)||0)*i.qty,0);\n  const open = !!d2.state.bagOpen;\n  const rows = items.length ? items.map(i=>`<div class=\"bag-row\" data-key=\"${esc(i.product.productId)}\">\n      <div class=\"bag-thumb\"><div class=\"pcard-img\" style=\"background-image:url('${esc(i.product.imageUrl||'')}')\"></div></div>\n      <div class=\"bag-info\"><span class=\"bag-name\">${esc(i.product.name)}</span><span class=\"bag-unit\">${money(d2,i.product.price)}${i.qty>1?` · ${i.qty}×`:''}</span></div>\n      <div class=\"bag-qty\">\n        <button class=\"qbtn qdec\" data-dec=\"${esc(i.product.productId)}\">−</button>\n        <span>${i.qty}</span>\n        <button class=\"qbtn qinc\" data-inc=\"${esc(i.product.productId)}\">+</button>\n      </div>\n    </div>`).join('') : `<div class=\"bag-empty\">Sua sacola está vazia.<br/>Explore a vitrine ou peça uma sugestão.</div>`;\n  return `<div class=\"bag-scrim ${open?'on':''}\" data-bag-close></div>\n    <aside class=\"bag ${open?'on':''}\">\n      <div class=\"bag-top\"><h3>Sua sacola</h3><button class=\"bag-x\" data-bag-close>✕</button></div>\n      <div class=\"bag-list\">${rows}</div>\n      <div class=\"bag-foot\">\n        <div class=\"bag-sum\"><span>Subtotal</span><b>${money(d2,total)}</b></div>\n        <button class=\"bag-checkout\" ${items.length?'':'disabled'} data-checkout>Finalizar compra</button>\n        <span class=\"bag-fine\">frete e pagamento na próxima etapa</span>\n      </div>\n    </aside>`;\n}\n\nexport default {\n  css: `\n  :host{--green:#004030;--green-2:#025a44;--sage:#81ada2;--bg:#f6f3f8;--bg-2:#f9f9f9;--card:#ffffff;--ink:#1d1d1d;--ink-2:#4a4a4a;--gold:#e08e00;--yellow:#ffee9c;--yellow-2:#ffeaaf;--red:#ff0000;--line:rgba(29,29,29,.12)}\n  .wrap{height:100%;overflow-y:auto;box-sizing:border-box;color:var(--ink);background:var(--bg);\n    font-family:'Matria',Georgia,'Iowan Old Style','Palatino Linotype',serif;-webkit-font-smoothing:antialiased}\n  .wrap *{box-sizing:border-box}\n  .disp{font-family:'Granado','Matria',Georgia,serif}\n\n  /* HEADER */\n  .bar{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:16px;padding:12px 22px;\n    background:var(--green);color:#fff;box-shadow:0 6px 24px -14px rgba(0,64,48,.9)}\n  .bar-brand{font-family:'Granado','Matria',serif;font-size:26px;letter-spacing:.02em;line-height:1;color:#fff;cursor:pointer}\n  .bar-brand span{font-family:'Matria',serif;font-size:9px;letter-spacing:.34em;display:block;color:var(--sage);margin-top:2px}\n  .bar-search{flex:1;display:flex;align-items:center;gap:8px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.22);\n    border-radius:10px;padding:8px 12px;max-width:520px;margin:0 auto}\n  .bar-search input{flex:1;border:0;background:transparent;outline:0;color:#fff;font-family:inherit;font-size:14px}\n  .bar-search input::placeholder{color:rgba(255,255,255,.6)}\n  .bar-search .mag{color:var(--sage);font-size:15px}\n  .bag-btn{cursor:pointer;border:0;font-family:inherit;font-size:13.5px;font-weight:600;color:var(--green);\n    background:var(--yellow);border-radius:10px;padding:9px 15px;display:inline-flex;align-items:center;gap:7px;white-space:nowrap}\n  .bag-btn:hover{background:var(--yellow-2)}\n  .bag-btn b{background:var(--green);color:#fff;border-radius:999px;min-width:19px;height:19px;display:inline-grid;place-items:center;font-size:11px;padding:0 5px}\n\n  /* HERO */\n  .hero{position:relative;text-align:center;padding:52px 24px 40px;\n    background:radial-gradient(1100px 460px at 50% -30%, rgba(2,90,68,.14), transparent 60%),linear-gradient(180deg,#fff,var(--bg))}\n  .hero-kick{font-size:11px;letter-spacing:.4em;text-transform:uppercase;color:var(--gold);font-weight:700}\n  .hero-word{font-family:'Granado','Matria',serif;font-size:clamp(52px,10vw,110px);line-height:.9;color:var(--green);margin:8px 0 4px;letter-spacing:.01em}\n  .hero-sub{max-width:560px;margin:6px auto 0;font-size:16px;line-height:1.6;color:var(--ink-2)}\n  .ask{display:flex;align-items:center;gap:10px;width:min(660px,94vw);margin:22px auto 0;background:var(--card);\n    border:1px solid var(--line);border-radius:14px;padding:8px 8px 8px 16px;box-shadow:0 20px 48px -26px rgba(0,64,48,.5)}\n  .ask .mag{font-size:18px;color:var(--green-2);flex:0 0 auto}\n  .ask input{flex:1;border:0;background:transparent;outline:0;font-size:16px;color:var(--ink);font-family:inherit;padding:9px 2px}\n  .ask input::placeholder{color:#9aa39f}\n  .ask button{flex:0 0 auto;border:0;cursor:pointer;font-family:inherit;font-size:14px;font-weight:600;letter-spacing:.01em;\n    color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));padding:12px 22px;border-radius:10px}\n  .ask button:hover{filter:brightness(1.08)}\n  .presets{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;max-width:680px;margin:14px auto 0}\n  .preset{cursor:pointer;font-size:13.5px;color:var(--green);background:#fff;border:1px solid var(--line);border-radius:999px;padding:8px 15px}\n  .preset:hover{border-color:var(--gold);background:var(--yellow)}\n  .hero-note{display:inline-flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-2);margin-top:16px}\n  .hero-note .dot{width:7px;height:7px;border-radius:50%;background:var(--green-2)}\n\n  /* STOREFRONT */\n  .shop{max-width:1120px;margin:0 auto;padding:8px 22px 60px;display:flex;flex-direction:column;gap:38px}\n  .rail{display:flex;flex-direction:column;gap:2px}\n  .rail-head{display:flex;align-items:baseline;gap:12px;margin:6px 0 12px;flex-wrap:wrap}\n  .rail-title{font-family:'Matria',serif;font-weight:700;font-size:22px;color:var(--green);margin:0}\n  .rail-sub{font-size:13px;color:var(--ink-2)}\n  .rail-scroll{display:flex;gap:16px;overflow-x:auto;padding:4px 2px 16px;scroll-snap-type:x mandatory}\n  .rail-scroll::-webkit-scrollbar{height:8px}\n  .rail-scroll::-webkit-scrollbar-thumb{background:var(--sage);border-radius:8px}\n  .pcard{scroll-snap-align:start;flex:0 0 218px;width:218px;background:var(--card);border:1px solid var(--line);border-radius:14px;overflow:hidden;\n    box-shadow:0 16px 36px -28px rgba(0,64,48,.6);transition:transform .22s,box-shadow .22s;display:flex;flex-direction:column}\n  .pcard:hover{transform:translateY(-4px);box-shadow:0 24px 46px -26px rgba(0,64,48,.6)}\n  .pcard-imgwrap{position:relative;height:196px;background:linear-gradient(160deg,#eef4f1,#dfeae5)}\n  .pcard-mono{position:absolute;inset:0;display:grid;place-items:center;font-family:'Granado','Matria',serif;font-size:56px;color:rgba(2,90,68,.28)}\n  .pcard-mono.sm{font-size:20px}\n  .pcard-img{position:absolute;inset:0;background-size:cover;background-position:center}\n  .pcard-disc{position:absolute;top:10px;left:10px;background:var(--red);color:#fff;font-size:11px;font-weight:700;padding:4px 8px;border-radius:6px}\n  .pcard-body{padding:12px 13px 14px;display:flex;flex-direction:column;gap:6px;flex:1}\n  .pcard-line{font-size:9.5px;letter-spacing:.18em;text-transform:uppercase;color:var(--gold);font-weight:700}\n  .pcard-name{font-family:'Matria',serif;font-weight:400;font-size:15px;line-height:1.28;color:var(--ink);margin:0;min-height:38px}\n  .pcard-price{display:flex;align-items:baseline;gap:9px;margin-top:auto}\n  .pcard-now{font-size:18px;font-weight:700;color:var(--green)}\n  .pcard-was{font-size:13px;color:#9aa39f;text-decoration:line-through}\n  .add-bag{margin-top:9px;cursor:pointer;border:1px solid var(--green);background:#fff;color:var(--green);font-family:inherit;\n    font-size:13px;font-weight:600;border-radius:9px;padding:9px 10px;display:flex;align-items:center;justify-content:center;gap:6px;transition:.16s}\n  .add-bag:hover{background:var(--green);color:#fff}\n  .add-bag .add-ic{font-size:15px;line-height:1}\n\n  /* BOX CARD */\n  .boxcard{display:flex;gap:24px;flex-wrap:wrap;align-items:center;justify-content:space-between;\n    background:linear-gradient(135deg,var(--green),var(--green-2));color:#fff;border-radius:20px;padding:28px 30px;position:relative;overflow:hidden}\n  .boxcard:before{content:\"\";position:absolute;right:-40px;top:-40px;width:220px;height:220px;border-radius:50%;background:rgba(129,173,162,.22)}\n  .box-left{flex:1;min-width:260px;position:relative;z-index:1}\n  .box-kicker{font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--yellow)}\n  .box-title{font-family:'Granado','Matria',serif;font-size:34px;margin:6px 0 8px;color:#fff}\n  .box-desc{font-size:14.5px;line-height:1.55;color:rgba(255,255,255,.86);max-width:440px;margin:0 0 12px}\n  .box-bul{list-style:none;padding:0;margin:0;display:grid;grid-template-columns:1fr 1fr;gap:6px 18px}\n  .box-bul li{font-size:13px;color:rgba(255,255,255,.92);padding-left:16px;position:relative}\n  .box-bul li:before{content:\"✦\";position:absolute;left:0;color:var(--yellow)}\n  .box-right{position:relative;z-index:1;display:flex;flex-direction:column;align-items:center;gap:8px;text-align:center;min-width:180px}\n  .box-off{background:var(--yellow);color:var(--green);font-weight:700;font-size:18px;border-radius:999px;padding:6px 16px}\n  .box-price{display:flex;flex-direction:column;line-height:1.1}\n  .box-price b{font-family:'Granado','Matria',serif;font-size:34px}\n  .box-price span{font-size:11px;color:rgba(255,255,255,.7);letter-spacing:.04em}\n  .box-cta{cursor:pointer;border:0;font-family:inherit;font-size:14px;font-weight:700;color:var(--green);background:var(--yellow);\n    padding:13px 26px;border-radius:11px}\n  .box-cta:hover{background:var(--yellow-2)}\n  .box-fine{font-size:11px;color:rgba(255,255,255,.6)}\n\n  /* RESULTS */\n  .results{max-width:960px;margin:0 auto;padding:22px 22px 56px;display:flex;flex-direction:column;gap:30px}\n  .results-top{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}\n  .back-shop{cursor:pointer;border:1px solid var(--line);background:#fff;color:var(--green);font-family:inherit;font-size:13px;font-weight:600;border-radius:999px;padding:8px 16px}\n  .back-shop:hover{border-color:var(--gold)}\n  .turn{display:flex;flex-direction:column;gap:16px}\n  .user-q{align-self:flex-end;max-width:80%;font-size:16px;color:var(--green);background:#fff;border:1px solid var(--line);\n    border-right:3px solid var(--gold);border-radius:12px;padding:11px 16px}\n  .answer{display:flex;flex-direction:column;gap:18px}\n  .blk{animation:rise .5s both cubic-bezier(.2,.7,.2,1)}\n  @keyframes rise{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\n  .say-attr{display:flex;align-items:center;gap:8px;font-size:10.5px;letter-spacing:.24em;text-transform:uppercase;color:var(--gold);font-weight:700;margin-bottom:2px}\n  .say-text{font-family:'Matria',serif;font-size:clamp(20px,3.2vw,27px);line-height:1.34;color:var(--green);margin:0;max-width:660px}\n  .whyrow{display:flex;flex-wrap:wrap;align-items:center;gap:9px}\n  .why-label,.fu-label{font-size:10px;letter-spacing:.22em;text-transform:uppercase;color:var(--ink-2);margin-right:2px}\n  .why{font-size:12.5px;font-weight:600;color:var(--green);background:var(--yellow);border:1px solid rgba(224,142,0,.4);border-radius:999px;padding:6px 13px}\n\n  .kit{background:linear-gradient(180deg,var(--green),var(--green-2));color:#fff;border-radius:18px;padding:24px 24px 20px;\n    border:1px solid rgba(129,173,162,.4);box-shadow:0 30px 60px -34px rgba(0,64,48,.9);position:relative;overflow:hidden}\n  .kit-kicker{font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:var(--yellow)}\n  .kit-title{font-family:'Granado','Matria',serif;font-size:26px;margin:6px 0 0;color:#fff}\n  .kit-story{font-size:15px;line-height:1.5;color:rgba(255,255,255,.85);margin:10px 0 14px;max-width:640px}\n  .kit-items{display:flex;flex-direction:column;border-top:1px solid rgba(129,173,162,.3)}\n  .kit-item{display:flex;align-items:center;gap:14px;padding:11px 2px;border-bottom:1px solid rgba(129,173,162,.2)}\n  .kit-thumb{position:relative;width:46px;height:46px;flex:0 0 auto;border-radius:9px;overflow:hidden;background:rgba(255,255,255,.1)}\n  .kit-meta{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}\n  .kit-name{font-size:14px;color:#fff;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .kit-line{font-size:9.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--yellow)}\n  .kit-price{font-size:14px;font-weight:700;color:#fff;flex:0 0 auto}\n  .kit-foot{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:16px;flex-wrap:wrap}\n  .kit-total{display:flex;flex-direction:column;gap:1px}\n  .kit-total span{font-size:11px;color:var(--yellow)}\n  .kit-total b{font-family:'Granado','Matria',serif;font-size:26px;color:#fff}\n  .kit-cta{cursor:pointer;border:0;font-family:inherit;font-size:14px;font-weight:700;color:var(--green);background:var(--yellow);padding:13px 22px;border-radius:11px}\n  .kit-cta:hover{background:var(--yellow-2)}\n\n  .furow{display:flex;flex-wrap:wrap;align-items:center;gap:10px}\n  .fu{cursor:pointer;font-size:13.5px;color:var(--green);background:#fff;border:1px solid var(--line);border-radius:999px;padding:9px 16px;display:inline-flex;align-items:center;gap:7px}\n  .fu i{font-style:normal;color:var(--gold);transition:transform .2s}\n  .fu:hover{border-color:var(--gold)}\n  .fu:hover i{transform:translateX(3px)}\n\n  /* THINKING + skeleton */\n  .thinking{display:flex;flex-direction:column;gap:12px}\n  .th-steps{display:flex;flex-direction:column;gap:8px}\n  .th-step{display:flex;align-items:center;gap:11px;font-size:14px;color:var(--ink-2);opacity:0;animation:stepin .5s forwards}\n  .th-step:nth-child(1){animation-delay:.05s}.th-step:nth-child(2){animation-delay:.6s}.th-step:nth-child(3){animation-delay:1.2s}\n  .th-step:before{content:\"\";width:9px;height:9px;border-radius:50%;background:var(--green-2);animation:pulse 1.4s infinite}\n  @keyframes stepin{from{opacity:0;transform:translateX(-6px)}to{opacity:1}}\n  @keyframes pulse{0%{box-shadow:0 0 0 0 rgba(2,90,68,.5)}70%{box-shadow:0 0 0 9px rgba(2,90,68,0)}100%{box-shadow:0 0 0 0 rgba(2,90,68,0)}}\n  .th-bar{height:3px;border-radius:3px;background:rgba(2,90,68,.16);overflow:hidden;max-width:420px}\n  .th-bar i{display:block;height:100%;width:40%;background:linear-gradient(90deg,transparent,var(--green-2),transparent);animation:sweep 1.3s infinite}\n  @keyframes sweep{from{transform:translateX(-120%)}to{transform:translateX(320%)}}\n  .sk-rail{display:flex;gap:16px;overflow:hidden}\n  .sk-card{flex:0 0 218px;height:300px;border-radius:14px;background:linear-gradient(100deg,#eef2f0 30%,#e2ebe7 50%,#eef2f0 70%);background-size:200% 100%;animation:sweep2 1.3s infinite}\n  @keyframes sweep2{from{background-position:180% 0}to{background-position:-80% 0}}\n\n  .err{max-width:960px;margin:0 auto;color:var(--red);font-size:14px;padding:0 22px 10px}\n\n  /* BAG DRAWER */\n  .bag-scrim{position:fixed;inset:0;background:rgba(0,32,24,.42);opacity:0;pointer-events:none;transition:opacity .25s;z-index:40}\n  .bag-scrim.on{opacity:1;pointer-events:auto}\n  .bag{position:fixed;top:0;right:0;height:100%;width:min(400px,92vw);background:var(--bg-2);z-index:50;\n    display:flex;flex-direction:column;transform:translateX(102%);transition:transform .3s cubic-bezier(.3,.7,.2,1);box-shadow:-20px 0 50px -20px rgba(0,64,48,.5)}\n  .bag.on{transform:none}\n  .bag-top{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;background:var(--green);color:#fff}\n  .bag-top h3{font-family:'Granado','Matria',serif;font-size:22px;margin:0}\n  .bag-x{cursor:pointer;border:0;background:transparent;color:#fff;font-size:18px}\n  .bag-list{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:10px}\n  .bag-empty{color:var(--ink-2);text-align:center;padding:50px 20px;line-height:1.6;font-size:15px}\n  .bag-row{display:flex;align-items:center;gap:12px;background:#fff;border:1px solid var(--line);border-radius:12px;padding:10px}\n  .bag-thumb{width:52px;height:52px;border-radius:8px;overflow:hidden;position:relative;flex:0 0 auto;background:#eef4f1}\n  .bag-info{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}\n  .bag-name{font-size:13.5px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n  .bag-unit{font-size:12px;color:var(--ink-2)}\n  .bag-qty{display:flex;align-items:center;gap:8px}\n  .qbtn{cursor:pointer;width:26px;height:26px;border-radius:7px;border:1px solid var(--line);background:#fff;color:var(--green);font-size:15px;line-height:1}\n  .qbtn:hover{background:var(--yellow)}\n  .bag-foot{padding:16px 20px;border-top:1px solid var(--line);background:#fff;display:flex;flex-direction:column;gap:10px}\n  .bag-sum{display:flex;align-items:baseline;justify-content:space-between}\n  .bag-sum span{font-size:13px;color:var(--ink-2)}\n  .bag-sum b{font-family:'Granado','Matria',serif;font-size:26px;color:var(--green)}\n  .bag-checkout{cursor:pointer;border:0;font-family:inherit;font-size:15px;font-weight:700;color:#fff;background:linear-gradient(180deg,var(--green-2),var(--green));padding:14px;border-radius:11px}\n  .bag-checkout:disabled{opacity:.4;cursor:not-allowed}\n  .bag-fine{font-size:11px;color:var(--ink-2);text-align:center}\n\n  @media(max-width:560px){.bar-brand{font-size:22px}.bar-search{display:none}.box-bul{grid-template-columns:1fr}}\n  `,\n  render(d2){\n    const cart = d2.state.cart || {};\n    const bagCount = Object.keys(cart).reduce((a,k)=>a+cart[k].qty,0);\n    const turns = d2.state.turns || [];\n    const loading = !!d2.state.loading;\n    const showResults = turns.length>0 || loading;\n    const rails = d2.state.rails || [];\n    const storeLoading = !!d2.state.storeLoading;\n\n    const header = `<header class=\"bar\">\n      <div class=\"bar-brand disp\" data-home>Granado<span>Tradição desde 1870</span></div>\n      <div class=\"bar-search\"><span class=\"mag\">⚲</span><input class=\"top-input\" placeholder=\"Buscar produtos, presentes, kits…\"/></div>\n      <button class=\"bag-btn\" data-bag-open>🛒 Sacola${bagCount?` <b>${bagCount}</b>`:''}</button>\n    </header>`;\n\n    if(showResults){\n      const feed = turns.map((t,ti)=>{\n        const byId={}; (t.products||[]).forEach(p=>{byId[p.productId]=p;});\n        const blocks=(t.blocks||[]).map((b,bi)=>renderBlock(d2,b,byId,bi)).join('');\n        return `<div class=\"turn\" data-key=\"turn-${ti}\">\n          <div class=\"user-q\">${esc(t.q)}</div>\n          <div class=\"answer\">${blocks}</div>\n        </div>`;\n      }).join('');\n      const think = loading ? `<div class=\"turn\" data-key=\"thinking\">\n        <div class=\"user-q\">${esc(d2.state.pendingQ||'')}</div>\n        <div class=\"thinking\">\n          <div class=\"say-attr\"><span class=\"say-glyph\">✦</span> Montando sua seleção</div>\n          <div class=\"th-steps\">\n            <div class=\"th-step\">lendo o catálogo Granado</div>\n            <div class=\"th-step\">cruzando linha, categoria e faixa de preço</div>\n            <div class=\"th-step\">separando os produtos que combinam</div>\n          </div>\n          <div class=\"th-bar\"><i></i></div>\n        </div>\n      </div>` : '';\n      const err = d2.state.error ? `<div class=\"err\">${esc(d2.state.error)}</div>` : '';\n      return `<div class=\"wrap\">${header}\n        <div class=\"results\">\n          <div class=\"results-top\">\n            <button class=\"back-shop\" data-home>← Voltar à vitrine</button>\n          </div>\n          ${feed}${think}${err}\n        </div>\n        ${bagDrawer(d2)}\n      </div>`;\n    }\n\n    const presets = ['presente pro meu pai até R$200','kit de banho relaxante','perfumaria vintage','cuidados suaves pro bebê'];\n    const hero = `<section class=\"hero\">\n      <div class=\"hero-kick\">Tradição e Qualidade desde 1870</div>\n      <h1 class=\"hero-word disp\">Granado</h1>\n      <p class=\"hero-sub\">Sabonetes, perfumaria e cuidados que atravessam gerações. Encontre um presente, monte um kit ou descubra o que combina com você.</p>\n      <div class=\"ask hero-ask\">\n        <span class=\"mag\">⚲</span>\n        <input class=\"hero-input\" placeholder=\"Ex.: um presente amadeirado até R$200…\"/>\n        <button class=\"hero-send\">Buscar</button>\n      </div>\n      <div class=\"presets\">${presets.map(p=>`<button class=\"preset\" data-preset=\"${esc(p)}\">${esc(p)}</button>`).join('')}</div>\n      <div class=\"hero-note\"><span class=\"dot\"></span> catálogo real · 342 produtos · entrega para todo o Brasil</div>\n    </section>`;\n\n    let shopInner;\n    if(storeLoading && !rails.length){\n      shopInner = `<section class=\"rail\"><div class=\"rail-head\"><h3 class=\"rail-title\">Carregando a vitrine…</h3></div>\n        <div class=\"sk-rail\">${'<div class=\"sk-card\"></div>'.repeat(5)}</div></section>`;\n    }else{\n      const railsHTML = rails.map((r,i)=>railHTML(d2,r,i)).join('');\n      const firstBreak = railsHTML.indexOf('</section>');\n      let composed;\n      if(firstBreak>=0){\n        const cut = firstBreak + '</section>'.length;\n        composed = railsHTML.slice(0,cut) + boxCard(d2) + railsHTML.slice(cut);\n      }else{\n        composed = boxCard(d2) + railsHTML;\n      }\n      shopInner = composed;\n    }\n\n    return `<div class=\"wrap\">${header}${hero}\n      <div class=\"shop\">${shopInner}</div>\n      ${bagDrawer(d2)}\n    </div>`;\n  },\n  mounted(d2){\n    if(!d2.state._fontsTried){\n      d2.state._fontsTried = true;\n      d2.rush('fontEmbed').invoke({}).then(res=>{\n        const f = (res && res.granado) ? res : ((res && res.data) ? res.data : res);\n        if(!f || !f.granado) return;\n        const mk = (arr)=>{ try{ return URL.createObjectURL(new Blob([new Uint8Array(arr)],{type:'font/woff2'})); }catch(e){ return null; } };\n        const defs = [['Granado',f.granado,'400'],['Matria',f.matriaR,'400'],['Matria',f.matriaB,'700']];\n        defs.forEach(([fam,arr,wt])=>{\n          if(!arr || !arr.length) return;\n          const url = mk(arr); if(!url) return;\n          try{\n            const ff = new FontFace(fam, 'url('+url+')', {weight:wt, style:'normal', display:'swap'});\n            ff.load().then(loaded=>{ (document.fonts||d2.root.ownerDocument.fonts).add(loaded); }).catch(()=>{});\n          }catch(e){}\n        });\n      }).catch(e=>{ d2.log('font error', e); });\n    }\n\n    if(!d2.state._storeTried){\n      d2.state._storeTried = true;\n      d2.state.storeLoading = true;\n      d2.rush('storefront').invoke({}).then(res=>{\n        const s = (res && res.rails) ? res : ((res && res.data) ? res.data : res);\n        const rails = (s && s.rails) || [];\n        const idx = d2.state.catalogById || {};\n        rails.forEach(r=>(r.products||[]).forEach(p=>{ if(p&&p.productId) idx[p.productId]=p; }));\n        d2.state.catalogById = idx;\n        d2.state.rails = rails;\n        d2.state.storeLoading = false;\n      }).catch(e=>{ d2.state.storeLoading=false; d2.log('store error', e); });\n    }\n\n    const indexProducts = (arr)=>{\n      const idx = d2.state.catalogById || {};\n      (arr||[]).forEach(p=>{ if(p&&p.productId) idx[p.productId]=p; });\n      d2.state.catalogById = idx;\n    };\n\n    const addToBag = (product, qty)=>{\n      if(!product || !product.productId) return;\n      const cart = Object.assign({}, d2.state.cart||{});\n      const cur = cart[product.productId];\n      cart[product.productId] = { product, qty: (cur? cur.qty:0) + (qty||1) };\n      d2.state.cart = cart;\n      d2.state.bagOpen = true;\n    };\n    const changeQty = (id, delta)=>{\n      const cart = Object.assign({}, d2.state.cart||{});\n      const cur = cart[id]; if(!cur) return;\n      const q = cur.qty + delta;\n      if(q<=0){ delete cart[id]; } else { cart[id] = { product:cur.product, qty:q }; }\n      d2.state.cart = cart;\n    };\n\n    const send = async (text)=>{\n      const q=(text||'').trim();\n      if(!q || d2.state.loading) return;\n      d2.state.error=null;\n      d2.state.pendingQ=q;\n      d2.state.loading=true;\n      try{\n        const res = await d2.rush('farmaceutico').invoke({ message:q });\n        const payload = (res && res.blocks) ? res : ((res && res.data) ? res.data : (res||{}));\n        indexProducts(payload.products);\n        const turns = d2.state.turns || [];\n        d2.state.turns = [...turns, { q, blocks:payload.blocks||[], products:payload.products||[] }];\n      }catch(e){\n        d2.state.error = 'Não consegui buscar agora. Tente novamente em instantes.';\n        d2.log('search error', e);\n      }finally{\n        d2.state.loading=false;\n        d2.state.pendingQ=null;\n      }\n    };\n    const fromInput = (sel)=>{ const el=d2.$(sel); if(el){ const v=el.value; el.value=''; send(v); } };\n\n    d2.on('.hero-send','click',()=>fromInput('.hero-input'));\n    d2.on('.hero-input','keydown',(e,el)=>{ if(e.key==='Enter'){ const v=el.value; el.value=''; send(v); } });\n    d2.on('.top-input','keydown',(e,el)=>{ if(e.key==='Enter'){ const v=el.value; el.value=''; send(v); } });\n    d2.on('.preset','click',(e,el)=>send(el.dataset.preset));\n    d2.on('.fu','click',(e,el)=>send(el.dataset.followup));\n\n    d2.on('.add-bag','click',(e,el)=>{ const p=(d2.state.catalogById||{})[el.dataset.add]; addToBag(p,1); });\n    d2.on('.kit-cta','click',(e,el)=>{\n      const ids=(el.dataset.addkit||'').split(',').filter(Boolean);\n      const idx=d2.state.catalogById||{};\n      ids.forEach(id=>{ if(idx[id]) addToBag(idx[id],1); });\n    });\n    d2.on('.box-cta','click',()=>{ addToBag({productId:'granado-box',name:'Granado Box — assinatura bimestral',price:150,imageUrl:'',brandLine:'Assinatura'},1); });\n    d2.on('.qdec','click',(e,el)=>changeQty(el.dataset.dec,-1));\n    d2.on('.qinc','click',(e,el)=>changeQty(el.dataset.inc,1));\n\n    d2.on('.bag-btn','click',()=>{ d2.state.bagOpen=true; });\n    d2.on('.bag-x','click',()=>{ d2.state.bagOpen=false; });\n    d2.on('.bag-scrim','click',()=>{ d2.state.bagOpen=false; });\n    d2.on('[data-home]','click',()=>{ d2.state.turns=[]; d2.state.error=null; });\n    d2.on('.bag-checkout','click',()=>{});\n  }\n};\n","at":"2026-07-24T13:36:57.560Z"}}}]}},{"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":{"system":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$metadata.system"}}}}},"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}}},"reference":"Data2BuilderAuthentication","updatedAt":"2025-10-28T02:48:49.233Z"},{"_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"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_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":[]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a63008fd29000874041a279","component":"data2-core-primitives@Artboard","system":"6a62e4640613f70fa449ff5d","displayName":"O Farmacêutico","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"O Farmacêutico"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":960}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"Ee5kgqykRxemTbDI_PcP3"},{"_id":"be92085cc1b7caaac59f12d5","parent":"6a63008fd29000874041a279","component":"granado-app@kFarmaceutico","system":"6a62e4640613f70fa449ff5d","displayName":"O Farmacêutico App","params":{"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true,"growH":true,"growV":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":960}}}},"reference":"QISabKD4BXOC5dWfFlBu2"}]}},{"_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":"6a6300bdfef6ab4d40695366","displayName":"O Farmacêutico","reference":"CF3rR4wKUP3JeVbgi6pI7","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"O Farmacêutico"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"O Farmacêutico"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"app"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Artboard","reference":"Ee5kgqykRxemTbDI_PcP3"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6a62e4640613f70fa449ff5d","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}