{"context":{"domain":"vinicius-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":"2022-03-09T02:01:26.213Z"}]}},{"reference":"OrganizationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"DataComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@DataSet","reference":"OneFileComponentInstancesDataSet","params":{"pagination":{"size":1},"master":{"dataset":{"component":"data2-core-types@ProcessReference","params":{"reference":"SystemsDataSet"}},"localField":"system","masterField":"_id"},"datasource":{"component":"data2-core-types@ProcessReference","params":{"reference":"FileComponentInstancesDataSource"}}}},{"reference":"ApplicationsDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"reference":"ServiceComponentInstancesDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@Data2TableDataSource","reference":"FileComponentInstancesDataSource","params":{"table":"fileComponentInstances","schema":[{"component":"data2-core-types@Field","params":{"key":"component","title":"Component","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"system","title":"System","component":"data2-core-primitives@ObjectId"}},{"component":"data2-core-types@Field","params":{"key":"displayName","title":"Display Name","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"params","title":"Params","component":"data2-core-primitives@Object"}},{"component":"data2-core-types@Field","params":{"key":"reference","title":"Reference","component":"data2-core-primitives@String"}}]}},{"component":"data2-core@MemoryDataSource","reference":"EmptyDataSource","params":{"initialData":[]}},{"reference":"ComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"UserComponentsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"DataComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ServiceComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ExternalComponentInstancesDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}},{"reference":"ApplicationsDataSet","component":"data2-core@DataSet","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"EmptyDataSource"}}}}],"processesParams":{}},"HostApplicationLayer":{"reference":"HostApplicationLayer","availableInstances":[{"_id":"5f15ff190528b92601890f71","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"SystemsTableDataSource"}},"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"domain"}}},"pk":"_id","fields":[{"component":"data2-core-types@FieldReference","params":{"key":"_id"}},{"component":"data2-core-types@FieldReference","params":{"key":"name"}},{"component":"data2-core-types@FieldReference","params":{"key":"domain"}},{"component":"data2-core-types@FieldReference","params":{"key":"visibility"}},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization._id"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.name"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.billingStatus"}}},"break":true},{"component":"data2-core-types@FieldReference","params":{"key":{"component":"data2-core-primitives@String","params":{"content":"organization.publicTrial.active"}}},"break":true}],"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"staticPagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}},"policies":[{"component":"data2-core-auth@Policy","params":{"allow":{"params":{"actions":[{"params":{"components":[{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"_id"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"domain"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"},{"params":{"query":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"$params.query"}}}},"field":{"component":"data2-core-primitives@String","params":{"content":"customDomains"}},"fieldType":"string"},"component":"data2@7KkQq0vK4a7D2gg6IVJT7"}]},"component":"data2-core-logical-operators@Or"}]},"component":"data2-core-flow@Series"}}}]},"reference":"SystemsDataSet","updatedAt":"2025-11-05T19:23:47.135Z","createdAt":"2020-07-20T20:31:21.838Z"},{"_id":"5f1601ce0528b92601890f7c","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":1000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"sort":{"params.package":1,"params.component":1},"pk":"_id","autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"staticFilter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}},"filter":{"system":{"exists":{"params":{"content":false},"component":"data2-core-primitives@Boolean"}}}},"reference":"ComponentsDataSet","updatedAt":"2025-11-05T19:37:01.935Z","createdAt":"2020-07-20T20:42:54.898Z"},{"_id":"5f9041dbc8da12be8b94aea4","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":2000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentsTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"UserComponentsDataSet","updatedAt":"2025-11-06T21:06:58.095Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"65d8c4fabc9dbb8f94de8d53","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ExternalComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ExternalComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:23.742Z","createdAt":"2024-02-23T16:17:01.816Z"},{"reference":"SystemsTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6703e667c79312c9dc8d4bee","name":"Vinicius Yatsuda","domain":"vinicius-playground","visibility":"public","updatedAt":"2024-09-27T12:56:41.025Z","createdAt":"2024-09-27T12:56:41.025Z"}]}},{"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":"6a46a48bb0a857d0aa5e5291","component":"data2-core-types@Component","system":"6703e667c79312c9dc8d4bee","params":{"extends":"data2-core-primitives@Block","component":"mtgDeckDetail","package":"vinicius-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":"function debounce(fn, ms){\n  let t\n  return (...args) => { clearTimeout(t); t = setTimeout(()=>fn(...args), ms) }\n}\n\nfunction escapeHtml(s){ return (s==null?'':String(s)).replace(/[&<>\"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c])) }\n\nconst CATEGORIES = ['Mainboard','Sideboard','Commander']\nconst TYPE_ORDER = ['Creatures','Planeswalkers','Instants','Sorceries','Artifacts','Enchantments','Battles','Lands','Outros']\n\nfunction cardType(typeLine){\n  const t = (typeLine || '').toLowerCase()\n  if (t.includes('creature')) return 'Creatures'\n  if (t.includes('planeswalker')) return 'Planeswalkers'\n  if (t.includes('instant')) return 'Instants'\n  if (t.includes('sorcery')) return 'Sorceries'\n  if (t.includes('artifact')) return 'Artifacts'\n  if (t.includes('enchantment')) return 'Enchantments'\n  if (t.includes('battle')) return 'Battles'\n  if (t.includes('land')) return 'Lands'\n  return 'Outros'\n}\n\nfunction manaHtml(cost){\n  if (!cost) return ''\n  const syms = cost.match(/\\{[^}]+\\}/g) || []\n  return syms.map(s => {\n    const code = s.slice(1, -1).replace(/\\//g, '')\n    return `<img class=\"ms\" src=\"https://svgs.scryfall.io/card-symbols/${code}.svg\" alt=\"${escapeHtml(s)}\" onerror=\"this.style.display='none'\"/>`\n  }).join('')\n}\n\nfunction crowHtml(r, c){\n  return `<div class=\"crow${r.owned ? ' owned' : ''}\" data-key=\"${r._id}\" data-img=\"${escapeHtml(c.imageUrl || '')}\">\n    <input type=\"checkbox\" class=\"own-check\" data-id=\"${r._id}\" ${r.owned ? 'checked' : ''} title=\"Já tenho essa carta\"/>\n    <span class=\"q\">${r.quantity}</span>\n    <span class=\"cn\" title=\"${escapeHtml(c.name || '')}\">${escapeHtml(c.name || 'Carta desconhecida')}</span>\n    <span class=\"mc\">${manaHtml(c.manaCost)}</span>\n    <span class=\"tools\">\n      <button class=\"dec\" data-id=\"${r._id}\" title=\"Menos\">−</button>\n      <button class=\"inc\" data-id=\"${r._id}\" title=\"Mais\">+</button>\n      <button class=\"rm\" data-id=\"${r._id}\" title=\"Remover\">✕</button>\n    </span>\n  </div>`\n}\n\nfunction getDeckId(d2){\n  try { const p = d2.router('mtgRouter').params; if (p && p.id) return p.id } catch(e){}\n  try { const p = d2.process('mtgRouterInterface').get('routeParams'); if (p && p.id) return p.id } catch(e){}\n  const path = (typeof location !== 'undefined' && location.pathname) ? location.pathname : ''\n  const parts = path.split('/').filter(Boolean)\n  const i = parts.indexOf('deck')\n  return (i >= 0 && parts[i+1]) ? decodeURIComponent(parts[i+1]) : null\n}\n\nasync function scryfall(d2, url){\n  try {\n    const r = await fetch(url)\n    if (r.ok) return await r.json()\n  } catch(e){}\n  try {\n    const res = await d2.http(d2.params.httpClient).send({ request: 'mtgScryfallGet', requestParameters: { url } })\n    return (res && res.data) ? res.data : res\n  } catch(e){}\n  return null\n}\n\nfunction cardFromScryfall(body){\n  return {\n    scryfallId: body.id,\n    name: body.name,\n    manaCost: body.mana_cost || '',\n    typeLine: body.type_line || '',\n    colors: body.colors || [],\n    imageUrl: (body.image_uris && body.image_uris.normal) || (body.card_faces && body.card_faces[0] && body.card_faces[0].image_uris && body.card_faces[0].image_uris.normal) || '',\n    setCode: body.set || '',\n    setName: body.set_name || '',\n    rarity: body.rarity || '',\n  }\n}\n\nasync function importList(d2){\n  const deckId = getDeckId(d2)\n  if (!deckId || d2.state.bulkBusy) return\n  const lines = (d2.state.bulkText || '').split('\\n').map(l => l.trim()).filter(Boolean)\n  if (!lines.length) return\n  const category = d2.state.category || 'Mainboard'\n  const cardsDs = d2.data('cards')\n  const dcDs = d2.data('deckCards')\n  let added = 0\n  const failed = []\n  d2.state.bulkBusy = true\n  d2.state.bulkResults = { added: 0, failed: [], processed: 0, total: lines.length }\n  for (let idx = 0; idx < lines.length; idx++) {\n    const line = lines[idx]\n    const m = line.match(/^(\\d+)\\s*[xX]?\\s+(.+)$/)\n    const qty = m ? Math.max(1, parseInt(m[1], 10) || 1) : 1\n    let name = (m ? m[2] : line).trim()\n    name = name.replace(/\\s*\\(.*?\\).*$/, '').trim()\n    try {\n      const body = await scryfall(d2, `https://api.scryfall.com/cards/named?fuzzy=${encodeURIComponent(name)}`)\n      if (!body || !body.id) {\n        failed.push(name)\n      } else {\n        const card = cardFromScryfall(body)\n        let cardId\n        const existing = cardsDs.records().find(c => c.scryfallId === card.scryfallId)\n        if (existing) cardId = existing._id\n        else { const created = await cardsDs.create(card); cardId = created && created._id }\n        await dcDs.create({ deckId, cardId, quantity: qty, category, owned: false })\n        added++\n      }\n    } catch (e) {\n      failed.push(name)\n    }\n    d2.state.bulkResults = { added, failed: [...failed], processed: idx + 1, total: lines.length }\n    await new Promise(r => setTimeout(r, 120))\n  }\n  d2.state.bulkBusy = false\n  d2.state.bulkText = ''\n  d2.state.bulkResults = { added, failed: [...failed], processed: lines.length, total: lines.length }\n}\n\nfunction navTo(d2, path){\n  const log = []\n  let r = null\n  try { r = d2.router('mtgRouter') } catch(e){ log.push('r1:'+e.message) }\n  if (!r) { try { r = d2.router() } catch(e){ log.push('r2:'+e.message) } }\n  try {\n    if (r && r.goTo) { r.goTo(path) } else { log.push('sem-handle-router') }\n  } catch(e){ log.push('goTo:'+e.message) }\n  setTimeout(() => {\n    if (location.pathname === path) return\n    try {\n      const p = d2.process('mtgRouterInterface')\n      if (p && p.get) { p.get('history').push(path) } else { log.push('sem-process') }\n    } catch(e){ log.push('proc:'+e.message) }\n    setTimeout(() => {\n      if (location.pathname === path) return\n      log.push('url-continua:'+location.pathname)\n      try { d2.dialog.alert('Navegação falhou → ' + path + ' | ' + log.join(' | ')) } catch(e){}\n    }, 150)\n  }, 150)\n}\n\nexport default {\n  css: `\n    .shell{height:100%;display:flex;flex-direction:column;box-sizing:border-box;font:14px/1.4 -apple-system,Segoe UI,sans-serif;background:#0f1115;color:#eaeaea}\n    .header{padding:20px 32px;border-bottom:1px solid #2a2e38;display:flex;align-items:center;gap:16px;flex-wrap:wrap}\n    .back{background:transparent;border:1px solid #2a2e38;color:#c7c9d1;border-radius:8px;padding:8px 14px;cursor:pointer;font-size:13px}\n    .back:hover{border-color:#7c4dff;color:#fff}\n    .deck-name{font-size:22px;font-weight:800;margin:0}\n    .deck-meta{color:#9aa0ab;font-size:12.5px;display:flex;gap:10px;align-items:center}\n    .badge{background:#2a2e38;color:#c7c9d1;font-size:11px;font-weight:700;text-transform:uppercase;border-radius:999px;padding:3px 10px}\n    .spacer{flex:1}\n    .del-deck{background:transparent;border:1px solid #4a2530;color:#ef4444;border-radius:8px;padding:8px 14px;cursor:pointer;font-size:13px}\n    .del-deck:hover{background:#2a1418}\n    .toggle-add{background:transparent;border:1px solid #2a2e38;color:#c7c9d1;border-radius:8px;padding:8px 14px;cursor:pointer;font-size:13px}\n    .toggle-add:hover{border-color:#7c4dff;color:#fff}\n    .add-hidden .search,.add-hidden .bulk{display:none}\n\n    .search{padding:18px 32px;border-bottom:1px solid #2a2e38;display:flex;gap:10px;align-items:flex-start;flex-wrap:wrap;position:relative}\n    .search-box{position:relative;flex:1;min-width:260px}\n    .search input{width:100%;box-sizing:border-box;background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:10px 12px;color:#eaeaea;font-size:14px}\n    .suggestions{position:absolute;top:calc(100% + 4px);left:0;right:0;background:#1a1d24;border:1px solid #2a2e38;border-radius:10px;max-height:260px;overflow:auto;z-index:20;box-shadow:0 12px 32px rgba(0,0,0,.4)}\n    .sug-item{padding:9px 12px;cursor:pointer;font-size:13.5px}\n    .sug-item:hover{background:#2a2e38}\n    .preview{display:flex;gap:10px;align-items:center;background:#12141a;border:1px solid #2a2e38;border-radius:10px;padding:8px 10px;width:100%;box-sizing:border-box}\n    .preview img{width:36px;height:50px;object-fit:cover;border-radius:4px;background:#2a2e38}\n    .preview .pname{font-weight:700;font-size:13px}\n    .preview .pmeta{color:#9aa0ab;font-size:11.5px}\n    .qty{width:64px}\n    .cat select,.qty input{background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:10px 10px;color:#eaeaea;font-size:14px}\n    .add-btn{background:#7c4dff;color:#fff;border:0;border-radius:8px;padding:10px 18px;font-weight:700;cursor:pointer}\n    .add-btn:disabled{opacity:.4;cursor:default}\n    .hint{color:#9aa0ab;font-size:12px;width:100%}\n    .sec-title{width:100%;font-weight:800;font-size:15px;margin-bottom:2px;color:#eaeaea;display:flex;align-items:center;gap:8px}\n    .bulk-toggle{background:transparent;border:1px solid #2a2e38;color:#c7c9d1;border-radius:8px;padding:6px 12px;cursor:pointer;font-size:12.5px}\n    .bulk-toggle:hover{border-color:#7c4dff;color:#fff}\n    .bulk{padding:0 32px 18px;display:flex;flex-direction:column;gap:10px;border-bottom:1px solid #2a2e38}\n    .bulk-text{width:100%;box-sizing:border-box;min-height:130px;background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:12px;color:#eaeaea;font:13px/1.5 ui-monospace,Menlo,monospace;resize:vertical}\n    .bulk-actions{display:flex;align-items:center;gap:12px}\n    .bulk-cat-label{color:#9aa0ab;font-size:12.5px}\n    .bulk-import{background:#22c55e;color:#06240f;border:0;border-radius:8px;padding:10px 18px;font-weight:700;cursor:pointer}\n    .bulk-import:disabled{opacity:.5;cursor:default}\n    .bulk-result{font-size:13px;color:#eaeaea;background:#171a21;border-radius:8px;padding:10px 12px}\n\n    .deck-body{flex:1;overflow:auto;display:flex;gap:28px;padding:20px 32px 48px;align-items:flex-start}\n    .cmd-panel{flex:0 0 262px;position:sticky;top:0;display:flex;flex-direction:column;gap:12px}\n    .cmd-img{width:100%;border-radius:14px;display:block;box-shadow:0 8px 24px rgba(0,0,0,.4)}\n    .cmd-empty{width:100%;aspect-ratio:5 / 7;border:1px dashed #2a2e38;border-radius:14px;display:flex;align-items:center;justify-content:center;text-align:center;color:#9aa0ab;font-size:12.5px;padding:14px;box-sizing:border-box}\n    .cmd-stats{background:#1a1d24;border:1px solid #2a2e38;border-radius:10px;padding:12px 14px;font-size:13px;color:#c7c9d1;display:flex;flex-direction:column;gap:5px}\n    .cmd-stats b{color:#eaeaea}\n    .add-panel{background:#1a1d24;border:1px solid #2a2e38;border-radius:12px;padding:12px;display:flex;flex-direction:column;gap:8px}\n    .add-panel .ap-title{font-weight:800;font-size:13px;color:#eaeaea}\n    .add-panel .search-box input,.add-panel .row2 input,.add-panel .row2 select{width:100%;box-sizing:border-box;background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:8px 10px;color:#eaeaea;font-size:13px}\n    .add-panel .row2{display:flex;gap:8px}\n    .add-panel .row2 .qty{width:66px;flex:none}\n    .add-panel .row2 select{flex:1}\n    .add-panel .add-btn{width:100%;padding:9px}\n    .add-panel .bulk-toggle{width:100%;text-align:center}\n    .add-panel .bulk-text{width:100%;box-sizing:border-box;min-height:104px;background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:10px;color:#eaeaea;font:12px/1.5 ui-monospace,Menlo,monospace;resize:vertical}\n    .add-panel .bulk-import{width:100%;background:#22c55e;color:#06240f;border:0;border-radius:8px;padding:9px;font-weight:700;cursor:pointer;font-size:13px}\n    .add-panel .bulk-import:disabled{opacity:.5;cursor:default}\n    .add-panel .bulk-result{font-size:12px;color:#eaeaea;background:#171a21;border-radius:8px;padding:8px 10px}\n    .type-cols{flex:1;column-width:250px;column-gap:30px}\n    .type-group{break-inside:avoid;margin:0 0 22px}\n    .type-group h4{font-size:12.5px;font-weight:800;color:#c7c9d1;margin:0 0 6px;border-bottom:1px solid #2a2e38;padding-bottom:6px;display:flex;gap:6px;align-items:center;text-transform:uppercase;letter-spacing:.03em}\n    .type-group h4 span{color:#9aa0ab;font-weight:600}\n    .type-group.commander-zone{border:1px solid #5a4a1a;background:linear-gradient(180deg,rgba(184,134,11,.14),rgba(184,134,11,.03));border-radius:12px;padding:10px 12px}\n    .type-group.commander-zone h4{color:#e8c766;border-color:#5a4a1a}\n    .crow{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:6px}\n    .crow:hover{background:#171a21}\n    .crow .own-check{appearance:none;-webkit-appearance:none;width:18px;height:18px;flex-shrink:0;cursor:pointer;margin:0;border:1.5px solid #3a3f4b;border-radius:6px;background:#12141a;position:relative;transition:background .12s,border-color .12s}\n    .crow .own-check:hover{border-color:#22c55e}\n    .crow .own-check:checked{background:#22c55e;border-color:#22c55e}\n    .crow .own-check:checked::after{content:'';position:absolute;left:5px;top:1.5px;width:5px;height:9px;border:solid #06240f;border-width:0 2px 2px 0;transform:rotate(45deg)}\n    .crow .q{color:#9aa0ab;min-width:16px;text-align:right;font-size:13px}\n    .crow .cn{flex:1;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n    .crow .mc{display:flex;align-items:center;flex-shrink:0}\n    .crow.owned{opacity:.5}\n    .crow.owned .cn{text-decoration:line-through}\n    .crow .tools{display:none;gap:3px;align-items:center;flex-shrink:0}\n    .crow:hover .tools{display:flex}\n    .crow .tools button{width:20px;height:20px;border-radius:5px;border:1px solid #2a2e38;background:#12141a;color:#eaeaea;cursor:pointer;line-height:1;font-size:12px;padding:0}\n    .crow .tools .rm{color:#ef4444;border-color:#3a2226}\n    .ms{width:14px;height:14px;vertical-align:middle;margin-left:1px}\n    .empty{color:#9aa0ab;padding:30px;text-align:center;border:1px dashed #2a2e38;border-radius:12px;width:100%}\n  `,\n  render(d2){\n    const deckId = getDeckId(d2)\n    const decks = d2.data('decks')\n    const cards = d2.data('cards')\n    const dc = d2.data('deckCards')\n    if (decks.loading || cards.loading || dc.loading) return `<div class=\"shell\"><div class=\"header\">Carregando…</div></div>`\n    const deck = decks.records().find(r => String(r._id) === String(deckId))\n    if (!deck) return `<div class=\"shell\"><div class=\"header\"><button class=\"back\">← Voltar</button></div><div class=\"deck-body\"><div class=\"empty\">Deck não encontrado.</div></div></div>`\n\n    const myRows = dc.records().filter(r => String(r.deckId) === String(deckId))\n    const cardById = {}\n    cards.records().forEach(c => { cardById[String(c._id)] = c })\n    const totalCopies = myRows.reduce((s, r) => s + (Number(r.quantity) || 0), 0)\n    const ownedUnique = myRows.filter(r => r.owned).length\n    const addOpen = d2.state.addOpen !== false\n    const nameOf = (r) => (cardById[String(r.cardId)] || {}).name || ''\n    const sortByName = (a, b) => nameOf(a).localeCompare(nameOf(b))\n\n    const suggestions = d2.state.suggestions || []\n    const sel = d2.state.selectedCard\n    const previewHtml = sel ? `\n      <div class=\"preview\">\n        ${sel.imageUrl ? `<img src=\"${sel.imageUrl}\" alt=\"\"/>` : ''}\n        <div><div class=\"pname\">${escapeHtml(sel.name)}</div><div class=\"pmeta\">${escapeHtml(sel.manaCost||'')} · ${escapeHtml(sel.typeLine||'')}</div></div>\n      </div>` : ''\n\n    const cmdRows = myRows.filter(r => (r.category || 'Mainboard') === 'Commander')\n    const cmdCards = cmdRows.map(r => cardById[String(r.cardId)]).filter(Boolean)\n    const nonCmd = myRows.filter(r => (r.category || 'Mainboard') !== 'Commander')\n\n    const byType = {}\n    nonCmd.forEach(r => {\n      const c = cardById[String(r.cardId)] || {}\n      const t = cardType(c.typeLine);\n      (byType[t] = byType[t] || []).push(r)\n    })\n\n    const cmdGroupHtml = cmdRows.length ? `<div class=\"type-group commander-zone\">\n      <h4>👑 Commander <span>(${cmdRows.reduce((s,r)=>s+(Number(r.quantity)||0),0)})</span></h4>\n      ${cmdRows.slice().sort(sortByName).map(r => crowHtml(r, cardById[String(r.cardId)] || {})).join('')}\n    </div>` : ''\n\n    const typeColsHtml = TYPE_ORDER.filter(t => byType[t] && byType[t].length).map(t => {\n      const items = byType[t].slice().sort(sortByName)\n      const sub = items.reduce((s, r) => s + (Number(r.quantity) || 0), 0)\n      return `<div class=\"type-group\">\n        <h4>${t} <span>(${sub})</span></h4>\n        ${items.map(r => crowHtml(r, cardById[String(r.cardId)] || {})).join('')}\n      </div>`\n    }).join('')\n\n    const addPanelHtml = addOpen ? `<div class=\"add-panel\">\n      <div class=\"ap-title\">➕ Adicionar cartas</div>\n      <div class=\"search-box\">\n        <input data-role=\"query\" placeholder=\"Buscar no Scryfall…\" value=\"${escapeHtml(d2.state.query || '')}\" autocomplete=\"off\"/>\n        ${suggestions.length ? `<div class=\"suggestions\">${suggestions.map(name =>\n          `<div class=\"sug-item\" data-name=\"${escapeHtml(name)}\">${escapeHtml(name)}</div>`).join('')}</div>` : ''}\n      </div>\n      ${previewHtml}\n      <div class=\"row2\">\n        <input class=\"qty\" data-role=\"qty\" type=\"number\" min=\"1\" value=\"${d2.state.qty || 1}\"/>\n        <select data-role=\"category\">\n          ${CATEGORIES.map(c => `<option value=\"${c}\" ${d2.state.category===c?'selected':''}>${c}</option>`).join('')}\n        </select>\n      </div>\n      <button class=\"add-btn\" ${sel ? '' : 'disabled'}>${d2.state.adding ? 'Adicionando…' : 'Adicionar'}</button>\n      <button class=\"bulk-toggle\">${d2.state.showBulk ? '✕ Fechar lista em massa' : '📋 Colar lista em massa'}</button>\n      ${d2.state.showBulk ? `<textarea class=\"bulk-text\" placeholder=\"Uma carta por linha, ex:&#10;1 Sol Ring&#10;1 Arcane Signet\">${escapeHtml(d2.state.bulkText || '')}</textarea>\n      <button class=\"bulk-import\" ${d2.state.bulkBusy ? 'disabled' : ''}>${d2.state.bulkBusy ? 'Importando…' : 'Importar lista'}</button>\n      ${d2.state.bulkResults ? `<div class=\"bulk-result\">✓ ${d2.state.bulkResults.added} add.${(d2.state.bulkResults.failed && d2.state.bulkResults.failed.length) ? ' · ✕ ' + escapeHtml(d2.state.bulkResults.failed.join(', ')) : ''}${d2.state.bulkBusy ? ' (' + (d2.state.bulkResults.processed || 0) + '/' + (d2.state.bulkResults.total || 0) + ')' : ''}</div>` : ''}` : ''}\n    </div>` : ''\n\n    const cmdPanelHtml = `<div class=\"cmd-panel\">\n      ${cmdCards.length ? cmdCards.map(c => c.imageUrl ? `<img class=\"cmd-img\" src=\"${c.imageUrl}\" alt=\"${escapeHtml(c.name)}\"/>` : '').join('') : `<div class=\"cmd-empty\">Sem comandante definido.<br>Adicione uma carta na categoria <b>Commander</b>.</div>`}\n      <div class=\"cmd-stats\">\n        <div><b>${myRows.length}</b> cartas únicas</div>\n        <div><b>${totalCopies}</b> cópias no total</div>\n        <div>✓ <b>${ownedUnique}</b>/${myRows.length} já tenho</div>\n      </div>\n      ${addPanelHtml}\n    </div>`\n\n    return `<div class=\"shell${addOpen ? '' : ' add-hidden'}\">\n      <div class=\"header\">\n        <button class=\"back\">← Voltar</button>\n        <div>\n          <h2 class=\"deck-name\">${escapeHtml(deck.name)}</h2>\n          <div class=\"deck-meta\"><span class=\"badge\">${escapeHtml(deck.format || '—')}</span><span>${myRows.length} cartas únicas · ${totalCopies} cópias · ✓ ${ownedUnique}/${myRows.length} já tenho</span></div>\n        </div>\n        <div class=\"spacer\"></div>\n        <button class=\"toggle-add\">${addOpen ? '▲ Ocultar adicionar' : '➕ Adicionar cartas'}</button>\n        <button class=\"del-deck\">Excluir deck</button>\n      </div>\n\n      <div class=\"deck-body\">\n        ${cmdPanelHtml}\n        <div class=\"type-cols\">\n          ${myRows.length ? (cmdGroupHtml + typeColsHtml) : `<div class=\"empty\">Nenhuma carta neste deck ainda. Busque acima ou cole uma lista para adicionar.</div>`}\n        </div>\n      </div>\n    </div>`\n  },\n  mounted(d2){\n    let prev = null, pimg = null\n    try {\n      prev = document.createElement('div')\n      prev.style.cssText = 'position:fixed;z-index:99999;pointer-events:none;display:none;left:0;top:0'\n      pimg = document.createElement('img')\n      pimg.style.cssText = 'width:244px;border-radius:12px;box-shadow:0 16px 48px rgba(0,0,0,.7);display:block;background:#1a1d24'\n      prev.appendChild(pimg)\n      document.body.appendChild(prev)\n      d2.onUnmount(() => { try { prev.remove() } catch(e){} })\n    } catch (e) { prev = null }\n    const hidePrev = () => { if (prev) prev.style.display = 'none' }\n    d2.on('.crow', 'mousemove', (e, el) => {\n      if (!prev) return\n      const src = (el && el.dataset) ? el.dataset.img : ''\n      if (!src) { hidePrev(); return }\n      if (pimg.getAttribute('src') !== src) pimg.setAttribute('src', src)\n      prev.style.display = 'block'\n      const pad = 20, pw = 244, ph = 342\n      let x = e.clientX + pad, y = e.clientY + pad\n      if (x + pw > window.innerWidth) x = e.clientX - pw - pad\n      if (y + ph > window.innerHeight) y = window.innerHeight - ph - 8\n      if (y < 8) y = 8\n      prev.style.left = x + 'px'\n      prev.style.top = y + 'px'\n    })\n    d2.on('.crow', 'mouseout', (e) => {\n      const to = e.relatedTarget\n      if (!to || !to.closest || !to.closest('.crow')) hidePrev()\n    })\n\n    const runSearch = debounce(async (text) => {\n      if (!text || text.trim().length < 2) { d2.state.suggestions = []; return }\n      try {\n        const url = `https://api.scryfall.com/cards/autocomplete?q=${encodeURIComponent(text.trim())}`\n        const body = await scryfall(d2, url)\n        d2.state.suggestions = (body && body.data) ? body.data.slice(0, 10) : []\n      } catch (err) {\n        d2.state.suggestions = []\n      }\n    }, 300)\n\n    d2.on('[data-role=\"query\"]', 'input', (e, el) => {\n      d2.state.query = el.value\n      d2.state.selectedCard = null\n      runSearch(el.value)\n    })\n\n    d2.on('.sug-item', 'click', async (e, el) => {\n      const name = el.dataset.name\n      d2.state.query = name\n      d2.state.suggestions = []\n      d2.state.selectedCard = null\n      try {\n        const url = `https://api.scryfall.com/cards/named?exact=${encodeURIComponent(name)}`\n        const body = await scryfall(d2, url)\n        if (body && body.id) { d2.state.selectedCard = cardFromScryfall(body) }\n      } catch (err) {\n        d2.state.selectedCard = null\n      }\n    })\n\n    d2.on('[data-role=\"qty\"]', 'input', (e, el) => { d2.state.qty = Math.max(1, parseInt(el.value, 10) || 1) })\n    d2.on('[data-role=\"category\"]', 'change', (e, el) => { d2.state.category = el.value })\n    d2.on('.bulk-toggle', 'click', () => { d2.state.showBulk = !d2.state.showBulk })\n    d2.on('.bulk-text', 'input', (e, el) => { d2.state.bulkText = el.value })\n    d2.on('.bulk-import', 'click', () => importList(d2))\n    d2.on('.toggle-add', 'click', () => { d2.state.addOpen = d2.state.addOpen === false ? true : false })\n\n    d2.on('.add-btn', 'click', async () => {\n      const sel = d2.state.selectedCard\n      const deckId = getDeckId(d2)\n      if (!sel || !deckId || d2.state.adding) return\n      d2.state.adding = true\n      try {\n        const cardsDs = d2.data('cards')\n        const existing = cardsDs.records().find(c => c.scryfallId === sel.scryfallId)\n        let cardId\n        if (existing) { cardId = existing._id }\n        else { const created = await cardsDs.create(sel); cardId = created && created._id }\n        await d2.data('deckCards').create({\n          deckId,\n          cardId,\n          quantity: d2.state.qty || 1,\n          category: d2.state.category || 'Mainboard',\n          owned: false,\n        })\n        d2.state.query = ''\n        d2.state.selectedCard = null\n        d2.state.suggestions = []\n        d2.state.qty = 1\n      } finally {\n        d2.state.adding = false\n      }\n    })\n\n    d2.on('.inc', 'click', async (e, el) => {\n      const dc = d2.data('deckCards')\n      const rec = dc.records().find(r => String(r._id) === String(el.dataset.id))\n      if (rec) await dc.update({ ...rec, quantity: (Number(rec.quantity) || 0) + 1 })\n    })\n    d2.on('.dec', 'click', async (e, el) => {\n      const dc = d2.data('deckCards')\n      const rec = dc.records().find(r => String(r._id) === String(el.dataset.id))\n      if (rec && Number(rec.quantity) > 1) await dc.update({ ...rec, quantity: Number(rec.quantity) - 1 })\n    })\n    d2.on('.rm', 'click', async (e, el) => { await d2.data('deckCards').remove(el.dataset.id) })\n    d2.on('.own-check', 'change', async (e, el) => {\n      const dc = d2.data('deckCards')\n      const rec = dc.records().find(r => String(r._id) === String(el.dataset.id))\n      if (rec) await dc.update({ ...rec, owned: el.checked })\n    })\n\n    d2.on('.back', 'click', () => { navTo(d2, '/') })\n    d2.on('.del-deck', 'click', async () => {\n      const ok = await d2.dialog.confirm('Excluir este deck e todas as cartas associadas?')\n      if (!ok) return\n      const deckId = getDeckId(d2)\n      const dc = d2.data('deckCards')\n      const toRemove = dc.records().filter(r => String(r.deckId) === String(deckId))\n      await Promise.all(toRemove.map(r => dc.remove(r._id)))\n      await d2.data('decks').remove(deckId)\n      navTo(d2, '/')\n    })\n  },\n}"}},"decks":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"decks"}}}},"cards":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"cards"}}}},"deckCards":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"deckCards"}}}},"httpClient":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"httpClient"}}}}}}}}}},{"_id":"6a46a488d17c9b3315acd5df","component":"data2-core-types@Component","system":"6703e667c79312c9dc8d4bee","params":{"extends":"data2-core-primitives@Block","component":"mtgDeckList","package":"vinicius-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":"function escapeHtml(s){ return (s==null?'':String(s)).replace(/[&<>\"]/g, c => ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c])) }\n\nfunction pipsHtml(colors){\n  const cs = (colors && colors.length) ? colors : ['C']\n  return `<span class=\"pips\">${cs.map(c => `<img src=\"https://svgs.scryfall.io/card-symbols/${c}.svg\" alt=\"${c}\" onerror=\"this.style.display='none'\"/>`).join('')}</span>`\n}\n\nfunction navTo(d2, path){\n  const log = []\n  let r = null\n  try { r = d2.router('mtgRouter') } catch(e){ log.push('r1:'+e.message) }\n  if (!r) { try { r = d2.router() } catch(e){ log.push('r2:'+e.message) } }\n  try {\n    if (r && r.goTo) { r.goTo(path) } else { log.push('sem-handle-router') }\n  } catch(e){ log.push('goTo:'+e.message) }\n  setTimeout(() => {\n    if (location.pathname === path) return\n    try {\n      const p = d2.process('mtgRouterInterface')\n      if (p && p.get) { p.get('history').push(path) } else { log.push('sem-process') }\n    } catch(e){ log.push('proc:'+e.message) }\n    setTimeout(() => {\n      if (location.pathname === path) return\n      log.push('url-continua:'+location.pathname)\n      try { d2.dialog.alert('Navegação falhou → ' + path + ' | ' + log.join(' | ')) } catch(e){}\n    }, 150)\n  }, 150)\n}\n\nexport default {\n  css: `\n    .wrap{height:100%;overflow:auto;box-sizing:border-box;padding:32px;font:14px/1.4 -apple-system,Segoe UI,sans-serif;background:#0f1115;color:#eaeaea}\n    .top{display:flex;align-items:center;justify-content:space-between;margin-bottom:24px;flex-wrap:wrap;gap:12px}\n    h1{font-size:26px;margin:0;font-weight:800}\n    .new-btn{background:#7c4dff;color:#fff;border:0;border-radius:10px;padding:10px 18px;font-size:14px;font-weight:700;cursor:pointer}\n    .new-btn:hover{background:#6c3ce0}\n    .form{background:#1a1d24;border:1px solid #2a2e38;border-radius:14px;padding:20px;margin-bottom:24px;display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end}\n    .field{display:flex;flex-direction:column;gap:6px;min-width:180px}\n    .field label{font-size:12px;color:#9aa0ab;text-transform:uppercase;letter-spacing:.04em}\n    .field input,.field select,.field textarea{background:#12141a;border:1px solid #2a2e38;border-radius:8px;padding:9px 10px;color:#eaeaea;font-size:14px}\n    .field textarea{min-width:280px;resize:vertical}\n    .actions{display:flex;gap:8px}\n    .save-btn{background:#22c55e;color:#06240f;border:0;border-radius:8px;padding:10px 16px;font-weight:700;cursor:pointer}\n    .cancel-btn{background:transparent;color:#9aa0ab;border:1px solid #2a2e38;border-radius:8px;padding:10px 16px;cursor:pointer}\n    .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:18px}\n    .card{background:#1a1d24;border:1px solid #2a2e38;border-radius:16px;overflow:hidden;cursor:pointer;position:relative;transition:transform .12s,border-color .12s;display:flex;flex-direction:column}\n    .card:hover{border-color:#7c4dff;transform:translateY(-3px)}\n    .card-art{height:132px;background-size:cover;background-position:center 22%;position:relative}\n    .card-art::after{content:'';position:absolute;inset:0;background:linear-gradient(180deg,rgba(15,17,21,0) 20%,rgba(26,29,36,.98) 100%)}\n    .card-noart{height:132px;background:linear-gradient(135deg,#3a2b5a,#12141a);display:flex;align-items:center;justify-content:center;font-size:34px;opacity:.7}\n    .card-body{padding:0 16px 16px;position:relative;margin-top:-40px;z-index:1}\n    .card-body .badge{display:inline-block;background:rgba(20,22,28,.85);color:#c7c9d1;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;border-radius:999px;padding:3px 10px;margin-bottom:8px;backdrop-filter:blur(4px)}\n    .card h3{margin:0 0 4px;font-size:18px;color:#fff;text-shadow:0 2px 10px rgba(0,0,0,.9)}\n    .cmd-name{font-size:12px;color:#c7b9e6;margin-bottom:10px}\n    .desc{color:#9aa0ab;font-size:12.5px;margin:0 0 10px}\n    .card-info{display:flex;flex-wrap:wrap;align-items:center;gap:6px 14px;font-size:12.5px;color:#9aa0ab}\n    .card-info b{color:#eaeaea}\n    .card-info .owned{color:#22c55e}\n    .pips{display:inline-flex;gap:2px;align-items:center;margin-left:auto}\n    .pips img{width:16px;height:16px}\n    .del{position:absolute;top:12px;right:12px;z-index:3;background:rgba(20,22,28,.7);border:0;color:#c7c9d1;font-size:14px;cursor:pointer;line-height:1;padding:5px 7px;border-radius:8px}\n    .del:hover{color:#ef4444;background:rgba(20,22,28,.95)}\n    .empty{color:#9aa0ab;padding:40px;text-align:center;border:1px dashed #2a2e38;border-radius:14px}\n  `,\n  render(d2){\n    const decks = d2.data('decks')\n    const dc = d2.data('deckCards')\n    const cards = d2.data('cards')\n    if (decks.loading) return `<div class=\"wrap\"><p>Carregando…</p></div>`\n    const rows = decks.records()\n    const showForm = !!d2.state.showForm\n\n    const cardById = {}\n    if (!cards.loading) cards.records().forEach(c => { cardById[String(c._id)] = c })\n\n    // Agrega por deck: cópias, únicas, owned, e a carta de commander\n    const agg = {}\n    if (!dc.loading) {\n      dc.records().forEach(r => {\n        const k = String(r.deckId)\n        const a = agg[k] || (agg[k] = { copies: 0, unique: 0, owned: 0, commander: null })\n        a.copies += (Number(r.quantity) || 0)\n        a.unique += 1\n        if (r.owned) a.owned += 1\n        if ((r.category || '') === 'Commander' && !a.commander) a.commander = cardById[String(r.cardId)] || null\n      })\n    }\n\n    const formHtml = showForm ? `\n      <div class=\"form\">\n        <div class=\"field\"><label>Nome do deck</label><input data-role=\"name\" placeholder=\"Ex: Mono Vermelho Aggro\" value=\"${escapeHtml(d2.state.fName||'')}\"/></div>\n        <div class=\"field\">\n          <label>Formato</label>\n          <select data-role=\"format\">\n            ${['Standard','Pioneer','Modern','Legacy','Vintage','Commander','Pauper','Casual'].map(f =>\n              `<option value=\"${f}\" ${d2.state.fFormat===f?'selected':''}>${f}</option>`).join('')}\n          </select>\n        </div>\n        <div class=\"field\"><label>Descrição (opcional)</label><textarea data-role=\"desc\" rows=\"1\">${escapeHtml(d2.state.fDesc||'')}</textarea></div>\n        <div class=\"actions\">\n          <button class=\"save-btn\">Salvar</button>\n          <button class=\"cancel-btn\">Cancelar</button>\n        </div>\n      </div>` : ''\n\n    const cardsHtml = rows.length ? `<div class=\"grid\">${rows.map(r => {\n      const a = agg[String(r._id)] || { copies: 0, unique: 0, owned: 0, commander: null }\n      const cmd = a.commander\n      const art = cmd && cmd.imageUrl ? cmd.imageUrl : ''\n      return `\n        <div class=\"card\" data-key=\"${r._id}\" data-id=\"${r._id}\">\n          <button class=\"del\" data-id=\"${r._id}\" title=\"Excluir deck\">✕</button>\n          ${art ? `<div class=\"card-art\" style=\"background-image:url('${escapeHtml(art)}')\"></div>` : `<div class=\"card-noart\">🃏</div>`}\n          <div class=\"card-body\">\n            <span class=\"badge\">${escapeHtml(r.format||'—')}</span>\n            <h3>${escapeHtml(r.name||'Sem nome')}</h3>\n            ${cmd ? `<div class=\"cmd-name\">👑 ${escapeHtml(cmd.name)}</div>` : ''}\n            ${r.description ? `<div class=\"desc\">${escapeHtml(r.description)}</div>` : ''}\n            <div class=\"card-info\">\n              <span><b>${a.copies}</b> cópias</span>\n              <span><b>${a.unique}</b> únicas</span>\n              <span class=\"owned\">✓ <b>${a.owned}</b>/${a.unique}</span>\n              ${cmd ? pipsHtml(cmd.colors) : ''}\n            </div>\n          </div>\n        </div>`\n    }).join('')}</div>` : `<div class=\"empty\">Nenhum deck ainda. Clique em \"+ Novo Deck\" para começar.</div>`\n\n    return `<div class=\"wrap\">\n      <div class=\"top\">\n        <h1>🃏 Meus Decks de Magic: The Gathering</h1>\n        <button class=\"new-btn\">${showForm ? 'Fechar' : '+ Novo Deck'}</button>\n      </div>\n      ${formHtml}\n      ${cardsHtml}\n    </div>`\n  },\n  mounted(d2){\n    d2.on('.new-btn','click',()=>{ d2.state.showForm = !d2.state.showForm })\n    d2.on('.cancel-btn','click',()=>{ d2.state.showForm = false; d2.state.fName=''; d2.state.fDesc='' })\n    d2.on('[data-role=\"name\"]','input',(e,el)=>{ d2.state.fName = el.value })\n    d2.on('[data-role=\"format\"]','change',(e,el)=>{ d2.state.fFormat = el.value })\n    d2.on('[data-role=\"desc\"]','input',(e,el)=>{ d2.state.fDesc = el.value })\n    d2.on('.save-btn','click', async ()=>{\n      const name = (d2.state.fName||'').trim()\n      if (!name) return\n      await d2.data('decks').create({\n        name,\n        format: d2.state.fFormat || 'Standard',\n        description: d2.state.fDesc || '',\n      })\n      d2.state.showForm = false\n      d2.state.fName = ''\n      d2.state.fDesc = ''\n    })\n    d2.on('.del','click', async (e, el) => {\n      const id = el.dataset.id\n      const ok = await d2.dialog.confirm('Excluir este deck e todas as cartas associadas?')\n      if (!ok) return\n      const dc = d2.data('deckCards')\n      const toRemove = dc.records().filter(r => String(r.deckId) === String(id))\n      await Promise.all(toRemove.map(r => dc.remove(r._id)))\n      await d2.data('decks').remove(id)\n    })\n    d2.on('.card','click',(e, el)=>{\n      if (e.target.closest('.del')) return\n      navTo(d2, `/deck/${el.dataset.id}`)\n    })\n  },\n}"}},"decks":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"decks"}}}},"cards":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"cards"}}}},"deckCards":{"component":"data2-core-types@Reference","params":{"reference":{"component":"data2-core-primitives@String","params":{"content":"deckCards"}}}}}}}}}},{"_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}}},"reference":"Data2BuilderAuthentication","updatedAt":"2025-10-28T02:48:49.233Z"},{"_id":"5f060ee51ca96def42f3fbd1","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"UsersTableDataSource"}},"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":1}}}},"reference":"UsersDataSet","updatedAt":"2026-03-04T21:16:40.291Z"},{"_id":"68f938cf5fb002e33752a43d","displayName":"InternalApplicationsAuthenticationStrategy","component":"data2-core@AuthenticationStrategy","system":"5e3b796d6228227ca637d0f4","params":{"resetPassword":{"resetEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}},"resetSuccessEmail":{"artboard":{"params":{"preventEvaluation":true},"component":"data2-core-types@ArtboardReference"}}},"verifier":{"disabled":false,"component":"data2-core-types@DataSetReference","params":{"reference":"InternalApplicationsVerifierDataSet"}},"password":{"disabled":false,"component":"data2-core-types@DataSetColumnReference","params":{"column":"secret"}},"credentials":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}],"session":[{"component":"data2-core-types@FieldReference","params":{"key":"application"}},{"component":"data2-core-types@FieldReference","params":{"key":"secret"}},{"component":"data2-core-types@FieldReference","params":{"key":"status"}}]},"reference":"InternalApplicationsAuthenticationStrategy","updatedAt":"2025-10-22T20:08:54.442Z","createdAt":"2025-10-22T20:04:31.198Z"},{"component":"data2-core@DataSet","reference":"SessionsDataSet","params":{"requiresConfirmation":false,"pk":"key","datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"data2sessionsdatasource"}}}},{"reference":"UsersTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}},{"component":"data2-core@ServerSessionsDataSource","reference":"data2sessionsdatasource","params":{}},{"_id":"5f1600b70528b92601890f75","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ServiceComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ServiceComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:20.208Z","createdAt":"2020-07-20T20:38:15.436Z"},{"_id":"5f1602190528b92601890f7d","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":40000},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ComponentInstancesTableDataSource"}},"sort":{"_id":1},"pk":"_id","autoEdit":true,"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"ComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:07.089Z","createdAt":"2020-07-20T20:44:09.350Z"},{"_id":"5f16017f0528b92601890f7a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"FileComponentInstancesDataSet","updatedAt":"2023-08-03T16:08:18.193Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"5f1601990528b92601890f7b","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"ApplicationsTableDataSource"}},"pk":"_id","autoEdit":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"master":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"params":{"column":"_id"},"component":"data2-core-types@DataSetColumnReference"}},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"ApplicationsDataSet","updatedAt":"2022-12-13T21:51:13.995Z","createdAt":"2020-07-20T20:42:01.657Z"},{"_id":"5f16172a0528b92601890f85","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"pagination":{"size":{"component":"data2-core-primitives@Number","params":{"content":10000}}},"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"DataComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}},"policies":{"params":{"allowGet":{"component":"data2-core-primitives@Boolean","params":{"content":true}}},"component":"data2@hkXy-UhMjhyfptdE6_fpW"}},"reference":"DataComponentInstancesDataSet","updatedAt":"2025-11-06T21:07:12.831Z","createdAt":"2020-07-20T22:14:02.097Z"},{"_id":"60ddc1bbda3861ca65407c5a","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"domain":{"component":"data2-core-types@Reference","params":{"reference":"clientApplicationDomain"}}},"pagination":{"size":1},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"}},"reference":"OneFileComponentInstancesDataSet","updatedAt":"2022-02-09T19:44:38.036Z","createdAt":"2020-07-20T20:41:35.797Z"},{"_id":"63ee3d38b8c9838c62fb05fb","displayName":"DriveFileComponentInstancesDataSet","component":"data2-core@DataSet","system":"5e3b796d6228227ca637d0f4","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"FileComponentInstancesTableDataSource"}},"pk":"_id","autoEdit":true,"filter":{"component":{"component":"data2-core-primitives@String","params":{"content":"data2-core@Drive"}}},"master":{"params":{"dataset":{"component":"data2-core-types@DataSetReference","params":{"reference":"SystemsDataSet"}},"localField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"system"}},"masterField":{"component":"data2-core-types@DataSetColumnReference","params":{"column":"_id"}}},"component":"data2-core-types@DataSetMaster"},"autoSelect":{"component":"data2-core-primitives@Boolean","params":{"content":false}}},"reference":"DriveFileComponentInstancesDataSet","updatedAt":"2025-12-04T21:58:32.367Z","createdAt":"2023-02-16T14:27:07.797Z"},{"reference":"ServiceComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a46a473bf38d38281504a0e","component":"data2-core-connect@HttpClient","reference":"mtgScryfallApi","system":"6703e667c79312c9dc8d4bee","params":{"baseURL":"https://api.scryfall.com","headers":{}}}]}},{"reference":"ComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a46a4c0fb4b5485eb734be0","component":"data2-core-primitives@Router","system":"6703e667c79312c9dc8d4bee","displayName":"MTG Router","params":{"routerType":{"component":"data2-core-primitives@String","params":{"content":"browser"}},"routes":[{"component":"data2-core-primitives@Route","params":{"path":"","name":"Meus Decks","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"v6DTuiaZmXiVd9w0mZYgq"}}}},{"component":"data2-core-primitives@Route","params":{"path":"/deck/:id","name":"Detalhe do Deck","content":{"component":"data2-core-types@ArtboardReference","params":{"reference":"5p6D0iNvvVNj1RxZAeg2K"}}}}]},"reference":"mtgRouter"},{"_id":"6a46a4761035c335342466a0","component":"data2-core-primitives@Artboard","system":"6703e667c79312c9dc8d4bee","displayName":"MTG - Detalhe do Deck","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"MTG - Detalhe do Deck"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"5p6D0iNvvVNj1RxZAeg2K"},{"_id":"6a46a4758c5c69fa78ee9f47","component":"data2-core-primitives@Artboard","system":"6703e667c79312c9dc8d4bee","displayName":"MTG - Meus Decks","params":{"title":{"component":"data2-core-primitives@String","params":{"content":"MTG - Meus Decks"}},"dimensions":{"component":"data2-core-types@Dimensions","params":{"width":1440,"height":900}},"position":{"component":"data2-core-types@Position","params":{"x":0,"y":0}}},"reference":"v6DTuiaZmXiVd9w0mZYgq"},{"_id":"ff2e4a35d5056555b814a11c","parent":"6a46a4761035c335342466a0","component":"vinicius-playground@mtgDeckDetail","system":"6703e667c79312c9dc8d4bee","displayName":"mtgDeckDetail","params":{"decks":{"component":"data2-core-types@DataSetReference","params":{"reference":"xQcLLrT1UfF_CTAJR3A0VDataSet"}},"cards":{"component":"data2-core-types@DataSetReference","params":{"reference":"VwAuJenOLEjnVhdNFieUnDataSet"}},"deckCards":{"component":"data2-core-types@DataSetReference","params":{"reference":"_GtrrZH9MayYW379Si7RFDataSet"}},"httpClient":{"component":"data2-core-types@InteractiveModuleReference","params":{"reference":"mtgScryfallApi"}},"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":1440,"height":900}}}},"reference":"wO_AVdDlaOY6DCMCHPzRs"},{"_id":"78eceb75c95ea4628ad85785","parent":"6a46a4758c5c69fa78ee9f47","component":"vinicius-playground@mtgDeckList","system":"6703e667c79312c9dc8d4bee","displayName":"mtgDeckList","params":{"decks":{"component":"data2-core-types@DataSetReference","params":{"reference":"xQcLLrT1UfF_CTAJR3A0VDataSet"}},"deckCards":{"component":"data2-core-types@DataSetReference","params":{"reference":"_GtrrZH9MayYW379Si7RFDataSet"}},"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":1440,"height":900}}},"cards":{"component":"data2-core-types@DataSetReference","params":{"reference":"VwAuJenOLEjnVhdNFieUnDataSet"}}},"reference":"PX6mDnpuqhngb4-VusBQK"}]}},{"_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":"6a46a4c7bf38d38281504cf5","displayName":"MTG Deck Manager","reference":"xSXQ7n43rl78y34ZU94Yq","params":{"name":{"component":"data2-core-primitives@String","params":{"content":"MTG Deck Manager"}},"shortName":{"component":"data2-core-primitives@String","params":{"content":"MTG Deck Manager"}},"domain":{"component":"data2-core-primitives@String","params":{"content":"mtg"}},"serverSideRendering":{"component":"data2-core-primitives@Boolean","params":{"content":true}},"entryPoint":{"component":"data2-core-types@ComponentInstanceReference","params":{"component":"data2-core-primitives@Router","reference":"mtgRouter"}},"responseHeaders":{"X-Frame-Options":{"component":"data2-core-primitives@String","params":{"content":""}},"Content-Security-Policy":{"component":"data2-core-primitives@String","params":{"content":""}},"X-XSS-Protection":{"component":"data2-core-primitives@String","params":{"content":""}}}},"system":"6703e667c79312c9dc8d4bee","component":"data2-core-primitives@Application"}]}},{"reference":"DataComponentInstancesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[{"_id":"6a46a4717068a227f9725c7b","component":"data2-core@DataSet","system":"6703e667c79312c9dc8d4bee","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"_GtrrZH9MayYW379Si7RF"}}},"reference":"_GtrrZH9MayYW379Si7RFDataSet"},{"_id":"6a46a47120611373d1fc13c9","component":"data2-core@DataSet","system":"6703e667c79312c9dc8d4bee","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"VwAuJenOLEjnVhdNFieUn"}}},"reference":"VwAuJenOLEjnVhdNFieUnDataSet"},{"_id":"6a46a470bf38d38281504a04","component":"data2-core@DataSet","system":"6703e667c79312c9dc8d4bee","params":{"datasource":{"component":"data2-core-types@DataSourceReference","params":{"reference":"xQcLLrT1UfF_CTAJR3A0V"}}},"reference":"xQcLLrT1UfF_CTAJR3A0VDataSet"},{"_id":"6a46a471bf38d38281504a09","component":"data2-core@Data2TableDataSource","system":"6703e667c79312c9dc8d4bee","params":{"table":"_GtrrZH9MayYW379Si7RF","schema":[{"component":"data2-core-types@Field","params":{"key":"deckId","title":"Deck","component":"data2-core-primitives@ObjectId","required":true}},{"component":"data2-core-types@Field","params":{"key":"cardId","title":"Carta","component":"data2-core-primitives@ObjectId","required":true}},{"component":"data2-core-types@Field","params":{"key":"quantity","title":"Quantidade","component":"data2-core-primitives@Number","required":true}},{"component":"data2-core-types@Field","params":{"key":"category","title":"Categoria","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"owned","title":"Já tenho essa carta","component":"data2-core-primitives@Boolean"}}]},"reference":"_GtrrZH9MayYW379Si7RF"},{"_id":"6a46a471d17c9b3315acd5a5","component":"data2-core@Data2TableDataSource","system":"6703e667c79312c9dc8d4bee","params":{"table":"VwAuJenOLEjnVhdNFieUn","schema":[{"component":"data2-core-types@Field","params":{"key":"scryfallId","title":"Scryfall ID","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"name","title":"Nome","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"manaCost","title":"Custo de Maná","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"typeLine","title":"Tipo","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"colors","title":"Cores","component":"data2-core-primitives@Array"}},{"component":"data2-core-types@Field","params":{"key":"imageUrl","title":"Imagem","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"setCode","title":"Set","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"setName","title":"Nome do Set","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"rarity","title":"Raridade","component":"data2-core-primitives@String"}}]},"reference":"VwAuJenOLEjnVhdNFieUn"},{"_id":"6a46a46fb0a857d0aa5e5240","component":"data2-core@Data2TableDataSource","system":"6703e667c79312c9dc8d4bee","params":{"table":"xQcLLrT1UfF_CTAJR3A0V","schema":[{"component":"data2-core-types@Field","params":{"key":"name","title":"Nome","component":"data2-core-primitives@String","required":true}},{"component":"data2-core-types@Field","params":{"key":"format","title":"Formato","component":"data2-core-primitives@String"}},{"component":"data2-core-types@Field","params":{"key":"description","title":"Descrição","component":"data2-core-primitives@String"}}]},"reference":"xQcLLrT1UfF_CTAJR3A0V"}]}},{"reference":"BundlesTableDataSource","component":"data2-core@MemoryDataSource","params":{"initialData":[]}}],"processesParams":{}}}}