{"context":{"domain":"lucca-playground"},"layers":{"ApplicationLayer":{"reference":"ApplicationLayer","availableInstances":[{"reference":"ComponentsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"SystemsDataSet","params":{"filter":{"domain":"data2"},"pagination":{"size":1},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSource"}}}},{"reference":"ExternalComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"SystemsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"5e3b796d6228227ca637d0f4","name":"data2","domain":"data2","organization":"62292184611f480b3191c37c","visibility":"public","updatedAt":"2026-07-27T14:19:36.810Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"settings.defaultAccessPolicy"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2026-08-07T21:51:24.037Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6172b957976026c073ab9058","name":"Lucca`s Playground","domain":"lucca-playground","visibility":"public","settings":{"defaultAccessPolicy":"private"},"updatedAt":"2026-08-14T19:26:29.927Z"}]}},{"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":"6a73ee571204b3d36b63499e","component":"data2-core-types@Component","system":"6172b957976026c073ab9058","params":{"extends":"data2-core-primitives@Block","component":"pixeldoomEditor","package":"lucca-playground","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const CELL = 32\nconst TOOLS = [\n  { id: '0', label: 'Vazio', sw: '#2f3542' },\n  { id: '1', label: 'Parede 1', sw: '#b33939' },\n  { id: '2', label: 'Parede 2', sw: '#4a69bd' },\n  { id: '3', label: 'Parede 3', sw: '#38ada9' },\n  { id: '4', label: 'Parede 4', sw: '#e58e26' },\n  { id: '5', label: 'Saída', sw: '#f6e58d' },\n  { id: 'player', label: 'Início Jogador', sw: '#00e6e6' },\n  { id: 'enemy', label: 'Inimigo', sw: '#e84118' },\n]\nconst SWATCH = { '0': '#2f3542', '1': '#b33939', '2': '#4a69bd', '3': '#38ada9', '4': '#e58e26', '5': '#f6e58d' }\n\nfunction esc(v) {\n  return String(v == null ? '' : v).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\n}\nfunction blankGrid(w, h) { return new Array(w * h).fill(0) }\nfunction resizeGrid(oldGrid, oldW, oldH, newW, newH) {\n  const g = new Array(newW * newH).fill(0)\n  const mh = Math.min(oldH, newH), mw = Math.min(oldW, newW)\n  for (let y = 0; y < mh; y++) {\n    for (let x = 0; x < mw; x++) g[y * newW + x] = oldGrid[y * oldW + x] || 0\n  }\n  return g\n}\nfunction drawGrid(cv, s, draftGrid) {\n  if (!cv || !s || !s.width) return\n  const w = s.width, h = s.height\n  const grid = draftGrid || s.grid || []\n  const dpr = window.devicePixelRatio || 1\n  const cssW = w * CELL, cssH = h * CELL\n  const needW = Math.round(cssW * dpr), needH = Math.round(cssH * dpr)\n  if (cv.width !== needW || cv.height !== needH) { cv.width = needW; cv.height = needH }\n  const ctx = cv.getContext('2d')\n  ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n  for (let y = 0; y < h; y++) {\n    for (let x = 0; x < w; x++) {\n      const v = grid[y * w + x] || 0\n      ctx.fillStyle = SWATCH[String(v)] || '#2f3542'\n      ctx.fillRect(x * CELL, y * CELL, CELL, CELL)\n      ctx.strokeStyle = 'rgba(0,0,0,0.25)'\n      ctx.strokeRect(x * CELL + 0.5, y * CELL + 0.5, CELL - 1, CELL - 1)\n    }\n  }\n  const things = s.things || []\n  ctx.font = `${Math.floor(CELL * 0.7)}px sans-serif`\n  ctx.textAlign = 'center'\n  ctx.textBaseline = 'middle'\n  things.forEach((t) => { if (t.type === 'enemy') ctx.fillText('👹', t.x * CELL, t.y * CELL) })\n  const ps = s.playerStart || { x: 1.5, y: 1.5, angle: 0 }\n  ctx.save()\n  ctx.translate(ps.x * CELL, ps.y * CELL)\n  ctx.rotate(ps.angle || 0)\n  ctx.fillStyle = '#00e6e6'\n  ctx.beginPath(); ctx.moveTo(12, 0); ctx.lineTo(-8, 8); ctx.lineTo(-8, -8); ctx.closePath(); ctx.fill()\n  ctx.restore()\n}\n\nexport default {\n  css: `\n    .app{position:absolute;inset:0;display:flex;font-family:'Courier New',monospace;background:#0d0f14;color:#e8e8ee;overflow:hidden}\n    .sidebar{width:300px;flex:0 0 300px;background:#161822;border-right:1px solid #2a2e3d;padding:16px;box-sizing:border-box;overflow-y:auto;display:flex;flex-direction:column;gap:12px}\n    .sidebar h1{font-size:15px;letter-spacing:2px;margin:0 0 4px;color:#f6e58d;text-transform:uppercase}\n    .field{display:flex;flex-direction:column;gap:4px;font-size:11px;color:#9aa0b4}\n    .field input{background:#0d0f14;border:1px solid #2a2e3d;color:#e8e8ee;padding:6px 8px;border-radius:4px;font-family:inherit;box-sizing:border-box;width:100%}\n    .row2{display:flex;gap:8px}\n    .row2 .field{flex:1}\n    .toolgrid{display:grid;grid-template-columns:1fr 1fr;gap:6px}\n    .toolbtn{display:flex;align-items:center;gap:6px;background:#1d2030;border:1px solid #2a2e3d;color:#cfd2e0;padding:6px 8px;border-radius:4px;cursor:pointer;font-size:11px;font-family:inherit}\n    .toolbtn .sw{width:14px;height:14px;border-radius:3px;background:var(--c);flex:0 0 14px;display:inline-block}\n    .toolbtn.active{border-color:#f6e58d;background:#2a2410;color:#f6e58d}\n    .actions{display:flex;flex-direction:column;gap:6px;margin-top:4px}\n    .btn{background:#2a2e3d;border:1px solid #3a3f52;color:#e8e8ee;padding:8px 10px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:12px}\n    .btn.primary{background:#f6e58d;color:#161822;font-weight:700;border-color:#f6e58d}\n    .msg{font-size:11px;color:#78e08f;min-height:14px}\n    .levelList{display:flex;flex-direction:column;gap:4px;font-size:11px;border-top:1px solid #2a2e3d;padding-top:10px}\n    .levelList label{color:#9aa0b4;text-transform:uppercase;font-size:10px;letter-spacing:1px}\n    .levelItem{background:#1d2030;border:1px solid #2a2e3d;border-radius:4px;padding:6px 8px;cursor:pointer}\n    .levelItem.active{border-color:#00e6e6;color:#00e6e6}\n    .canvasArea{flex:1;overflow:auto;padding:24px;box-sizing:border-box}\n    .canvasWrap{position:relative;box-shadow:0 0 0 2px #2a2e3d}\n    .grid{display:block;width:100%;height:100%;cursor:crosshair}\n  `,\n  render(d2) {\n    const s = d2.state\n    const width = s.width || 12\n    const height = s.height || 12\n    const tool = s.tool || '1'\n    const name = s.name != null ? s.name : 'Novo Nível'\n    const msg = s.msg || ''\n    const levelId = s.levelId || null\n    const ds = d2.data('levels')\n    const rows = ds && !ds.loading ? ds.records() : []\n    const listHtml = rows.length\n      ? rows.map((r) => `<div class=\"levelItem ${r._id === levelId ? 'active' : ''}\" data-key=\"${r._id}\" data-id=\"${r._id}\">${esc(r.name)} (${r.width}x${r.height})</div>`).join('')\n      : `<div style=\"color:#666\">Nenhum nível salvo ainda.</div>`\n    const wrapW = width * CELL, wrapH = height * CELL\n    return `<div class=\"app\">\n      <div class=\"sidebar\">\n        <h1>PixelDoom · Editor</h1>\n        <div class=\"field\"><label>Nome do nível</label><input class=\"nameIn\" value=\"${esc(name)}\"/></div>\n        <div class=\"row2\">\n          <div class=\"field\"><label>Largura</label><input class=\"widthIn\" type=\"number\" min=\"4\" max=\"40\" value=\"${width}\"/></div>\n          <div class=\"field\"><label>Altura</label><input class=\"heightIn\" type=\"number\" min=\"4\" max=\"40\" value=\"${height}\"/></div>\n        </div>\n        <div class=\"field\"><label>Ferramentas</label>\n          <div class=\"toolgrid\">\n            ${TOOLS.map((t) => `<button class=\"toolbtn ${tool === t.id ? 'active' : ''}\" data-tool=\"${t.id}\" style=\"--c:${t.sw}\"><span class=\"sw\"></span>${t.label}</button>`).join('')}\n          </div>\n        </div>\n        <div class=\"actions\">\n          <button class=\"btn newBtn\">＋ Novo Nível</button>\n          <button class=\"btn saveBtn\">💾 Salvar</button>\n          <button class=\"btn primary playBtn\">▶ Jogar</button>\n        </div>\n        <div class=\"msg\">${esc(msg)}</div>\n        <div class=\"levelList\">\n          <label>Níveis salvos</label>\n          ${listHtml}\n        </div>\n      </div>\n      <div class=\"canvasArea\">\n        <div class=\"canvasWrap\" style=\"width:${wrapW}px;height:${wrapH}px\">\n          <canvas class=\"grid\" data-d2-static></canvas>\n        </div>\n      </div>\n    </div>`\n  },\n  mounted(d2) {\n    if (d2.state.width === undefined) {\n      d2.setState({\n        levelId: null, name: 'Novo Nível', width: 12, height: 12,\n        grid: blankGrid(12, 12), things: [], playerStart: { x: 1.5, y: 1.5, angle: 0 },\n        tool: '1', msg: 'Escolha uma ferramenta e desenhe o nível.',\n      })\n    }\n\n    let painting = false\n    let draft = null\n\n    const cellFromEvent = (e, cv) => {\n      const rect = cv.getBoundingClientRect()\n      const w = d2.state.width, h = d2.state.height\n      const cx = Math.floor(((e.clientX - rect.left) / rect.width) * w)\n      const cy = Math.floor(((e.clientY - rect.top) / rect.height) * h)\n      return { cx: Math.max(0, Math.min(w - 1, cx)), cy: Math.max(0, Math.min(h - 1, cy)) }\n    }\n\n    const applyTool = (cx, cy, gridRef) => {\n      const s = d2.state\n      const idx = cy * s.width + cx\n      if (s.tool === 'player') {\n        s.playerStart = { x: cx + 0.5, y: cy + 0.5, angle: (s.playerStart && s.playerStart.angle) || 0 }\n        return null\n      }\n      if (s.tool === 'enemy') {\n        const things = (s.things || []).slice()\n        const at = things.findIndex((t) => t.type === 'enemy' && Math.floor(t.x) === cx && Math.floor(t.y) === cy)\n        if (at >= 0) things.splice(at, 1)\n        else things.push({ x: cx + 0.5, y: cy + 0.5, type: 'enemy' })\n        s.things = things\n        return null\n      }\n      const val = Number(s.tool)\n      const g = gridRef.slice()\n      if (val === 5) { for (let i = 0; i < g.length; i++) if (g[i] === 5) g[i] = 0 }\n      g[idx] = val\n      return g\n    }\n\n    d2.on('.grid', 'mousedown', (e, cv) => {\n      const s = d2.state\n      if (s.tool === 'player' || s.tool === 'enemy') {\n        const { cx, cy } = cellFromEvent(e, cv)\n        applyTool(cx, cy, s.grid)\n        drawGrid(cv, d2.state, null)\n        return\n      }\n      painting = true\n      draft = s.grid.slice()\n      const { cx, cy } = cellFromEvent(e, cv)\n      const g2 = applyTool(cx, cy, draft)\n      if (g2) draft = g2\n      drawGrid(cv, d2.state, draft)\n    })\n    d2.on(window, 'mousemove', (e) => {\n      if (!painting) return\n      const cv = d2.$('.grid'); if (!cv) return\n      const { cx, cy } = cellFromEvent(e, cv)\n      const g2 = applyTool(cx, cy, draft)\n      if (g2) draft = g2\n      drawGrid(cv, d2.state, draft)\n    })\n    d2.on(window, 'mouseup', () => {\n      if (painting && draft) d2.state.grid = draft\n      painting = false\n      draft = null\n    })\n\n    d2.on('.toolbtn', 'click', (e, el) => { d2.state.tool = el.dataset.tool })\n    d2.on('.nameIn', 'input', (e, el) => { d2.state.name = el.value })\n    d2.on('.widthIn', 'change', (e, el) => {\n      const nw = Math.max(4, Math.min(40, parseInt(el.value, 10) || 12))\n      const s = d2.state\n      const ng = resizeGrid(s.grid, s.width, s.height, nw, s.height)\n      d2.setState({ grid: ng, width: nw })\n    })\n    d2.on('.heightIn', 'change', (e, el) => {\n      const nh = Math.max(4, Math.min(40, parseInt(el.value, 10) || 12))\n      const s = d2.state\n      const ng = resizeGrid(s.grid, s.width, s.height, s.width, nh)\n      d2.setState({ grid: ng, height: nh })\n    })\n\n    d2.on('.newBtn', 'click', () => {\n      d2.setState({\n        levelId: null, name: 'Novo Nível', width: 12, height: 12,\n        grid: blankGrid(12, 12), things: [], playerStart: { x: 1.5, y: 1.5, angle: 0 },\n        tool: '1', msg: 'Novo nível — comece a desenhar as paredes.',\n      })\n    })\n\n    d2.on('.levelItem', 'click', (e, el) => {\n      const ds = d2.data('levels')\n      const rec = (ds.records() || []).find((r) => r._id === el.dataset.id)\n      if (!rec) return\n      d2.setState({\n        levelId: rec._id, name: rec.name, width: rec.width, height: rec.height,\n        grid: (rec.grid || []).slice(), things: (rec.things || []).map((t) => ({ ...t })),\n        playerStart: rec.playerStart ? { ...rec.playerStart } : { x: 1.5, y: 1.5, angle: 0 },\n        msg: `Carregado: ${rec.name}`,\n      })\n    })\n\n    const doSave = async () => {\n      const s = d2.state\n      const ds = d2.data('levels')\n      const payload = {\n        name: s.name || 'Nível sem nome', width: s.width, height: s.height,\n        grid: s.grid, things: s.things || [], playerStart: s.playerStart || { x: 1.5, y: 1.5, angle: 0 },\n        updatedAt: new Date().toISOString(),\n      }\n      d2.state.msg = 'Salvando…'\n      try {\n        if (s.levelId) {\n          await ds.update({ _id: s.levelId, ...payload })\n        } else {\n          const rec = await ds.create(payload)\n          let newId = (rec && rec._id) || (rec && rec.data && rec.data._id) || null\n          if (!newId) {\n            await ds.refresh()\n            const all = (ds.records() || []).slice().sort((a, b) => (a._id < b._id ? 1 : -1))\n            newId = all[0] && all[0]._id\n          }\n          d2.state.levelId = newId\n        }\n        d2.state.msg = 'Salvo!'\n      } catch (err) {\n        d2.state.msg = 'Erro ao salvar.'\n      }\n    }\n    d2.on('.saveBtn', 'click', () => { doSave() })\n    d2.on('.playBtn', 'click', async () => {\n      await doSave()\n      const store = d2.store('gameStore')\n      if (store) store.set('selectedLevelId', d2.state.levelId)\n      window.location.href = d2.param('playUrl', '/')\n    })\n  },\n  updated(d2) {\n    const cv = d2.$('.grid')\n    if (cv) drawGrid(cv, d2.state, null)\n  },\n}\n"}},"levels":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"levels"}}}},"gameStore":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"gameStore"}}}},"playUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"playUrl"}}}}}}}}}},{"_id":"6a73ee81d5c61d2c1c9a94e7","component":"data2-core-types@Component","system":"6172b957976026c073ab9058","params":{"extends":"data2-core-primitives@Block","component":"pixeldoomPlay","package":"lucca-playground","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"const WALL_COLORS = {\n  1: [179, 57, 57],\n  2: [74, 105, 189],\n  3: [56, 173, 169],\n  4: [229, 142, 38],\n}\nconst FLOOR_COLOR = [26, 26, 26]\nconst SKY_COLOR = [40, 46, 66]\nconst RENDER_W = 320\nconst RENDER_H = 200\nconst FOV = (66 * Math.PI) / 180\nconst MINI = 160\n\nfunction isWallCell(v) { return v >= 1 && v <= 4 }\nfunction clamp(v, a, b) { return Math.max(a, Math.min(b, v)) }\n\nexport default {\n  css: `\n    .app{position:absolute;inset:0;background:#000;overflow:hidden;font-family:'Courier New',monospace;color:#e8e8ee}\n    .scene{position:absolute;inset:0;width:100%;height:100%;image-rendering:pixelated;cursor:crosshair}\n    .mini{position:absolute;top:16px;right:16px;width:160px;height:160px;border:2px solid #444;background:#0d0f14;opacity:0.92}\n    .hud{position:absolute;top:16px;left:16px;display:flex;flex-direction:column;gap:4px;pointer-events:none;text-shadow:0 1px 3px #000}\n    .hudName{font-size:14px;letter-spacing:2px;color:#f6e58d;text-transform:uppercase}\n    .hudKills{font-size:13px;color:#78e08f}\n    .crosshair{position:absolute;left:50%;top:50%;width:14px;height:14px;margin:-7px;pointer-events:none}\n    .crosshair::before,.crosshair::after{content:'';position:absolute;background:#fff;opacity:.85}\n    .crosshair::before{left:6px;top:0;width:2px;height:14px}\n    .crosshair::after{left:0;top:6px;width:14px;height:2px}\n    .backBtn{position:absolute;bottom:16px;left:16px;background:#1d2030;border:1px solid #3a3f52;color:#e8e8ee;padding:8px 14px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:12px;z-index:5}\n    .loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#0d0f14;color:#9aa0b4;font-size:14px;letter-spacing:2px;z-index:9}\n    .loading.hide{display:none}\n    .victory{position:absolute;inset:0;display:none;align-items:center;justify-content:center;flex-direction:column;gap:16px;background:rgba(10,12,18,0.9);z-index:10}\n    .victory.show{display:flex}\n    .victory h2{font-size:32px;color:#f6e58d;letter-spacing:4px;margin:0}\n    .victory button{background:#f6e58d;color:#161822;font-weight:700;border:0;padding:10px 20px;border-radius:4px;cursor:pointer;font-family:inherit;font-size:13px}\n    .hint{position:absolute;bottom:16px;right:16px;font-size:10px;color:#666;text-align:right;pointer-events:none}\n  `,\n  render() {\n    return `<div class=\"app\">\n      <canvas class=\"scene\" data-d2-static></canvas>\n      <canvas class=\"mini\" data-d2-static></canvas>\n      <div class=\"crosshair\" data-d2-static></div>\n      <div class=\"hud\">\n        <div class=\"hudName\">Carregando…</div>\n        <div class=\"hudKills\">Abates: 0/0</div>\n      </div>\n      <div class=\"hint\">WASD/Setas move · Q/E strafe · Espaço/Click atira</div>\n      <button class=\"backBtn\">← Voltar ao editor</button>\n      <div class=\"loading\">Carregando nível…</div>\n      <div class=\"victory\">\n        <h2>NÍVEL COMPLETO</h2>\n        <button class=\"victoryBtn\">Voltar ao editor</button>\n      </div>\n    </div>`\n  },\n  mounted(d2) {\n    const keys = {}\n    let level = null\n    let player = { x: 1.5, y: 1.5, angle: 0 }\n    let things = []\n    let kills = 0\n    let totalEnemies = 0\n    let gameWon = false\n    let ready = false\n    let lastT = null\n    const depthBuffer = new Array(RENDER_W).fill(1e9)\n\n    const goEditor = () => { window.location.href = d2.param('editorUrl', '/') }\n    d2.on('.backBtn', 'click', goEditor)\n    d2.on('.victoryBtn', 'click', goEditor)\n\n    function cellAt(gx, gy) {\n      if (gx < 0 || gy < 0 || gx >= level.width || gy >= level.height) return 1\n      return level.grid[gy * level.width + gx] || 0\n    }\n    function canStand(x, y) { return !isWallCell(cellAt(Math.floor(x), Math.floor(y))) }\n\n    function castRay(px, py, angle) {\n      const dirX = Math.cos(angle), dirY = Math.sin(angle)\n      let mapX = Math.floor(px), mapY = Math.floor(py)\n      const deltaDistX = dirX === 0 ? 1e30 : Math.abs(1 / dirX)\n      const deltaDistY = dirY === 0 ? 1e30 : Math.abs(1 / dirY)\n      let stepX, stepY, sideDistX, sideDistY\n      if (dirX < 0) { stepX = -1; sideDistX = (px - mapX) * deltaDistX } else { stepX = 1; sideDistX = (mapX + 1 - px) * deltaDistX }\n      if (dirY < 0) { stepY = -1; sideDistY = (py - mapY) * deltaDistY } else { stepY = 1; sideDistY = (mapY + 1 - py) * deltaDistY }\n      let side = 0, cellVal = 0\n      for (let i = 0; i < 64; i++) {\n        if (sideDistX < sideDistY) { sideDistX += deltaDistX; mapX += stepX; side = 0 } else { sideDistY += deltaDistY; mapY += stepY; side = 1 }\n        cellVal = cellAt(mapX, mapY)\n        if (isWallCell(cellVal)) break\n      }\n      let dist\n      if (side === 0) dist = (mapX - px + (1 - stepX) / 2) / (dirX || 1e-6)\n      else dist = (mapY - py + (1 - stepY) / 2) / (dirY || 1e-6)\n      return { dist: Math.max(dist, 0.0001), side, cellVal }\n    }\n\n    function shadeRGB(rgb, mult, fogT) {\n      const r = rgb[0] * mult, g = rgb[1] * mult, b = rgb[2] * mult\n      return [\n        r + (FLOOR_COLOR[0] - r) * fogT,\n        g + (FLOOR_COLOR[1] - g) * fogT,\n        b + (FLOOR_COLOR[2] - b) * fogT,\n      ]\n    }\n\n    function shoot() {\n      if (!ready || gameWon) return\n      const wallDist = castRay(player.x, player.y, player.angle).dist\n      let best = null, bestAngle = 999\n      for (const e of things) {\n        if (e.type !== 'enemy' || !e.alive) continue\n        const ex = e.x - player.x, ey = e.y - player.y\n        const dist = Math.hypot(ex, ey)\n        let ang = Math.atan2(ey, ex) - player.angle\n        while (ang > Math.PI) ang -= 2 * Math.PI\n        while (ang < -Math.PI) ang += 2 * Math.PI\n        if (Math.abs(ang) < 0.14 && dist < wallDist + 0.6 && Math.abs(ang) < bestAngle) { bestAngle = Math.abs(ang); best = e }\n      }\n      if (best) { best.alive = false; kills += 1 }\n    }\n    d2.on('.scene', 'click', shoot)\n    d2.on(window, 'keydown', (e) => {\n      const c = e.code\n      if (c === 'KeyW' || c === 'ArrowUp') keys.forward = true\n      else if (c === 'KeyS' || c === 'ArrowDown') keys.back = true\n      else if (c === 'KeyA' || c === 'ArrowLeft') keys.rotLeft = true\n      else if (c === 'KeyD' || c === 'ArrowRight') keys.rotRight = true\n      else if (c === 'KeyQ') keys.strafeLeft = true\n      else if (c === 'KeyE') keys.strafeRight = true\n      else if (c === 'Space') { e.preventDefault(); shoot() }\n    })\n    d2.on(window, 'keyup', (e) => {\n      const c = e.code\n      if (c === 'KeyW' || c === 'ArrowUp') keys.forward = false\n      else if (c === 'KeyS' || c === 'ArrowDown') keys.back = false\n      else if (c === 'KeyA' || c === 'ArrowLeft') keys.rotLeft = false\n      else if (c === 'KeyD' || c === 'ArrowRight') keys.rotRight = false\n      else if (c === 'KeyQ') keys.strafeLeft = false\n      else if (c === 'KeyE') keys.strafeRight = false\n    })\n\n    async function loadLevel() {\n      const store = d2.store('gameStore')\n      const ds = d2.data('levels')\n      await ds.refresh()\n      const selId = store ? store.get('selectedLevelId') : null\n      const rows = ds.records() || []\n      let rec = selId ? rows.find((r) => r._id === selId) : null\n      if (!rec) rec = rows[0]\n      if (!rec) {\n        const nameEl = d2.$('.hudName'); if (nameEl) nameEl.textContent = 'Nenhum nível encontrado'\n        return\n      }\n      level = { width: rec.width, height: rec.height, grid: rec.grid || [], name: rec.name || 'Nível' }\n      things = (rec.things || []).map((t) => ({ ...t, alive: true }))\n      const ps = rec.playerStart || { x: 1.5, y: 1.5, angle: 0 }\n      player = { x: ps.x, y: ps.y, angle: ps.angle || 0 }\n      kills = 0\n      totalEnemies = things.filter((t) => t.type === 'enemy').length\n      gameWon = false\n      const loadingEl = d2.$('.loading'); if (loadingEl) loadingEl.classList.add('hide')\n      const nameEl = d2.$('.hudName'); if (nameEl) nameEl.textContent = level.name\n      const killsEl = d2.$('.hudKills'); if (killsEl) killsEl.textContent = `Abates: 0/${totalEnemies}`\n      ready = true\n    }\n\n    function render3D(ctx) {\n      const img = ctx.createImageData(RENDER_W, RENDER_H)\n      for (let col = 0; col < RENDER_W; col++) {\n        const rayAngle = player.angle - FOV / 2 + (FOV * col) / RENDER_W\n        const { dist, side, cellVal } = castRay(player.x, player.y, rayAngle)\n        const perp = dist * Math.cos(rayAngle - player.angle)\n        depthBuffer[col] = perp\n        const lineH = Math.min(RENDER_H * 3, RENDER_H / Math.max(perp, 0.0001))\n        const drawStart = Math.floor(RENDER_H / 2 - lineH / 2)\n        const drawEnd = Math.floor(RENDER_H / 2 + lineH / 2)\n        const fogT = clamp(perp / 11, 0, 1)\n        const mult = side === 1 ? 1 : 0.7\n        const wc = shadeRGB(WALL_COLORS[cellVal] || WALL_COLORS[1], mult, fogT)\n        for (let y = 0; y < RENDER_H; y++) {\n          let color\n          if (y < drawStart) color = SKY_COLOR\n          else if (y > drawEnd) color = FLOOR_COLOR\n          else color = wc\n          const idx = (y * RENDER_W + col) * 4\n          img.data[idx] = color[0] | 0\n          img.data[idx + 1] = color[1] | 0\n          img.data[idx + 2] = color[2] | 0\n          img.data[idx + 3] = 255\n        }\n      }\n      ctx.putImageData(img, 0, 0)\n      const alive = things.filter((t) => t.type === 'enemy' && t.alive)\n      alive.sort((a, b) => {\n        const da = Math.hypot(a.x - player.x, a.y - player.y)\n        const db = Math.hypot(b.x - player.x, b.y - player.y)\n        return db - da\n      })\n      ctx.textAlign = 'center'\n      ctx.textBaseline = 'middle'\n      alive.forEach((e) => {\n        const ex = e.x - player.x, ey = e.y - player.y\n        const dist = Math.hypot(ex, ey)\n        let ang = Math.atan2(ey, ex) - player.angle\n        while (ang > Math.PI) ang -= 2 * Math.PI\n        while (ang < -Math.PI) ang += 2 * Math.PI\n        if (Math.abs(ang) > FOV / 2 + 0.4 || dist < 0.15) return\n        const screenX = (0.5 + Math.tan(ang) / Math.tan(FOV / 2) / 2) * RENDER_W\n        const col = Math.floor(screenX)\n        if (col < -20 || col > RENDER_W + 20) return\n        const cCol = clamp(col, 0, RENDER_W - 1)\n        if (dist > depthBuffer[cCol] + 0.35) return\n        const size = clamp(RENDER_H / dist, 10, RENDER_H * 1.6)\n        const fogT = clamp(dist / 11, 0, 1)\n        ctx.globalAlpha = 1 - fogT * 0.7\n        ctx.font = `${size}px sans-serif`\n        ctx.fillText('👹', screenX, RENDER_H / 2 + size * 0.08)\n        ctx.globalAlpha = 1\n      })\n    }\n\n    function renderMini(ctx) {\n      ctx.clearRect(0, 0, MINI, MINI)\n      ctx.fillStyle = '#0d0f14'\n      ctx.fillRect(0, 0, MINI, MINI)\n      if (!level) return\n      const cs = Math.min(MINI / level.width, MINI / level.height)\n      for (let y = 0; y < level.height; y++) {\n        for (let x = 0; x < level.width; x++) {\n          const v = level.grid[y * level.width + x] || 0\n          if (v === 0) continue\n          ctx.fillStyle = v === 5 ? 'rgb(246,229,141)' : '#666'\n          ctx.fillRect(x * cs, y * cs, cs, cs)\n        }\n      }\n      things.filter((t) => t.type === 'enemy' && t.alive).forEach((e) => {\n        ctx.fillStyle = '#e84118'\n        ctx.beginPath(); ctx.arc(e.x * cs, e.y * cs, Math.max(2, cs * 0.3), 0, 7); ctx.fill()\n      })\n      ctx.save()\n      ctx.translate(player.x * cs, player.y * cs)\n      ctx.rotate(player.angle)\n      ctx.fillStyle = '#00e6e6'\n      ctx.beginPath(); ctx.moveTo(6, 0); ctx.lineTo(-4, 4); ctx.lineTo(-4, -4); ctx.closePath(); ctx.fill()\n      ctx.restore()\n    }\n\n    function checkWin() {\n      if (gameWon || !ready) return\n      if (kills >= totalEnemies) {\n        const onExit = cellAt(Math.floor(player.x), Math.floor(player.y)) === 5\n        if (onExit) {\n          gameWon = true\n          const v = d2.$('.victory'); if (v) v.classList.add('show')\n        }\n      }\n    }\n\n    const scene = d2.$('.scene')\n    const mini = d2.$('.mini')\n    if (!scene || !mini) return\n    scene.width = RENDER_W\n    scene.height = RENDER_H\n    const sctx = scene.getContext('2d')\n    mini.width = MINI\n    mini.height = MINI\n    const mctx = mini.getContext('2d')\n\n    loadLevel()\n\n    d2.raf((t) => {\n      if (lastT == null) lastT = t\n      const dt = Math.min((t - lastT) / 1000, 0.05)\n      lastT = t\n      if (!ready) return\n      if (!gameWon) {\n        const moveSpeed = 3, rotSpeed = 2.4, strafeSpeed = 2.6\n        let dx = 0, dy = 0\n        if (keys.forward) { dx += Math.cos(player.angle) * moveSpeed * dt; dy += Math.sin(player.angle) * moveSpeed * dt }\n        if (keys.back) { dx -= Math.cos(player.angle) * moveSpeed * dt; dy -= Math.sin(player.angle) * moveSpeed * dt }\n        if (keys.strafeLeft) { dx += Math.cos(player.angle - Math.PI / 2) * strafeSpeed * dt; dy += Math.sin(player.angle - Math.PI / 2) * strafeSpeed * dt }\n        if (keys.strafeRight) { dx += Math.cos(player.angle + Math.PI / 2) * strafeSpeed * dt; dy += Math.sin(player.angle + Math.PI / 2) * strafeSpeed * dt }\n        if (keys.rotLeft) player.angle -= rotSpeed * dt\n        if (keys.rotRight) player.angle += rotSpeed * dt\n        if (dx !== 0) { const nx = player.x + dx; if (canStand(nx + Math.sign(dx) * 0.2, player.y)) player.x = nx }\n        if (dy !== 0) { const ny = player.y + dy; if (canStand(player.x, ny + Math.sign(dy) * 0.2)) player.y = ny }\n        checkWin()\n      }\n      render3D(sctx)\n      renderMini(mctx)\n      const killsEl = d2.$('.hudKills')\n      if (killsEl) killsEl.textContent = `Abates: ${kills}/${totalEnemies}`\n    })\n  },\n}\n"}},"levels":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"levels"}}}},"gameStore":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"gameStore"}}}},"editorUrl":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"editorUrl"}}}}}}}}}},{"_id":"6abc78f94d5ed83db05a347c","component":"data2-core-types@Component","system":"6172b957976026c073ab9058","params":{"extends":"data2-core-primitives@Block","component":"yoink-canvas-stage","package":"lucca-playground","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    :host { all: initial; }\n    canvas.stage { position:absolute; inset:0; width:100%; height:100%; display:block; }\n  `,\n  render() {\n    return `<canvas class=\"stage\"></canvas>`\n  },\n  mounted(d2) {\n    const canvas = d2.$('.stage')\n    let gpu = null\n    let ctx2d = null\n    let status = 'idle'\n\n    const unsub = d2.bus.on('yoink:status', (s) => { status = s || 'idle' })\n\n    const WGSL = `\nstruct Uniforms { resolution: vec2<f32>, pad: vec2<f32> };\n@group(0) @binding(0) var<uniform> u: Uniforms;\nstruct VOut {\n  @builtin(position) pos: vec4<f32>,\n  @location(0) uv: vec2<f32>,\n  @location(1) size: vec2<f32>,\n  @location(2) fill: vec4<f32>,\n  @location(3) border: vec4<f32>,\n  @location(4) borderPx: f32,\n};\n@vertex\nfn vs(\n  @location(0) corner: vec2<f32>,\n  @location(1) iOffset: vec2<f32>,\n  @location(2) iSize: vec2<f32>,\n  @location(3) iFill: vec4<f32>,\n  @location(4) iBorder: vec4<f32>,\n  @location(5) iBorderPx: f32,\n) -> VOut {\n  let px = iOffset + corner * iSize;\n  let clip = vec2<f32>(\n    (px.x / u.resolution.x) * 2.0 - 1.0,\n    1.0 - (px.y / u.resolution.y) * 2.0\n  );\n  var out: VOut;\n  out.pos = vec4<f32>(clip, 0.0, 1.0);\n  out.uv = corner;\n  out.size = iSize;\n  out.fill = iFill;\n  out.border = iBorder;\n  out.borderPx = iBorderPx;\n  return out;\n}\n@fragment\nfn fs(in: VOut) -> @location(0) vec4<f32> {\n  let bx = in.borderPx / max(in.size.x, 1.0);\n  let by = in.borderPx / max(in.size.y, 1.0);\n  let edge = in.uv.x < bx || in.uv.x > (1.0 - bx) || in.uv.y < by || in.uv.y > (1.0 - by);\n  if (edge) { return in.border; }\n  return in.fill;\n}\n    `\n\n    async function initGPU() {\n      if (!navigator.gpu) return false\n      try {\n        const adapter = await navigator.gpu.requestAdapter()\n        if (!adapter) return false\n        const device = await adapter.requestDevice()\n        const context = canvas.getContext('webgpu')\n        if (!context) return false\n        const format = navigator.gpu.getPreferredCanvasFormat()\n        context.configure({ device, format, alphaMode: 'premultiplied' })\n        const shaderModule = device.createShaderModule({ code: WGSL })\n        const pipeline = device.createRenderPipeline({\n          layout: 'auto',\n          vertex: {\n            module: shaderModule,\n            entryPoint: 'vs',\n            buffers: [\n              { arrayStride: 8, stepMode: 'vertex', attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }] },\n              { arrayStride: 52, stepMode: 'instance', attributes: [\n                { shaderLocation: 1, offset: 0, format: 'float32x2' },\n                { shaderLocation: 2, offset: 8, format: 'float32x2' },\n                { shaderLocation: 3, offset: 16, format: 'float32x4' },\n                { shaderLocation: 4, offset: 32, format: 'float32x4' },\n                { shaderLocation: 5, offset: 48, format: 'float32' },\n              ] },\n            ],\n          },\n          fragment: { module: shaderModule, entryPoint: 'fs', targets: [{ format }] },\n          primitive: { topology: 'triangle-list' },\n        })\n        const quad = new Float32Array([0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1])\n        const quadBuffer = device.createBuffer({ size: quad.byteLength, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST })\n        device.queue.writeBuffer(quadBuffer, 0, quad)\n        const uniformBuffer = device.createBuffer({ size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST })\n        const bindGroup = device.createBindGroup({ layout: pipeline.getBindGroupLayout(0), entries: [{ binding: 0, resource: { buffer: uniformBuffer } }] })\n        const instanceBuffer = device.createBuffer({ size: 52 * 8, usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST })\n        gpu = { device, context, pipeline, quadBuffer, uniformBuffer, bindGroup, instanceBuffer }\n        return true\n      } catch (e) {\n        return false\n      }\n    }\n\n    function layoutFor(key, cssW) {\n      const pad = 20\n      const w = Math.max(0, cssW - pad * 2)\n      if (key === 'login') {\n        return [\n          { x: pad, y: 130, w, h: 54 },\n          { x: pad, y: 198, w, h: 54 },\n          { x: pad, y: 266, w, h: 54, isAction: true },\n        ]\n      }\n      return [\n        { x: pad, y: 140, w, h: 54 },\n        { x: pad, y: 208, w, h: 54, isAction: true },\n        { x: pad, y: 300, w, h: 84 },\n      ]\n    }\n\n    function colorFor(rect, status) {\n      const ink = [0.10, 0.10, 0.10, 1]\n      const faint = [0.10, 0.10, 0.10, 0.15]\n      const paper = [0.961, 0.961, 0.957, 1]\n      const err = [0.75, 0.22, 0.17, 1]\n      if (rect.isAction && status === 'loading') return { fill: faint, border: ink, borderPx: 2 }\n      if (status === 'error') return { fill: paper, border: err, borderPx: 1 }\n      return { fill: paper, border: ink, borderPx: 1 }\n    }\n\n    function rectsFor(cssW, key, status) {\n      return layoutFor(key, cssW).map((r) => ({ ...r, ...colorFor(r, status) }))\n    }\n\n    function draw2D(cssW, cssH, dpr, rects) {\n      if (!ctx2d) ctx2d = canvas.getContext('2d')\n      const ctx = ctx2d\n      ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n      ctx.clearRect(0, 0, cssW, cssH)\n      ctx.fillStyle = '#f5f5f3'\n      ctx.fillRect(0, 0, cssW, cssH)\n      for (const r of rects) {\n        ctx.fillStyle = `rgba(${r.fill[0] * 255}, ${r.fill[1] * 255}, ${r.fill[2] * 255}, ${r.fill[3]})`\n        ctx.fillRect(r.x, r.y, r.w, r.h)\n        ctx.strokeStyle = `rgba(${r.border[0] * 255}, ${r.border[1] * 255}, ${r.border[2] * 255}, ${r.border[3]})`\n        ctx.lineWidth = r.borderPx\n        ctx.strokeRect(r.x + r.borderPx / 2, r.y + r.borderPx / 2, Math.max(0, r.w - r.borderPx), Math.max(0, r.h - r.borderPx))\n      }\n    }\n\n    function drawGPU(rects, resW, resH, dpr) {\n      const { device, context, pipeline, quadBuffer, uniformBuffer, bindGroup, instanceBuffer } = gpu\n      device.queue.writeBuffer(uniformBuffer, 0, new Float32Array([resW, resH, 0, 0]))\n      const data = new Float32Array(13 * Math.max(1, rects.length))\n      rects.forEach((r, i) => {\n        const o = i * 13\n        data[o + 0] = r.x * dpr; data[o + 1] = r.y * dpr\n        data[o + 2] = r.w * dpr; data[o + 3] = r.h * dpr\n        data[o + 4] = r.fill[0]; data[o + 5] = r.fill[1]; data[o + 6] = r.fill[2]; data[o + 7] = r.fill[3]\n        data[o + 8] = r.border[0]; data[o + 9] = r.border[1]; data[o + 10] = r.border[2]; data[o + 11] = r.border[3]\n        data[o + 12] = r.borderPx * dpr\n      })\n      device.queue.writeBuffer(instanceBuffer, 0, data)\n      const encoder = device.createCommandEncoder()\n      const pass = encoder.beginRenderPass({\n        colorAttachments: [{ view: context.getCurrentTexture().createView(), clearValue: { r: 0.961, g: 0.961, b: 0.957, a: 1 }, loadOp: 'clear', storeOp: 'store' }],\n      })\n      pass.setPipeline(pipeline)\n      pass.setVertexBuffer(0, quadBuffer)\n      pass.setVertexBuffer(1, instanceBuffer)\n      pass.setBindGroup(0, bindGroup)\n      pass.draw(6, rects.length)\n      pass.end()\n      device.queue.submit([encoder.finish()])\n    }\n\n    function sizeCanvas() {\n      const rect = canvas.getBoundingClientRect()\n      const dpr = Math.max(1, window.devicePixelRatio || 1)\n      const w = Math.max(1, Math.round(rect.width * dpr))\n      const h = Math.max(1, Math.round(rect.height * dpr))\n      if (canvas.width !== w || canvas.height !== h) { canvas.width = w; canvas.height = h }\n      return { cssW: rect.width || 1, cssH: rect.height || 1, dpr }\n    }\n\n    function draw() {\n      const key = d2.param('layoutKey') || 'downloader'\n      const { cssW, cssH, dpr } = sizeCanvas()\n      const rects = rectsFor(cssW, key, status)\n      if (gpu) drawGPU(rects, canvas.width, canvas.height, dpr)\n      else draw2D(cssW, cssH, dpr, rects)\n    }\n\n    const ro = new ResizeObserver(() => draw())\n    ro.observe(canvas)\n    d2.onUnmount(() => { ro.disconnect(); unsub() })\n\n    initGPU().finally(() => draw())\n    d2.raf(() => { draw(); return true })\n  },\n}\n"}},"layoutKey":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"layoutKey"}}}}}}}}}},{"_id":"6abc78fa56bd5022ccc167e5","component":"data2-core-types@Component","system":"6172b957976026c073ab9058","params":{"extends":"data2-core-primitives@Block","component":"yoink-login","package":"lucca-playground","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    :host { all: initial; }\n    .wrap { position:relative; width:100%; height:100%; box-sizing:border-box; font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; color:#1a1a1a; }\n    .top { position:absolute; top:24px; left:20px; right:20px; }\n    .brand { font-size:12px; letter-spacing:3px; text-transform:uppercase; opacity:.5; }\n    h1 { font-size:24px; margin:16px 0 4px; font-weight:600; }\n    .sub { font-size:13px; opacity:.55; margin:0; }\n    label { position:absolute; font-size:11px; letter-spacing:1px; text-transform:uppercase; opacity:.5; }\n    .field { position:absolute; left:20px; right:20px; display:flex; align-items:center; }\n    input { width:100%; box-sizing:border-box; background:transparent; border:none; outline:none; font:inherit; font-size:15px; padding:0 14px; color:#1a1a1a; }\n    button.submit { position:absolute; left:20px; right:20px; top:266px; height:54px; font:inherit; font-weight:600; font-size:15px; letter-spacing:.5px; background:transparent; border:none; cursor:pointer; color:#1a1a1a; }\n    button.submit:disabled { opacity:.4; cursor:default; }\n    .err { position:absolute; left:20px; right:20px; top:330px; font-size:13px; color:#c0392b; min-height:16px; }\n    .foot { position:absolute; bottom:20px; left:0; right:0; font-size:11px; opacity:.4; text-align:center; }\n  `,\n  render(d2) {\n    const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]))\n    const busy = d2.state.busy\n    return `\n      <div class=\"wrap\">\n        <div class=\"top\">\n          <div class=\"brand\">yoink</div>\n          <h1>Sign in</h1>\n          <p class=\"sub\">Downloads are for logged-in users only.</p>\n        </div>\n        <label style=\"top:112px; left:20px;\">Email</label>\n        <div class=\"field\" style=\"top:130px; height:54px;\"><input class=\"email\" type=\"email\" autocomplete=\"username\" value=\"${esc(d2.state.email)}\" /></div>\n        <label style=\"top:180px; left:20px;\">Password</label>\n        <div class=\"field\" style=\"top:198px; height:54px;\"><input class=\"password\" type=\"password\" autocomplete=\"current-password\" value=\"${esc(d2.state.password)}\" /></div>\n        <button class=\"submit\" ${busy ? 'disabled' : ''}>${busy ? 'Signing in…' : 'Sign in'}</button>\n        <div class=\"err\">${esc(d2.state.error)}</div>\n        <div class=\"foot\">wireframe · v0</div>\n      </div>\n    `\n  },\n  mounted(d2) {\n    d2.on('.email', 'input', (e) => { d2.state.email = e.target.value })\n    d2.on('.password', 'input', (e) => { d2.state.password = e.target.value })\n    const submit = async () => {\n      if (d2.state.busy) return\n      const email = d2.state.email || ''\n      const password = d2.state.password || ''\n      if (!email || !password) { d2.setState({ error: 'Enter email and password.' }); return }\n      d2.setState({ busy: true, error: '' })\n      d2.bus.emit('yoink:status', 'loading')\n      try {\n        await d2.auth('authStrategy').login({ credentials: { email, password } })\n        d2.bus.emit('yoink:status', 'idle')\n        d2.router('router').goTo('/')\n      } catch (e) {\n        d2.setState({ busy: false, error: 'Could not sign in — check your credentials.' })\n        d2.bus.emit('yoink:status', 'error')\n      }\n    }\n    d2.on('.submit', 'click', submit)\n    d2.on('.password', 'keydown', (e) => { if (e.key === 'Enter') submit() })\n  },\n}\n"}},"authStrategy":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"authStrategy"}}}},"router":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"router"}}}}}}}}}},{"_id":"6abc78fa06969715dec69c80","component":"data2-core-types@Component","system":"6172b957976026c073ab9058","params":{"extends":"data2-core-primitives@Block","component":"yoink-downloader","package":"lucca-playground","definition":{"preventEvaluation":true,"component":"data2-core-types@Definition","params":{"def":{"component":"data2-code-components@CodeHost","params":{"code":{"component":"data2-core-primitives@String","params":{"content":"export default {\n  css: `\n    :host { all: initial; }\n    .app { position:relative; width:100%; height:100%; box-sizing:border-box; font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; color:#1a1a1a; }\n    .top { position:absolute; top:24px; left:20px; right:20px; display:flex; align-items:baseline; justify-content:space-between; }\n    .brand { font-size:12px; letter-spacing:3px; text-transform:uppercase; opacity:.5; }\n    .signout { font-size:11px; opacity:.5; background:none; border:none; cursor:pointer; font-family:inherit; text-decoration:underline; padding:0; }\n    h1 { position:absolute; top:56px; left:20px; right:20px; font-size:22px; margin:0; font-weight:600; }\n    .sub { position:absolute; top:86px; left:20px; right:20px; font-size:13px; opacity:.55; margin:0; }\n    .field { position:absolute; left:20px; right:20px; top:140px; height:54px; display:flex; align-items:center; }\n    input.url { width:100%; box-sizing:border-box; background:transparent; border:none; outline:none; font:inherit; font-size:15px; padding:0 16px; color:#1a1a1a; }\n    input.url::placeholder { color:#1a1a1a; opacity:.35; }\n    button.go { position:absolute; left:20px; right:20px; top:208px; height:54px; font:inherit; font-weight:600; font-size:15px; letter-spacing:.5px; background:transparent; border:none; cursor:pointer; color:#1a1a1a; }\n    button.go:disabled { opacity:.4; cursor:default; }\n    .status { position:absolute; left:20px; right:20px; top:272px; font-size:13px; opacity:.7; }\n    .status.err { color:#c0392b; opacity:1; }\n    .result { position:absolute; left:20px; right:20px; top:300px; height:84px; padding:16px; box-sizing:border-box; display:flex; flex-direction:column; justify-content:center; gap:8px; }\n    .result .name { font-size:13px; word-break:break-all; }\n    a.dl { font:inherit; font-weight:600; font-size:14px; text-decoration:none; color:#1a1a1a; border-bottom:1px solid currentColor; align-self:flex-start; padding-bottom:2px; }\n    .hint { position:absolute; bottom:20px; left:0; right:0; font-size:11px; opacity:.4; text-align:center; }\n  `,\n  render(d2) {\n    const esc = (s) => String(s == null ? '' : s).replace(/[&<>\"']/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]))\n    const status = d2.state.status || 'idle'\n    const busy = status === 'loading'\n    const result = d2.state.result\n    const auth = d2.auth('authStrategy')\n    const email = auth && auth.user && auth.user.email\n    return `\n      <div class=\"app\">\n        <div class=\"top\">\n          <div class=\"brand\">yoink${email ? ' · ' + esc(email) : ''}</div>\n          <button class=\"signout\">sign out</button>\n        </div>\n        <h1>Paste a link.</h1>\n        <p class=\"sub\">Any public video/audio URL. We fetch a direct download.</p>\n        <div class=\"field\"><input class=\"url\" type=\"url\" placeholder=\"https://…\" value=\"${esc(d2.state.url)}\" /></div>\n        <button class=\"go\" ${busy ? 'disabled' : ''}>${busy ? 'Fetching…' : 'Yoink it'}</button>\n        <div class=\"status ${status === 'error' ? 'err' : ''}\">${esc(d2.state.message)}</div>\n        <div class=\"result\" style=\"${result ? '' : 'visibility:hidden'}\">\n          <div class=\"name\">${result ? esc(result.filename || 'download') : ''}</div>\n          ${result ? `<a class=\"dl\" href=\"${esc(result.url)}\" target=\"_blank\" rel=\"noopener\">Open download ↗</a>` : ''}\n        </div>\n        <div class=\"hint\">wireframe · v0 · canvas/webgpu stage</div>\n      </div>\n    `\n  },\n  mounted(d2) {\n    d2.on('.url', 'input', (e) => { d2.state.url = e.target.value })\n    d2.on('.url', 'keydown', (e) => { if (e.key === 'Enter') go() })\n\n    async function go() {\n      const url = (d2.state.url || '').trim()\n      if (!url) { d2.setState({ status: 'error', message: 'Paste a URL first.' }); d2.bus.emit('yoink:status', 'error'); return }\n      d2.setState({ status: 'loading', message: '', result: null })\n      d2.bus.emit('yoink:status', 'loading')\n      try {\n        const res = await d2.rush('extractRush').invoke({ url })\n        let payload = res\n        if (payload && typeof payload === 'object' && payload.status === undefined && payload.data !== undefined) payload = payload.data\n        if (!payload || payload.status === 'error') {\n          const err = payload && payload.error\n          const msg = (err && (err.code || err.message)) || 'Could not fetch that link.'\n          d2.setState({ status: 'error', message: String(msg), result: null })\n          d2.bus.emit('yoink:status', 'error')\n          return\n        }\n        d2.setState({ status: 'success', message: 'Ready.', result: { url: payload.url, filename: payload.filename } })\n        d2.bus.emit('yoink:status', 'success')\n      } catch (e) {\n        d2.setState({ status: 'error', message: (e && e.message) || 'Request failed.', result: null })\n        d2.bus.emit('yoink:status', 'error')\n      }\n    }\n    d2.on('.go', 'click', go)\n\n    d2.on('.signout', 'click', async () => {\n      try { await d2.auth('authStrategy').logout() } catch (e) {}\n      d2.bus.emit('yoink:status', 'idle')\n      d2.router('router').goTo('/login')\n    })\n  },\n}\n"}},"extractRush":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"extractRush"}}}},"authStrategy":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"authStrategy"}}}},"router":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"router"}}}}}}}}}},{"_id":"5ed9bed7b9e0891ce913e884","component":"data2-core-types@Component","params":{"package":"data2-core","component":"DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}},{"_id":"5f472ae463c680de4ff296e9","component":"data2-core-types@Component","params":{"package":"data2-core","component":"Data2TableDataSource","extends":"data2-core@DataSource","renderable":{"dimensions":{"disabled":false,"component":"data2-core-types@Dimensions","params":{"width":1366,"exactWidth":false,"exactHeight":false,"height":768}}}}}]}},{"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}},"identityProviders":[{"provider":{"component":"data2-core-primitives@String","params":{"content":"GOOGLE"}},"clientId":{"component":"data2-core-primitives@String","params":{"content":"55470861603-22pvfc1t49lp8cjnbfk71s5ct9hp1q1v.apps.googleusercontent.com"}}}]},"reference":"Data2BuilderAuthentication","updatedAt":"2026-08-06T19:31:23.557Z"},{"_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":[{"_id":"6abc7961c5165b87091f6b89","component":"data2-rush@HTTPListener","reference":"yoinkExtract","system":"6172b957976026c073ab9058","params":{}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"69483e4605714c8c39688670","parent":"69483e4605714c8c3968866c","component":"data2-core-primitives@Block","system":"6172b957976026c073ab9058","displayName":"1","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(103,83,209,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"height":90,"exactHeight":90,"exactWidth":90,"width":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"exactX":false,"exactY":false,"x":96,"y":2}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"100","delay":"0","easing":"cubic-bezier(0.7368421052631579,0.21437499999999998,0.7828947368421053,0.262375)"}}]},"index":0,"reference":"1"},{"_id":"69483e4605714c8c3968866d","parent":"69483e4605714c8c3968866c","component":"data2-core-primitives@Block","system":"6172b957976026c073ab9058","displayName":"2","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(103,83,209,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"height":90,"exactHeight":90,"exactWidth":90,"width":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"exactX":1.8199999999999998,"exactY":1.63,"x":2,"y":2}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"100","delay":"0","easing":"cubic-bezier(0.7368421052631579,0.21437499999999998,0.7828947368421053,0.262375)"}}]},"index":1,"reference":"2"},{"_id":"69483e4605714c8c3968866e","parent":"69483e4605714c8c3968866c","component":"data2-core-primitives@Block","system":"6172b957976026c073ab9058","displayName":"3","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(103,83,209,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"height":90,"exactHeight":90,"exactWidth":90,"width":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"exactX":1.96,"exactY":96.42,"x":2,"y":96}},"opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"100","delay":"0","easing":"cubic-bezier(0.7368421052631579,0.21437499999999998,0.7828947368421053,0.262375)"}}]},"index":2,"reference":"3"},{"_id":"69483e4605714c8c3968866f","parent":"69483e4605714c8c3968866c","component":"data2-core-primitives@Block","system":"6172b957976026c073ab9058","displayName":"4","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(103,83,209,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"height":90,"exactHeight":90,"exactWidth":90,"width":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"exactX":1.75,"exactY":189.75,"x":2,"y":190}},"text":"","opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"100","delay":"0","easing":"cubic-bezier(0.7368421052631579,0.21437499999999998,0.7828947368421053,0.262375)"}}]},"index":3,"reference":"4"},{"_id":"69483e4605714c8c3968865f","parent":"69483e4605714c8c3968865c","component":"data2-core-primitives@Block","system":"6172b957976026c073ab9058","displayName":"5","params":{"border":{"component":"data2-core-types@Border","params":{"color":"#808080","radius":{},"width":{"left":"0","top":"0","right":"0","bottom":"0"}}},"fill":{"params":{"backgrounds":[{"params":{"color":{"component":"data2-core-types@Color","params":{"rgba":"rgba(103,83,209,1)"}}},"component":"data2-core-types@Background"}]},"component":"data2-core-types@Fill"},"dimensions":{"component":"data2-core-types@Dimensions","params":{"height":90,"exactHeight":90,"exactWidth":90,"width":90}},"position":{"component":"data2-core-types@Position","params":{"freeTransform":true,"exactX":1.75,"exactY":189.75,"x":2,"y":190}},"text":"","opacity":{"disabled":false,"component":"data2-core-types@Opacity","params":{"value":100}},"transitions":[{"component":"data2-core-types@Transition","params":{"scope":"ALL","duration":"100","delay":"0","easing":"cubic-bezier(0.7368421052631579,0.21437499999999998,0.7828947368421053,0.262375)"}}]},"index":0,"reference":"5"},{"_id":"6abc796c79cd6ce91b6b9a95","component":"data2-core-primitives@Router","system":"6172b957976026c073ab9058","displayName":"Yoink Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":{"component":"data2-core-primitives@String","params":{"content":"/"}},"name":"Yoink","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"h-4co2limE-N4K-q-7I3W"}},"policies":[{"component":"data2-core-auth@Policy","params":{"authenticationStrategy":{"disabled":false,"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkAuth"}}}}]}},{"component":"data2-core-primitives@Route","params":{"path":"/login","name":"Yoink Login","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"kqe5n6-HqoigrJpg4qFxr"}}}}],"login":{"component":"data2-core-types@ArtboardReference","params":{"reference":"kqe5n6-HqoigrJpg4qFxr"}}},"reference":"yoinkRouter"},{"_id":"6abc78c606969715dec69c32","component":"data2-core-primitives@Artboard","system":"6172b957976026c073ab9058","displayName":"Yoink Login","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Yoink Login"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"kqe5n6-HqoigrJpg4qFxr"},{"_id":"6abc78c7c77e09174ec8f367","component":"data2-core-primitives@Artboard","system":"6172b957976026c073ab9058","displayName":"Yoink Downloader","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"Yoink Downloader"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"h-4co2limE-N4K-q-7I3W"},{"_id":"19a659acdb9ae710699fbef2","parent":"6abc78c606969715dec69c32","component":"lucca-playground@yoink-canvas-stage","system":"6172b957976026c073ab9058","displayName":"Stage","params":{"pin":"stretch","layoutKey":"login","super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}}}},"index":0,"reference":"kbVTXEgk1iij5awn63WtZ"},{"_id":"2a5b53004ce9ff178d70e5ce","parent":"6abc78c606969715dec69c32","component":"lucca-playground@yoink-login","system":"6172b957976026c073ab9058","displayName":"Login Form","params":{"pin":"stretch","authStrategy":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkAuth"}},"router":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkRouter"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}}}},"index":1,"reference":"XbT0tkny6zZw89JmKyWpU"},{"_id":"986fb47b54233c2f298af37b","parent":"6abc78c7c77e09174ec8f367","component":"lucca-playground@yoink-canvas-stage","system":"6172b957976026c073ab9058","displayName":"Stage","params":{"pin":"stretch","layoutKey":"downloader","super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}}}},"index":0,"reference":"Bs28rGKOXw3gXW_boj__E"},{"_id":"dce5407435c2f543a422d280","parent":"6abc78c7c77e09174ec8f367","component":"lucca-playground@yoink-downloader","system":"6172b957976026c073ab9058","displayName":"Downloader","params":{"pin":"stretch","extractRush":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkExtract"}},"authStrategy":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkAuth"}},"router":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"yoinkRouter"}},"super":{"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0,"freeTransform":true,"left":true,"right":true,"top":true,"bottom":true}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":390,"height":844}}}},"index":1,"reference":"tPidTYybb0dDNWdtC-Dse"}]}},{"_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":"6abc79a7da4aab2c03e6e8b4","displayName":"Yoink","reference":"wwbXWbIx80PGRNjCAcAQ-","params":{"domain":{"component":"data2-core-primitives@String","params":{"content":"yoink"}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"yoinkRouter"}}},"system":"6172b957976026c073ab9058","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a73eb729b80399cc1ea52fb","component":"data2-core@Store","system":"6172b957976026c073ab9058","params":{"initialData":{"selectedLevelId":null}},"reference":"gameStore"},{"_id":"6abc790767379ffc05f996f6","component":"data2-core@AuthenticationStrategy","system":"6172b957976026c073ab9058","params":{"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"email"}},{"component":"data2-core-types@FieldReference","params":{"key":"password"}}],"verifier":{"component":"data2-core-types@DataSetReference","params":{"reference":"L03Udna9381LO7BcMWyX1DataSet"}},"email":{"params":{"column":"email"},"component":"data2-core-types@DataSetColumnReference"},"role":{"params":{},"component":"data2-core-types@DataSetColumnReference","disabled":true},"password":{"params":{"column":"password"},"component":"data2-core-types@DataSetColumnReference"}},"reference":"yoinkAuth"},{"_id":"6abc78c406969715dec69c2b","component":"data2-core@DataSet","system":"6172b957976026c073ab9058","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"L03Udna9381LO7BcMWyX1"}}},"reference":"L03Udna9381LO7BcMWyX1DataSet"},{"_id":"6abc78c4c5165b87091f6ad4","component":"data2-core@Data2TableDataSource","system":"6172b957976026c073ab9058","params":{"table":"L03Udna9381LO7BcMWyX1","schema":[{"component":"data2-core-types@Field","params":{"key":"email","title":"Email","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"password","title":"Password","component":"data2-core-types@Password","required":true}}]},"reference":"L03Udna9381LO7BcMWyX1"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}