{"api_version":"aci/1","workload_keyset_digest":"sha256:fa47ae4c27d5df35d063dd6e0cbd258b8cff1a83b3b974b66ca7cb9fea2d1ec9","attestation":{"tee_type":"tdx","workload_keyset":{"subject":null,"not_after":1790174801,"receipt_signing_keys":[{"key_id":"dstack-kms-receipt-ed25519-v1","algo":"ed25519","public_key":"110f3824daeeef29dbeba9677a5794ffed257b1082d9fd4599b3c0819953aa0a"}],"e2ee_public_keys":[{"key_id":"dstack-kms-e2ee-v1","algo":"secp256k1-aes-256-gcm-hkdf-sha256","public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d"},{"key_id":"dstack-kms-e2ee-x25519-v1","algo":"x25519-aes-256-gcm-hkdf-sha256","public_key":"408e82d159832cfae15007781bcade0badee7d50e9f76d50eaa1777464006537"}],"tls_public_keys":[{"spki_sha256":"22ad6f73dd10547af55d06825c8015413968a439b8f76adc3a6aba9a32e6c71b","domain":"tee.redpill.ai"},{"spki_sha256":"8bafb8e6ddc55e3e662b6385a2820494fc6e90c64688136860b1851a81b7ee06","domain":"inference.phala.com"},{"spki_sha256":"c68585e7dc00a55d3082a9c860cb916e1788c5daec51505e413d27ab94f7d4c7","domain":"api.redpill.ai"}]},"report_data":"79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca","source_provenance":{"repo_url":"https://github.com/Dstack-TEE/private-ai-gateway.git","repo_commit":"b6b5c1b82f6fc59490db5a5255bf4493805e66c6","image_digest":null,"image_provenance":null},"evidence":{"quote":"040002008100000000000000939a7233f79c4ca9940a0db3957f06074d79685452a1c5725d6ff7f9d09c91b4000000000b0105000000000000000000000000007bf063280e94fb051f5dd7b1fc59ce9aac42bb961df8d44b709c9b0ff87a7b4df648657ba6d1189589feab1d5a3c9a9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000702000000000000f06dfda6dce1cf904d4e2bab1dc370634cf95cefa2ceb2de2eee127c9382698090d7a4a13e14c536ec6c9c3c8fa8707701ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6118f0eeb30e9d9178d2b9106dddd002d979b6fa79bdec415051afae2021384c29a32d2f6454fa369617598378ffb5e07e6f51aa763abfe75c3ddfbf4f425fe3f0ceff66d807a75e049303dce9addf68e7218729bd419638af63a370f65878cdf67e467e60edc1737bcf8e682d48131bfb427f523226aa7f197a7608e9b3784783fa759ef5b28191fa12f9ddb36b858f23282cbe6b24708467cc26eca437111e3bed80a2f35bbba448ecee37d3de70407232a8534b9df5635a5646cacd9bbcb79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746cacc1000009be0eb8dcbfe9b11fdda136700e9759503503c803cffd58762ef79a974171c5c44ae77f9a93076aa540bebf9476ad4d89e4982ca210f77d8f6e3cb50134b759df0bfa28939a048d1d67a664ae6595ec4514829a10a01f7fc10230dd75c44697bf80c2e1e89a20ca66c1f76795d1cf5553a394c311bcc4601b9231b111d70d6b506004610000005050a0a05ff00020000000000000000000000000000000000000000000000000000000000000000000000000000000015000000000000000700000000000000e5a3a7b5d830c2953b98534c6c59a3a34fdc34e933f7f5898f0a85cf08846bca0000000000000000000000000000000000000000000000000000000000000000dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c1dc25ab6fd4ae8afb815c1c46f6d3f9bbe7ab053e699d259bf9136751037b20000000000000000000000000000000000000000000000000000000000000000a233764b3a84792c1aa7f165b48fd0eb5e05077a8672b35ad8242d9c544f0d638082a3002dc29b09308131db2a205e5d0782a72a03278473accd29f17c0806442000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f05005e0e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d49494538544343424a656741774942416749555359617753595541735374766a483236625541434d506e6f6a797777436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a59774d7a49784d4463304e5455795768634e4d7a4d774d7a49784d4463304e5455790a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424747690a41664533764c54435150696e5470685047695854516c645948654f6f657257516d4b66745141787939446c63353469446b4b537852786e7a38474f7a466f65690a6b584e532b44374575464864666b476a754e796a67674d4e4d4949444354416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c6d495a7555304e42506c79336e757041556f41396f590a73625a514d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f67594a4b6f5a496876684e415130420a424949434b7a4343416963774867594b4b6f5a496876684e415130424151515162536e396a546e656c37306e456e776e523951666554434341575147436971470a534962345451454e41514977676746554d42414743797147534962345451454e41514942416745464d42414743797147534962345451454e41514943416745460a4d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745434d42414743797147534962345451454e0a41514946416745464d42454743797147534962345451454e41514947416749412f7a415142677371686b69472b453042445145434277494241444151426773710a686b69472b4530424451454343414942416a415142677371686b69472b45304244514543435149424144415142677371686b69472b45304244514543436749420a4144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69472b4530420a44514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b453042445145434477494241444151426773710a686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b45304244514543456751510a425155434167582f4141494141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b453042445145450a424159676f473841414141774477594b4b6f5a496876684e4151304242516f424154416542676f71686b69472b453042445145474242414e78727a30753075620a48784e354e3964353631576d4d45514743697147534962345451454e415163774e6a415142677371686b69472b45304244514548415145422f7a4151426773710a686b69472b45304244514548416745422f7a415142677371686b69472b45304244514548417745422f7a414b42676771686b6a4f5051514441674e49414442460a4169454131305850553751764338564a743949654f724a366c4430744b58462b54746a4e422f6f7a62635235517477434944576e57773946484e7351745359420a70394c5463792f5670376f517367417076763332732f4236576b73760a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","quote_report_data":"79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca","event_log":"[{\"imr\":0,\"event_type\":2147483659,\"digest\":\"5fe4f9ee465a361d077a6892f6bc4d19a82b272fea2e3c2c1ef9c33b4d9050115fca0c6dc7a7f68f91c623de38c48226\",\"event\":\"\",\"event_payload\":\"095464785461626c65000100000000000000af96bb93f2b9b84e9462e0ba745642360090800000000000\"},{\"imr\":0,\"event_type\":2147483658,\"digest\":\"344bc51c980ba621aaa00da3ed7436f7d6e549197dfe699515dfa2c6583d95e6412af21c097d473155875ffd561d6790\",\"event\":\"\",\"event_payload\":\"2946762858585858585858582d585858582d585858582d585858582d58585858585858585858585829000000c0ff000000000040080000000000\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"9dc3a1f80bcec915391dcda5ffbb15e7419f77eab462bbf72b42166fb70d50325e37b36f93537a863769bcf9bedae6fb\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0a00000000000000000000000000000053006500630075007200650042006f006f007400\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"6f2e3cbc14f9def86980f5f66fd85e99d63e69a73014ed8a5633ce56eca5b64b692108c56110e22acadcef58c3250f1b\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0200000000000000000000000000000050004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"d607c0efb41c0d757d69bca0615c3a9ac0b1db06c557d992e906c6b7dee40e0e031640c7bfd7bcd35844ef9edeadc6f9\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c030000000000000000000000000000004b0045004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"08a74f8963b337acb6c93682f934496373679dd26af1089cb4eaf0c30cf260a12e814856385ab8843e56a9acea19e127\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f0200000000000000000000000000000064006200\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"18cc6e01f0c6ea99aa23f8a280423e94ad81d96d0aeb5180504fc0f7a40cb3619dd39bd6a95ec1680a86ed6ab0f9828d\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f03000000000000000000000000000000640062007800\"},{\"imr\":0,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":0,\"event_type\":10,\"digest\":\"2058afc033c14a2558b6b3ce664343eeb2b7941427251330e66ff3f12eb5c5706a9c651eee49d656c38ba3090b29ff43\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"2012337df782407ca9495fe820c6744e398a60731d13a2d11d3cdec1c9541e0946b928b929ff28715cc40bcfd71d92b9\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"98731e9fce9603662dba3c4f225a117489960615cb2d893e913c903daeaf09528096875ea94610fdb7eba69a5c20e9e3\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":1,\"event_type\":2147483651,\"digest\":\"90e278aa4d688f4f05bf76f1786fea174abcea0d6b44e81cea5b3327f3f211e5c465a9c34b513283bed2512bca6d4a19\",\"event\":\"\",\"event_payload\":\"1860fd7a0000000000c485000000000000000000000000002a000000000000000403140072f728144ab61e44b8c39ebdd7f893c7040412006b00650072006e0065006c0000007fff0400\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"1dd6f7b457ad880d840d41c961283bab688e94e4b59359ea45686581e90feccea3c624b1226113f824f315eb60ae0a7c\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0900000000000000020000000000000042006f006f0074004f0072006400650072000000\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"23ada07f5261f12f34a0bd8e46760962d6b4d576a416f1fea1c64bc656b1d28eacf7047ae6e967c58fd2a98bfa74c298\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c08000000000000003e0000000000000042006f006f0074003000300030003000090100002c0055006900410070007000000004071400c9bdb87cebf8344faaea3ee4af6516a10406140021aa2c4614760345836e8ab6f46623317fff0400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"77a0dab2312b4e1e57a84d865a21e5b2ee8d677a21012ada819d0a98988078d3d740f6346bfe0abaa938ca20439a8d71\",\"event\":\"\",\"event_payload\":\"43616c6c696e6720454649204170706c69636174696f6e2066726f6d20426f6f74204f7074696f6e\"},{\"imr\":1,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":2,\"event_type\":6,\"digest\":\"9c824b958dbbef07ec732fd79727e995d5eca309dbc6d62e4fd2840f267c5e87108b5fe25c7997c67801ff391fb67ffc\",\"event\":\"\",\"event_payload\":\"ed223b8f1a0000004c4f414445445f494d4147453a3a4c6f61644f7074696f6e7300\"},{\"imr\":2,\"event_type\":6,\"digest\":\"5eb4f34f2ec49071551c5562ebaab9f86408f4a0eadaa3d7f05157e37ab04a1f040a82eaae94015d628a7ea4aa482cd2\",\"event\":\"\",\"event_payload\":\"ec223b8f0d0000004c696e757820696e6974726400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"214b0bef1379756011344877743fdc2a5382bac6e70362d624ccf3f654407c1b4badf7d8f9295dd3dabdef65b27677e0\",\"event\":\"\",\"event_payload\":\"4578697420426f6f7420536572766963657320496e766f636174696f6e\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"0a2e01c85deae718a530ad8c6d20a84009babe6c8989269e950d8cf440c6e997695e64d455c4174a652cd080f6230b74\",\"event\":\"\",\"event_payload\":\"4578697420426f6f742053657276696365732052657475726e656420776974682053756363657373\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"f9974020ef507068183313d0ca808e0d1ca9b2d1ad0c61f5784e7157c362c06536f5ddacdad4451693f48fcc72fff624\",\"event\":\"system-preparing\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"8562fc3980258ea5119a31356844547c42ba696d73f6ecdc7d29732beef0083f22674ce14349a8a1400254466e851407\",\"event\":\"app-id\",\"event_payload\":\"fdb7a14e5a6675f752e2cb69c9067a98ca402918\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"3b496ff216c671138e922080e66deabce8a85c8cb628789afa4a93f47566d842d55308dd8cc0f92ab38f1a2578563ee7\",\"event\":\"compose-hash\",\"event_payload\":\"ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"dbb7d7c2c2ce19938fb5989949f2c4bba6829ced5cd7b8c0d98696c293ac1c5dc8b1bfb9bc95b61e2ff778a3686651eb\",\"event\":\"instance-id\",\"event_payload\":\"15e847e02a22706121de347498427469d2e7c379\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"98bd7e6bd3952720b65027fd494834045d06b4a714bf737a06b874638b3ea00ff402f7f583e3e3b05e921c8570433ac6\",\"event\":\"boot-mr-done\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"65828c6f922910fd0e272501a8b2bb6b03e24c99bb19d1cd530586061d8738f9dd0564752db23d556a6b381cbf465a85\",\"event\":\"mr-kms\",\"event_payload\":\"692afc6d7a86a32cfc1ebd9cad1a576aab012bab46986ba609bc8d6407270572\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"c936f709860155a455c519b505fe29bde21d1b778534a8f0b41b706b0f789eae2ea899e224fedb2331c18324aab4db93\",\"event\":\"os-image-hash\",\"event_payload\":\"bd369a8c2f9edb2b52dad48ac8e0b32dde5f1337c423a506b48d07403a7d8033\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"83368b43a0fc6f824f5a9220592df85fd30e2d405ecbd253a5c6354af63e6c9b41aec557c38a38e348ab87f9ac8fc68c\",\"event\":\"key-provider\",\"event_payload\":\"7b226e616d65223a226b6d73222c226964223a223330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030343838343465623432636364663863353266643466313734663336326663623962626431396334356664343866316564656332643866316361323335333665633161373430323162346365653631306330373466383239346434333162326237666565326333396535333333666461663061343532326434336662313539643966227d\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"ba51104636900268b0e059fa3d266419d079d1e94aea26fb9fcbb8d764bf4c89a67ac271b8a0d1a3989945132a111fc7\",\"event\":\"storage-fs\",\"event_payload\":\"7a6673\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"1a76b2a80a0be71eae59f80945d876351a7a3fb8e9fd1ff1cede5734aa84ea11fd72b4edfbb6f04e5a85edd114c751bd\",\"event\":\"system-ready\",\"event_payload\":\"\"}]","vm_config":"{\"os_image_hash\":\"bd369a8c2f9edb2b52dad48ac8e0b32dde5f1337c423a506b48d07403a7d8033\",\"cpu_count\":16,\"memory_size\":34359738368,\"qemu_version\":\"8.2.2\",\"pci_hole64_size\":0,\"hugepages\":false,\"num_gpus\":0,\"num_nvswitches\":0,\"hotplug_off\":false,\"image\":\"dstack-0.5.9-bd369a8c\",\"host_share_mode\":\"9p\",\"spec_version\":1}","app_compose":"{\"allowed_envs\":[\"PRIVATE_AI_GATEWAY_ADMIN_TOKEN\",\"PRIVATE_AI_GATEWAY_CONTROL_URL\",\"PRIVATE_AI_GATEWAY_CONTROL_TOKEN\",\"DSTACK_ROOT_PUBLIC_KEY\",\"CLOUDFLARE_API_TOKEN\",\"CERTBOT_EMAIL\",\"NODE_EXPORTER_USER\",\"NODE_EXPORTER_PASSWORD_HASH\"],\"docker_compose_file\":\"# dstack / Phala deployment manifest for the private-ai-gateway stack via the launcher.\\n#\\n# The launcher image is the measured trust-root: pin it by @sha256 digest (the\\n# digest + this file are hashed into the TDX quote). The launcher clones+builds\\n# the gateway from source at boot; the attestation verifier is\\n# the gateway's vendored confidential_verifier package, so it needs no separate pin.\\n#\\n# The gateway's source pin + static config are inlined as compose `configs:`\\n# (measured into the attestation): the launcher clones the pin and the gateway\\n# reads the config from mounted files. Secret values are supplied as dstack\\n# ENCRYPTED SECRETS and referenced as ${VAR} so dstack injects them — only the\\n# variable names appear in this public file, never the values.\\n\\nservices:\\n  # TLS-terminating ingress: requests CAA-pinned Let's Encrypt certs via Cloudflare\\n  # DNS-01, registers under the dstack gateway domain, and reverse-proxies inbound\\n  # 443 to the launcher's gateway on :8086. Pin by @sha256 digest like the launcher.\\n  dstack-ingress:\\n    image: dstacktee/dstack-ingress:2.2@sha256:d05a7b343c37c1cca1bba8dbf7e8f3c6d2118158af2d41c455103796db4f67f0\\n    restart: unless-stopped\\n    ports:\\n      - \\\"443:443\\\"\\n    environment:\\n      # --- public config: literals, measured into the attestation ---\\n      DNS_PROVIDER: cloudflare\\n      GATEWAY_DOMAIN: _.${DSTACK_GATEWAY_DOMAIN}\\n      SET_CAA: \\\"true\\\"\\n      # Multi-domain TLS. The ingress is an L4 (TCP) proxy: it terminates TLS for\\n      # each hostname and forwards the DECRYPTED stream untouched, so the client's\\n      # original HTTP Host survives. The gateway uses that Host to pick the\\n      # matching downstream_tls_binding. Both public hostnames route by SNI to the\\n      # same gateway listener (compose service name, not localhost).\\n      DOMAINS: |\\n        tee.redpill.ai\\n        inference.phala.com\\n        api.redpill.ai\\n      ROUTING_MAP: |\\n        tee.redpill.ai=launcher:8086\\n        inference.phala.com=launcher:8086\\n        api.redpill.ai=launcher:8086\\n      # --- secrets: values come from dstack Encrypted Secrets (never commit values) ---\\n      # NOTE: this single Cloudflare token must have DNS-edit (and CAA) rights on\\n      # BOTH the redpill.ai and phala.com zones, or cert issuance for one fails.\\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN}\\n      CERTBOT_EMAIL: ${CERTBOT_EMAIL}\\n    volumes:\\n      - /var/run/dstack.sock:/var/run/dstack.sock\\n      - /var/run/tappd.sock:/var/run/tappd.sock\\n      - cert-data:/etc/letsencrypt\\n      # Per-domain leaf certs (cert-<domain>.pem) the gateway reads to bind SPKI.\\n      - evidences:/evidences\\n\\n  launcher:\\n    image: ghcr.io/redpill-ai/private-ai-launcher@sha256:c083ff9e6a5ddf10f6c9e9bb1f74cc618deebecfea5208b563c574399db4637c\\n    restart: always\\n    # The gateway opens many fds (inbound conns, per-upstream pools, control-plane\\n    # + verifier calls). Docker's default nofile (often 1024) is far too low: under\\n    # load it hit EMFILE (\\\"Too many open files\\\"), which killed the gateway's accept\\n    # loop. Raise the limit well above peak concurrency.\\n    ulimits:\\n      nofile:\\n        soft: 65536\\n        hard: 65536\\n    # supervisord streams the gateway logs to the container stdout; cap the\\n    # runtime log on disk so it can't grow unbounded (~5GB total, rotated).\\n    # Sized for the gateway's always-on request_outcome failure logging:\\n    # roughly a month of retention on the persistent volume for incident\\n    # forensics.\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"500m\\\"\\n        max-file: \\\"10\\\"\\n    # no host port: traffic enters via dstack-ingress (443) and reaches the\\n    # gateway over the compose network as http://launcher:8086.\\n    expose:\\n      - \\\"8086\\\"\\n    volumes:\\n      - /var/run/dstack.sock:/var/run/dstack.sock   # only the gateway uses this\\n      - pal-cache:/var/lib/pag/cache                 # cargo/uv build cache (speeds reboots)\\n      - pal-state:/var/lib/pag/state                 # mutable upstreams.json + sessions.jsonl\\n      - evidences:/evidences:ro                      # ingress-minted per-domain leaf certs (cert-<domain>.pem)\\n    # Static gateway config + upstream seed are mounted from the `configs:` block\\n    # at the bottom (measured into the attestation). The source pin is passed via\\n    # `environment:` instead (see below).\\n    configs:\\n      - source: gateway-config\\n        target: /etc/private-ai-gateway/gateway.config.json\\n      - source: gateway-upstreams\\n        target: /etc/private-ai-gateway/upstreams.seed.json\\n    environment:\\n      # The gateway reads its whole policy from this mounted static config file\\n      # (see `configs:` above); CONFIG_PATH is the only gateway-facing env var.\\n      - PRIVATE_AI_GATEWAY_CONFIG_PATH=/etc/private-ai-gateway/gateway.config.json\\n      # Tracing filter. `request_outcome=debug` turns on the raw error-detail\\n      # field of the per-request failure log — a deliberate operator choice:\\n      # upstream error bodies may echo request fragments into these\\n      # operator-visible logs. Drop the `request_outcome=debug` part to fall\\n      # back to content-free failure logging only.\\n      - RUST_LOG=info,request_outcome=debug\\n      # Gateway source pin. These literals are measured into the attestation, and\\n      # because they live in `environment:` (part of Compose's config-hash) a\\n      # COMMIT_SHA bump forces a container recreate on `phala deploy` — so the new\\n      # pin actually takes effect. (A `configs:`-file pin would not: Compose ignores\\n      # config content when deciding to recreate, so the change would never apply.)\\n      # entrypoint.sh writes /etc/git-launcher/gateway.conf from these, and the\\n      # gateway reads that file as its attested source provenance.\\n      - PRIVATE_AI_GATEWAY_REPO_URL=https://github.com/Dstack-TEE/private-ai-gateway.git\\n      - PRIVATE_AI_GATEWAY_REPO_COMMIT=b6b5c1b82f6fc59490db5a5255bf4493805e66c6\\n      # NEAR AI verification posts TDX quotes to the dstack-verifier sidecar below;\\n      # reach it by compose service name (localhost would be the launcher itself).\\n      - DSTACK_VERIFIER_URL=http://dstack-verifier:8080\\n      # --- secrets: values come from dstack Encrypted Secrets (never commit values) ---\\n      # Control-plane credentials. The gateway's in-process middleware reads these\\n      # from the `middleware` config section below (rendered from the same secrets).\\n      - PRIVATE_AI_GATEWAY_CONTROL_URL=${PRIVATE_AI_GATEWAY_CONTROL_URL}\\n      - PRIVATE_AI_GATEWAY_CONTROL_TOKEN=${PRIVATE_AI_GATEWAY_CONTROL_TOKEN}\\n\\n  # TDX quote verifier for the NEAR AI path (reproduces ACPI/boot measurements via\\n  # QEMU). The gateway reaches it at http://dstack-verifier:8080 (DSTACK_VERIFIER_URL).\\n  dstack-verifier:\\n    image: dstacktee/dstack-verifier:0.5.11@sha256:06a20b777e59196c7f54b0cd02ffe567df6d05ae39a0b2fea9cb0642fb23c1fd\\n    restart: unless-stopped\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"50m\\\"\\n        max-file: \\\"5\\\"\\n\\n  # Host-metrics exporter for observing this CVM (CPU/mem/disk/net/fd). Inside a\\n  # CVM the container's /, /proc, /sys ARE the guest's, so node-exporter reports\\n  # the CVM's own state. Pinned by @sha256 like the other images (measured into\\n  # the attestation). Exposed on 9100 (reached via the dstack gateway) and guarded\\n  # by HTTP basic auth — both username and the bcrypt password HASH are injected as\\n  # dstack Encrypted Secrets, so neither appears in this measured file.\\n  node-exporter:\\n    image: prom/node-exporter:v1.8.2@sha256:4032c6d5bfd752342c3e631c2f1de93ba6b86c41db6b167b9a35372c139e7706\\n    restart: unless-stopped\\n    pid: host\\n    command:\\n      - '--path.rootfs=/host'\\n      - '--path.procfs=/host/proc'\\n      - '--path.sysfs=/host/sys'\\n      - '--web.config.file=/etc/node-exporter/web-config.yml'\\n    volumes:\\n      - /:/host:ro,rslave\\n    configs:\\n      - source: node-exporter-web-config\\n        target: /etc/node-exporter/web-config.yml\\n    ports:\\n      - \\\"9100:9100\\\"\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"10m\\\"\\n        max-file: \\\"3\\\"\\n\\nvolumes:\\n  pal-cache:\\n  pal-state:\\n  cert-data:   # Let's Encrypt certs/keys persisted for dstack-ingress\\n  evidences:   # ingress attestation evidence + per-domain leaf certs, shared read-only with the gateway\\n\\n# Inlined, measured into the attestation. Public pins use LITERAL values so the\\n# code version is bound into compose_hash; only secrets use ${VAR} (injected by\\n# dstack, never measured).\\nconfigs:\\n  # Static gateway config. `admin_token` and the control-plane credentials are the\\n  # only secrets here — ${VAR} keeps them out of the measured compose. The\\n  # `middleware` section runs the in-process middleware, which consults the control\\n  # plane at `control_url`.\\n  gateway-config:\\n    content: |\\n      {\\n        \\\"bind\\\": \\\"0.0.0.0:8086\\\",\\n        \\\"state_dir\\\": \\\"/var/lib/pag/state\\\",\\n        \\\"upstream_config_seed_path\\\": \\\"/etc/private-ai-gateway/upstreams.seed.json\\\",\\n        \\\"admin_token\\\": \\\"${PRIVATE_AI_GATEWAY_ADMIN_TOKEN:?set PRIVATE_AI_GATEWAY_ADMIN_TOKEN}\\\",\\n        \\\"tls\\\": {\\n          \\\"domain_certificates\\\": [\\n            { \\\"domain\\\": \\\"tee.redpill.ai\\\", \\\"certificate_path\\\": \\\"/evidences/cert-tee.redpill.ai.pem\\\" },\\n            { \\\"domain\\\": \\\"inference.phala.com\\\", \\\"certificate_path\\\": \\\"/evidences/cert-inference.phala.com.pem\\\" },\\n            { \\\"domain\\\": \\\"api.redpill.ai\\\", \\\"certificate_path\\\": \\\"/evidences/cert-api.redpill.ai.pem\\\" }\\n          ]\\n        },\\n        \\\"middleware\\\": {\\n          \\\"control_url\\\": \\\"${PRIVATE_AI_GATEWAY_CONTROL_URL:?set PRIVATE_AI_GATEWAY_CONTROL_URL}\\\",\\n          \\\"control_token\\\": \\\"${PRIVATE_AI_GATEWAY_CONTROL_TOKEN:?set PRIVATE_AI_GATEWAY_CONTROL_TOKEN}\\\",\\n          \\\"tee_only_domains\\\": [\\\"tee.redpill.ai\\\", \\\"inference.phala.com\\\"]\\n        }\\n      }\\n  # Initial upstream routes: seeded into <state_dir>/upstreams.json only when empty,\\n  # then managed at runtime via PUT /v1/admin/upstreams (does not touch this file).\\n  gateway-upstreams:\\n    content: |\\n      []\\n  # node-exporter basic-auth credentials. exporter-toolkit's basic_auth_users maps\\n  # username -> bcrypt hash; both are ${VAR} so dstack substitutes the injected\\n  # secret values when rendering this file into the container — only the literals\\n  # are measured. NODE_EXPORTER_PASSWORD_HASH must be a bcrypt hash\\n  # (`htpasswd -nBC 10 \\\"\\\" | tr -d ':\\\\n'`), NOT the plaintext password; the plaintext\\n  # goes to the external Prometheus scrape config.\\n  node-exporter-web-config:\\n    content: |\\n      basic_auth_users:\\n        ${NODE_EXPORTER_USER:?set NODE_EXPORTER_USER}: ${NODE_EXPORTER_PASSWORD_HASH:?set NODE_EXPORTER_PASSWORD_HASH}\\n\",\"features\":[\"kms\",\"tproxy-net\"],\"gateway_enabled\":true,\"kms_enabled\":true,\"local_key_provider_enabled\":false,\"manifest_version\":2,\"name\":\"\",\"no_instance_id\":false,\"pre_launch_script\":\"#!/bin/bash\\necho \\\"----------------------------------------------\\\"\\necho \\\"Running Phala Cloud Pre-Launch Script v0.0.15\\\"\\necho \\\"----------------------------------------------\\\"\\nset -e\\n\\n# Function: notify host\\n\\nnotify_host() {\\n    if command -v dstack-util >/dev/null 2>&1; then\\n        dstack-util notify-host -e \\\"$1\\\" -d \\\"$2\\\"\\n    else\\n        tdxctl notify-host -e \\\"$1\\\" -d \\\"$2\\\"\\n    fi\\n}\\n\\nnotify_host_hoot_info() {\\n    notify_host \\\"boot.progress\\\" \\\"$1\\\"\\n}\\n\\nnotify_host_hoot_error() {\\n    notify_host \\\"boot.error\\\" \\\"$1\\\"\\n}\\n\\n# Function: Perform Docker cleanup\\nperform_cleanup() {\\n    echo \\\"Pruning unused images\\\"\\n    docker image prune -af\\n    echo \\\"Pruning unused volumes\\\"\\n    docker volume prune -f\\n    notify_host_hoot_info \\\"docker cleanup completed\\\"\\n}\\n\\n# Function: Check Docker login status without exposing credentials\\ncheck_docker_login() {\\n    local registry=\\\"$1\\\"\\n\\n    # When registry is specified, check auth entry for that registry in Docker config\\n    if [[ -n \\\"$registry\\\" ]]; then\\n        local docker_config_path=\\\"${DOCKER_CONFIG:-$HOME/.docker}/config.json\\\"\\n        if [[ -f \\\"$docker_config_path\\\" ]] && grep -q \\\"$registry\\\" \\\"$docker_config_path\\\"; then\\n            return 0\\n        else\\n            return 1\\n        fi\\n    fi\\n\\n    # Fallback check when no explicit registry is provided\\n    if docker info 2>/dev/null | grep -q \\\"Username\\\"; then\\n        return 0\\n    else\\n        return 1\\n    fi\\n}\\n\\n# Main logic starts here\\necho \\\"Starting login process...\\\"\\n\\n# Check if Docker credentials exist\\nif [[ -n \\\"$DSTACK_DOCKER_USERNAME\\\" && -n \\\"$DSTACK_DOCKER_PASSWORD\\\" ]]; then\\n    echo \\\"Docker credentials found\\\"\\n    DOCKER_REGISTRY_TARGET=\\\"${DSTACK_DOCKER_REGISTRY:-docker.io}\\\"\\n    echo \\\"Target Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n\\n    # Check if already logged in\\n    if check_docker_login \\\"$DSTACK_DOCKER_REGISTRY\\\"; then\\n        echo \\\"Already logged in to Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n    else\\n        echo \\\"Logging in to Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n        # Login without exposing password in process list\\n        if [[ -n \\\"$DSTACK_DOCKER_REGISTRY\\\" ]]; then\\n            echo \\\"$DSTACK_DOCKER_PASSWORD\\\" | docker login -u \\\"$DSTACK_DOCKER_USERNAME\\\" --password-stdin \\\"$DSTACK_DOCKER_REGISTRY\\\"\\n        else\\n            echo \\\"$DSTACK_DOCKER_PASSWORD\\\" | docker login -u \\\"$DSTACK_DOCKER_USERNAME\\\" --password-stdin\\n        fi\\n\\n        if [ $? -eq 0 ]; then\\n            echo \\\"Docker login successful: $DOCKER_REGISTRY_TARGET\\\"\\n        else\\n            echo \\\"Docker login failed: $DOCKER_REGISTRY_TARGET\\\"\\n            notify_host_hoot_error \\\"docker login failed\\\"\\n            exit 1\\n        fi\\n    fi\\n# Check if AWS ECR credentials exist\\nelif [[ -n \\\"$DSTACK_AWS_ACCESS_KEY_ID\\\" && -n \\\"$DSTACK_AWS_SECRET_ACCESS_KEY\\\" && -n \\\"$DSTACK_AWS_REGION\\\" && -n \\\"$DSTACK_AWS_ECR_REGISTRY\\\" ]]; then\\n    echo \\\"AWS ECR credentials found\\\"\\n\\n    # Check if AWS CLI is installed\\n    if [ ! -f \\\"./aws/dist/aws\\\" ]; then\\n        notify_host_hoot_info \\\"awscli not installed, installing...\\\"\\n        echo \\\"AWS CLI not installed, installing...\\\"\\n        curl \\\"https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.24.14.zip\\\" -o \\\"awscliv2.zip\\\"\\n        echo \\\"6ff031a26df7daebbfa3ccddc9af1450 awscliv2.zip\\\" | md5sum -c\\n        if [ $? -ne 0 ]; then\\n            echo \\\"MD5 checksum failed\\\"\\n            notify_host_hoot_error \\\"awscli install failed\\\"\\n            exit 1\\n        fi\\n        unzip awscliv2.zip &> /dev/null\\n    else\\n        echo \\\"AWS CLI is already installed: ./aws/dist/aws\\\"\\n    fi\\n\\n    # Set AWS credentials as environment variables\\n    export AWS_ACCESS_KEY_ID=\\\"$DSTACK_AWS_ACCESS_KEY_ID\\\"\\n    export AWS_SECRET_ACCESS_KEY=\\\"$DSTACK_AWS_SECRET_ACCESS_KEY\\\"\\n    export AWS_DEFAULT_REGION=\\\"$DSTACK_AWS_REGION\\\"\\n\\n    # Set session token if provided (for temporary credentials)\\n    if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n        echo \\\"AWS session token found, using temporary credentials\\\"\\n        export AWS_SESSION_TOKEN=\\\"$DSTACK_AWS_SESSION_TOKEN\\\"\\n    fi\\n\\n    # Test AWS credentials before attempting ECR login\\n    echo \\\"Testing AWS credentials...\\\"\\n    if ! ./aws/dist/aws sts get-caller-identity &> /dev/null; then\\n        echo \\\"AWS credentials test failed\\\"\\n        # For session token credentials, this might be expected if they're expired\\n        # Log warning but don't fail startup\\n        if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n            echo \\\"Warning: AWS temporary credentials may have expired, continuing startup\\\"\\n            notify_host_hoot_info \\\"AWS temporary credentials may have expired\\\"\\n        else\\n            echo \\\"AWS credentials test failed\\\"\\n            notify_host_hoot_error \\\"Invalid AWS credentials\\\"\\n            exit 1\\n        fi\\n    else\\n        echo \\\"Logging in to AWS ECR...\\\"\\n        ./aws/dist/aws ecr get-login-password --region $DSTACK_AWS_REGION | docker login --username AWS --password-stdin \\\"$DSTACK_AWS_ECR_REGISTRY\\\"\\n        if [ $? -eq 0 ]; then\\n            echo \\\"AWS ECR login successful\\\"\\n            notify_host_hoot_info \\\"AWS ECR login successful\\\"\\n        else\\n            echo \\\"AWS ECR login failed\\\"\\n            # For session token credentials, don't fail startup if login fails\\n            if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n                echo \\\"Warning: AWS ECR login failed with temporary credentials, continuing startup\\\"\\n                notify_host_hoot_info \\\"AWS ECR login failed with temporary credentials\\\"\\n            else\\n                notify_host_hoot_error \\\"AWS ECR login failed\\\"\\n                exit 1\\n            fi\\n        fi\\n    fi\\nfi\\n\\nperform_cleanup\\n\\n#\\n# GHCR image pull access verification (pure HTTP, no docker daemon)\\n#\\nif [[ \\\"$DOCKER_REGISTRY_TARGET\\\" == \\\"ghcr.io\\\" && -n \\\"$DSTACK_DOCKER_USERNAME\\\" && -n \\\"$DSTACK_DOCKER_PASSWORD\\\" ]]; then\\n    COMPOSE_IMAGES=$(grep 'image:' /dstack/docker-compose.yaml 2>/dev/null | awk '{print $2}' | tr -d '\\\"'\\\"'\\\" || true)\\n    for img in $COMPOSE_IMAGES; do\\n        [[ \\\"$img\\\" != ghcr.io/* ]] && continue\\n        repo=\\\"${img#ghcr.io/}\\\"; repo=\\\"${repo%%:*}\\\"\\n        tag=\\\"${img##*:}\\\"; [[ \\\"$tag\\\" == \\\"$img\\\" || \\\"$tag\\\" == \\\"$repo\\\" ]] && tag=\\\"latest\\\"\\n        echo \\\"Verifying GHCR pull access: $img\\\"\\n        token=$(curl -sf -u \\\"$DSTACK_DOCKER_USERNAME:$DSTACK_DOCKER_PASSWORD\\\"             \\\"https://ghcr.io/token?service=ghcr.io&scope=repository:${repo}:pull\\\" | jq -r '.token // empty' || true)\\n        if [[ -z \\\"$token\\\" ]]; then\\n            echo \\\"ERROR: GHCR token exchange failed for $img\\\"\\n            notify_host_hoot_error \\\"GHCR token exchange failed: $img\\\"\\n            exit 1\\n        fi\\n        http_code=$(curl -s -o /dev/null -w \\\"%{http_code}\\\" -H \\\"Authorization: Bearer $token\\\"             -H \\\"Accept: application/vnd.oci.image.index.v1+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.docker.distribution.manifest.v2+json\\\"             \\\"https://ghcr.io/v2/${repo}/manifests/${tag}\\\")\\n        if [[ \\\"$http_code\\\" != \\\"200\\\" ]]; then\\n            echo \\\"ERROR: GHCR pull access denied for $img (HTTP $http_code)\\\"\\n            notify_host_hoot_error \\\"GHCR pull access denied: $img (HTTP $http_code)\\\"\\n            exit 1\\n        fi\\n        echo \\\"GHCR pull access OK: $img\\\"\\n    done\\nfi\\n\\n#\\n# Pull latest images from docker-compose.yaml so existing CVMs pick up new tags.\\n# Pull is fail-soft: short-lived tokens may expire between login and pull, but\\n# falling back to already-cached images is preferable to blocking boot.\\n#\\necho \\\"Images before pull:\\\"\\ndocker images --format '{{.Repository}}:{{.Tag}} {{.ID}} ({{.CreatedSince}})'\\n\\necho \\\"Pulling latest images from /dstack/docker-compose.yaml...\\\"\\nif docker compose -f /dstack/docker-compose.yaml pull; then\\n    echo \\\"docker compose pull completed\\\"\\n    notify_host_hoot_info \\\"docker compose pull completed\\\"\\nelse\\n    echo \\\"WARNING: docker compose pull failed; continuing with existing images\\\"\\n    notify_host_hoot_info \\\"docker compose pull failed; using existing images\\\"\\nfi\\n\\necho \\\"Images after pull:\\\"\\ndocker images --format '{{.Repository}}:{{.Tag}} {{.ID}} ({{.CreatedSince}})'\\n\\n#\\n# Set root password.\\n#\\necho \\\"Setting root password..\\\"\\n\\n# Check if password files are writable\\nPASSWD_WRITABLE=true\\nif [ ! -w /etc/passwd ]; then\\n    echo \\\"Warning: /etc/passwd is read-only\\\"\\n    PASSWD_WRITABLE=false\\nfi\\nif [ ! -w /etc/shadow ]; then\\n    echo \\\"Warning: /etc/shadow is read-only\\\"\\n    PASSWD_WRITABLE=false\\nfi\\n\\nif [ \\\"$PASSWD_WRITABLE\\\" = \\\"false\\\" ]; then\\n    echo \\\"Skipping password setup due to read-only file system\\\"\\nelse\\n    # Check if chpasswd is available\\n    if command -v chpasswd >/dev/null 2>&1; then\\n        echo \\\"Using chpasswd method\\\"\\n\\n        if [ -n \\\"$DSTACK_ROOT_PASSWORD\\\" ]; then\\n            echo \\\"Setting root password from user..\\\"\\n            echo \\\"root:$DSTACK_ROOT_PASSWORD\\\" | chpasswd\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set/updated from DSTACK_ROOT_PASSWORD\\\"\\n        elif [ -z \\\"$(grep '^root:' /etc/shadow 2>/dev/null | cut -d: -f2)\\\" ]; then\\n            echo \\\"Setting random root password..\\\"\\n            DSTACK_ROOT_PASSWORD=$(\\n                LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null\\n            )\\n            echo \\\"root:$DSTACK_ROOT_PASSWORD\\\" | chpasswd\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set (random auto-init)\\\"\\n        else\\n            echo \\\"Root password already set; no changes.\\\"\\n        fi\\n    else\\n        echo \\\"Using passwd method\\\"\\n\\n        if [ -n \\\"$DSTACK_ROOT_PASSWORD\\\" ]; then\\n            echo \\\"Setting root password from user..\\\"\\n            echo \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd --stdin root 2>/dev/null                 || printf '%s\\n%s\\n' \\\"$DSTACK_ROOT_PASSWORD\\\" \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd root\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set/updated from DSTACK_ROOT_PASSWORD\\\"\\n        elif [ -z \\\"$(grep '^root:' /etc/shadow 2>/dev/null | cut -d: -f2)\\\" ]; then\\n            echo \\\"Setting random root password..\\\"\\n            DSTACK_ROOT_PASSWORD=$(\\n                LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null\\n            )\\n            echo \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd --stdin root 2>/dev/null                 || printf '%s\\n%s\\n' \\\"$DSTACK_ROOT_PASSWORD\\\" \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd root\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set (random auto-init)\\\"\\n        else\\n            echo \\\"Root password already set; no changes.\\\"\\n        fi\\n    fi\\nfi\\n\\n#\\n# Set SSH authorized keys\\n#\\nif mkdir -p /home/root/.ssh 2>/dev/null; then\\n    if [[ -n \\\"$DSTACK_ROOT_PUBLIC_KEY\\\" ]]; then\\n        echo \\\"$DSTACK_ROOT_PUBLIC_KEY\\\" > /home/root/.ssh/authorized_keys\\n        unset $DSTACK_ROOT_PUBLIC_KEY\\n        echo \\\"Root public key set\\\"\\n    fi\\n    if [[ -n \\\"$DSTACK_AUTHORIZED_KEYS\\\" ]]; then\\n        echo \\\"$DSTACK_AUTHORIZED_KEYS\\\" > /home/root/.ssh/authorized_keys\\n        unset $DSTACK_AUTHORIZED_KEYS\\n        echo \\\"Root authorized_keys set\\\"\\n    fi\\n\\n    if [[ -f /dstack/user_config ]] && jq empty /dstack/user_config 2>/dev/null; then\\n        if [[ $(jq 'has(\\\"ssh_authorized_keys\\\")' /dstack/user_config 2>/dev/null) == \\\"true\\\" ]]; then\\n            jq -j '.ssh_authorized_keys' /dstack/user_config >> /home/root/.ssh/authorized_keys\\n            # Remove duplicates if there are multiple keys\\n            if [[ $(cat /home/root/.ssh/authorized_keys | wc -l) -gt 1 ]]; then\\n                sort -u /home/root/.ssh/authorized_keys > /home/root/.ssh/authorized_keys.tmp\\n                mv /home/root/.ssh/authorized_keys.tmp /home/root/.ssh/authorized_keys\\n            fi\\n            echo \\\"Set root authorized_keys from user preferences, total\\\" $(cat /home/root/.ssh/authorized_keys | wc -l) \\\"keys\\\"\\n        fi\\n    fi\\nelse\\n    echo \\\"Warning: Cannot create /home/root/.ssh directory (read-only file system?)\\\"\\n    echo \\\"Skipping SSH key setup\\\"\\nfi\\n\\nif [[ -S /var/run/dstack.sock ]]; then\\n    export DSTACK_APP_ID=$(curl -s --unix-socket /var/run/dstack.sock http://dstack/Info | jq -j .app_id)\\nelif [[ -S /var/run/tappd.sock ]]; then\\n    export DSTACK_APP_ID=$(curl -s --unix-socket /var/run/tappd.sock http://dstack/prpc/Tappd.Info | jq -j .app_id)\\nfi\\n# Check if DSTACK_GATEWAY_DOMAIN is not set, try to get it from user_config or app-compose.json\\n# Priority: user_config > app-compose.json\\nif [[ -z \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]]; then\\n    # First try to get from /dstack/user_config if it exists and is valid JSON\\n    if [[ -f /dstack/user_config ]] && jq empty /dstack/user_config 2>/dev/null; then\\n        if [[ $(jq 'has(\\\"default_gateway_domain\\\")' /dstack/user_config 2>/dev/null) == \\\"true\\\" ]]; then\\n            export DSTACK_GATEWAY_DOMAIN=$(jq -j '.default_gateway_domain' /dstack/user_config)\\n        fi\\n    fi\\n\\n    # If still not set, try to get from app-compose.json\\n    if [[ -z \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]] && [[ $(jq 'has(\\\"default_gateway_domain\\\")' app-compose.json) == \\\"true\\\" ]]; then\\n        export DSTACK_GATEWAY_DOMAIN=$(jq -j '.default_gateway_domain' app-compose.json)\\n    fi\\nfi\\nif [[ -n \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]]; then\\n    export DSTACK_APP_DOMAIN=$DSTACK_APP_ID\\\".\\\"$DSTACK_GATEWAY_DOMAIN\\nfi\\n\\necho \\\"----------------------------------------------\\\"\\necho \\\"Script execution completed\\\"\\necho \\\"----------------------------------------------\\\"\\n\",\"public_logs\":true,\"public_sysinfo\":true,\"public_tcbinfo\":true,\"runner\":\"docker-compose\",\"secure_time\":false,\"storage_fs\":\"zfs\",\"tproxy_enabled\":true}","key_custody":{"provider":"dstack-kms","keys":[{"role":"receipt","path":"aci/receipt-ed25519/v1","purpose":"aci.receipt.ed25519.v1","algo":"ed25519","public_key":"110f3824daeeef29dbeba9677a5794ffed257b1082d9fd4599b3c0819953aa0a","kms_public_key":"02f7fb3ed8c352d316dfdc19458a9f29c06eb7e74130b3808d784e2fd401a2c12d","signature_chain":["d1f59335effc2688acdf502ee34d8d3373b0e7e6be493075383714ce5673a29973f224690437c483ae3fdd37172df3abad82877c4023ed7c5a64d5acaf18477c00","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]},{"role":"e2ee-secp256k1","path":"aci/e2ee/v1","purpose":"aci.e2ee.v1","algo":"secp256k1-aes-256-gcm-hkdf-sha256","public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d","kms_public_key":"03943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f","signature_chain":["452d6f86a807fef0ce0d65e6c5cd25a0a249b1fd8608d26c3efe17fc10346f4c2d3dfb8969d10dc1feac1d595b3816f63faa40ac370a3a233ce1d712d418c89701","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]},{"role":"e2ee-x25519","path":"aci/e2ee-x25519/v1","purpose":"aci.e2ee.x25519.v1","algo":"x25519-aes-256-gcm-hkdf-sha256","public_key":"408e82d159832cfae15007781bcade0badee7d50e9f76d50eaa1777464006537","kms_public_key":"03892f86b3f55f78cc0760cec933cf8e2a92862fb173c2d221cc25895847cbb5eb","signature_chain":["358cd661ca4f5e986ed950ca083bf7bcfef6ab4b839ca11a953b156d64f82b1c51a213730d5777b4c845170827680d41e8220c2f950a38081025ff16eb3789ba00","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]}]},"downstream_tls_binding":{"domain":"api.redpill.ai","spki_sha256":"c68585e7dc00a55d3082a9c860cb916e1788c5daec51505e413d27ab94f7d4c7"}}},"service_capabilities":{"supported_e2ee_versions":["2"],"serving":"aggregator"},"signing_public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d","signing_algo":"ecdsa","signing_address":"0x79a5061efe5a46b0d1f33b11cf1c5adbedae6b79","intel_quote":"040002008100000000000000939a7233f79c4ca9940a0db3957f06074d79685452a1c5725d6ff7f9d09c91b4000000000b0105000000000000000000000000007bf063280e94fb051f5dd7b1fc59ce9aac42bb961df8d44b709c9b0ff87a7b4df648657ba6d1189589feab1d5a3c9a9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000702000000000000f06dfda6dce1cf904d4e2bab1dc370634cf95cefa2ceb2de2eee127c9382698090d7a4a13e14c536ec6c9c3c8fa8707701ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6118f0eeb30e9d9178d2b9106dddd002d979b6fa79bdec415051afae2021384c29a32d2f6454fa369617598378ffb5e07e6f51aa763abfe75c3ddfbf4f425fe3f0ceff66d807a75e049303dce9addf68e7218729bd419638af63a370f65878cdf67e467e60edc1737bcf8e682d48131bfb427f523226aa7f197a7608e9b3784783fa759ef5b28191fa12f9ddb36b858f23282cbe6b24708467cc26eca437111e3bed80a2f35bbba448ecee37d3de70407232a8534b9df5635a5646cacd9bbcb79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746cacc1000009be0eb8dcbfe9b11fdda136700e9759503503c803cffd58762ef79a974171c5c44ae77f9a93076aa540bebf9476ad4d89e4982ca210f77d8f6e3cb50134b759df0bfa28939a048d1d67a664ae6595ec4514829a10a01f7fc10230dd75c44697bf80c2e1e89a20ca66c1f76795d1cf5553a394c311bcc4601b9231b111d70d6b506004610000005050a0a05ff00020000000000000000000000000000000000000000000000000000000000000000000000000000000015000000000000000700000000000000e5a3a7b5d830c2953b98534c6c59a3a34fdc34e933f7f5898f0a85cf08846bca0000000000000000000000000000000000000000000000000000000000000000dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c1dc25ab6fd4ae8afb815c1c46f6d3f9bbe7ab053e699d259bf9136751037b20000000000000000000000000000000000000000000000000000000000000000a233764b3a84792c1aa7f165b48fd0eb5e05077a8672b35ad8242d9c544f0d638082a3002dc29b09308131db2a205e5d0782a72a03278473accd29f17c0806442000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f05005e0e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d49494538544343424a656741774942416749555359617753595541735374766a483236625541434d506e6f6a797777436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a59774d7a49784d4463304e5455795768634e4d7a4d774d7a49784d4463304e5455790a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424747690a41664533764c54435150696e5470685047695854516c645948654f6f657257516d4b66745141787939446c63353469446b4b537852786e7a38474f7a466f65690a6b584e532b44374575464864666b476a754e796a67674d4e4d4949444354416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c6d495a7555304e42506c79336e757041556f41396f590a73625a514d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f67594a4b6f5a496876684e415130420a424949434b7a4343416963774867594b4b6f5a496876684e415130424151515162536e396a546e656c37306e456e776e523951666554434341575147436971470a534962345451454e41514977676746554d42414743797147534962345451454e41514942416745464d42414743797147534962345451454e41514943416745460a4d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745434d42414743797147534962345451454e0a41514946416745464d42454743797147534962345451454e41514947416749412f7a415142677371686b69472b453042445145434277494241444151426773710a686b69472b4530424451454343414942416a415142677371686b69472b45304244514543435149424144415142677371686b69472b45304244514543436749420a4144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69472b4530420a44514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b453042445145434477494241444151426773710a686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b45304244514543456751510a425155434167582f4141494141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b453042445145450a424159676f473841414141774477594b4b6f5a496876684e4151304242516f424154416542676f71686b69472b453042445145474242414e78727a30753075620a48784e354e3964353631576d4d45514743697147534962345451454e415163774e6a415142677371686b69472b45304244514548415145422f7a4151426773710a686b69472b45304244514548416745422f7a415142677371686b69472b45304244514548417745422f7a414b42676771686b6a4f5051514441674e49414442460a4169454131305850553751764338564a743949654f724a366c4430744b58462b54746a4e422f6f7a62635235517477434944576e57773946484e7351745359420a70394c5463792f5670376f517367417076763332732f4236576b73760a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","nvidia_payload":"{\"nonce\": \"c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca\", \"evidence_list\": [{\"certificate\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQXdLZ0F3SUJBZ0lVVGthcGp3dnhBVFBmWXZCZ3VhWlpoUldUS3NRd0NnWUlLb1pJemowRUF3TXcKWkRFYk1Ca0dBMVVFQlJNU05ERkNPRVpDTnpVd016bERNalpHTWpaRU1Rc3dDUVlEVlFRR0V3SlZVekViTUJrRwpBMVVFQ2d3U1RsWkpSRWxCSUVOdmNuQnZjbUYwYVc5dU1Sc3dHUVlEVlFRRERCSkhTREV3TUNCQk1ERWdSMU5RCklFSlNUMDB3SUJjTk1qQXhNREUzTURBd01EQXdXaGdQT1RrNU9URXlNekV5TXpVNU5UbGFNSHd4TVRBdkJnTlYKQkFVVEtEUkZORFpCT1RoR01FSkdNVEF4TXpORVJqWXlSakEyTUVJNVFUWTFPVGcxTVRVNU16SkJRelF4Q3pBSgpCZ05WQkFZVEFsVlRNUnN3R1FZRFZRUUtEQkpPVmtsRVNVRWdRMjl5Y0c5eVlYUnBiMjR4SFRBYkJnTlZCQU1NCkZFZElNVEF3SUVFd01TQkhVMUFnUmsxRElFeEdNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRU4reXcKTllla0wrVHprWkwxTW0vVERkMXRpbEhPZmYzSGgxblZ4MFZQUnM5N3hUbll4K2lJbE5CeUVhRmtqK004UlVkYQpLL1NkcFhMdVhvTlgrMkNFTElsZDR1engyUkJ6VGZROEFyZStUQUNBblRyWG51SkpvN2JTSllLTjhxR3VvNElCCldUQ0NBVlV3RGdZRFZSMFBBUUgvQkFRREFnZUFNQjBHQTFVZERnUVdCQlFPUnFtUEMvRUJNOTlpOEdDNXBsbUYKRlpNcXhEQWZCZ05WSFNNRUdEQVdnQlJ0a3hHUkFBRlNHMjhlVWVPb1R2R00rVXNHUURBNEJnTlZIUkVFTVRBdgpvQzBHQ2lzR0FRUUJneHlDRWdHZ0h3d2RUbFpKUkVsQk9rZElNVEF3T2pRNFFqQXlSRUU1TWtNNVJEZEVNa1l3CmdjZ0dCbWVCQlFVRUFRU0J2VENCdWdJQkFUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkhIMTAxbisKc2pSMy93My96RWZZT0dLTkcydVBBeXU0YnI2OHIrUVNtbUJONUxFZmJKQ3BiMW1LRTlteGFPNVBOdERBT3ZwSgpKR0ZxeDBXODNER2JKcHRQdHRUaG5qRkhxNktRdnZNUGJNL3E0ZVBQb3hpTmxLcXJiRThBUFNZbzREQTlCZ2xnCmhrZ0JaUU1FQWdJRU1QR3VmUUNUby9Wb25NN1ZnRVhKZEUrVTZ5cWszY3FJRTFHWCswR252a1ZYYkNpQno1SU8KTEx6QWtMSExraDk3TFRBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpCWmpmU1UzM0FZR1lMU3RrVVFjZGdIbFhHWQppZzJjenJDNHVuYWhzV1RnMWdGb05odWZ5OTRPcEs0aDdybm1nNUFDTURYVHUrSDdwa3lycGxDbjhGaXRRRTkrCjlnZFdJNWs4b1JqUGxxR20xdy81S3F3VUw3dmR3YXNpQS9Nd2hjcGphdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNUekNDQWRhZ0F3SUJBZ0lKUWJqN2RRT2NKdkp0TUFvR0NDcUdTTTQ5QkFNRE1GTXhKekFsQmdOVkJBTU0KSGs1V1NVUkpRU0JIU0RFd01DQlFjbTkyYVhOcGIyNWxjaUJKUTBFZ01URWJNQmtHQTFVRUNnd1NUbFpKUkVsQgpJRU52Y25CdmNtRjBhVzl1TVFzd0NRWURWUVFHRXdKVlV6QWdGdzB5TURFd01UY3dNREF3TURCYUdBODVPVGs1Ck1USXpNVEl6TlRrMU9Wb3daREViTUJrR0ExVUVCUk1TTkRGQ09FWkNOelV3TXpsRE1qWkdNalpFTVFzd0NRWUQKVlFRR0V3SlZVekViTUJrR0ExVUVDZ3dTVGxaSlJFbEJJRU52Y25CdmNtRjBhVzl1TVJzd0dRWURWUVFEREJKSApTREV3TUNCQk1ERWdSMU5RSUVKU1QwMHdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSeDlkTlovckkwCmQvOE4vOHhIMkRoaWpSdHJqd01ydUc2K3ZLL2tFcHBnVGVTeEgyeVFxVzlaaWhQWnNXanVUemJRd0RyNlNTUmgKYXNkRnZOd3hteWFiVDdiVTRaNHhSNnVpa0w3ekQyelA2dUhqejZNWWpaU3FxMnhQQUQwbUtPQ2pZekJoTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0lFTUIwR0ExVWREZ1FXQkJSdGt4R1JBQUZTCkcyOGVVZU9vVHZHTStVc0dRREFmQmdOVkhTTUVHREFXZ0JRcGFNc1dMTkIzbFhLaWVSQUQ1cDY2RE13S2xEQUsKQmdncWhrak9QUVFEQXdObkFEQmtBakFOUnFvZlFCSlV5dWwyRXVLeDk1WWlLVTRET0drYnRiaHpzTGR2clRqRgpoMzNPWmhheUFwRk9INTNRRUsyUHRxa0NNQno0UTQ0TTBsUkdxQWZWUFVTWkI0R3Qrek85aFo5Mmc2WnI2elJYCnlIZjBNT3RzUVhZTmRuOUZWbGZTVWkrQkRnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3FqQ0NBaStnQXdJQkFnSVFhdjV4aFBraU1zamZleVFpWVhkdVZqQUtCZ2dxaGtqT1BRUURBekE5TVI0dwpIQVlEVlFRRERCVk9Wa2xFU1VFZ1IwZ3hNREFnU1dSbGJuUnBkSGt4R3pBWkJnTlZCQW9NRWs1V1NVUkpRU0JECmIzSndiM0poZEdsdmJqQWdGdzB5TWpBek1ERXdNREF3TURCYUdBODVPVGs1TVRJek1USXpOVGsxT1Zvd1V6RW4KTUNVR0ExVUVBd3dlVGxaSlJFbEJJRWRJTVRBd0lGQnliM1pwYzJsdmJtVnlJRWxEUVNBeE1Sc3dHUVlEVlFRSwpEQkpPVmtsRVNVRWdRMjl5Y0c5eVlYUnBiMjR4Q3pBSkJnTlZCQVlUQWxWVE1IWXdFQVlIS29aSXpqMENBUVlGCks0RUVBQ0lEWWdBRXpVZFdxam4xT2xYaExmRk9LQUZUZ2hxRytRM3pGNHhnU0JiWnNVRXlXWUNDM3JLakU5Tm4Kbzg4WnBCUXg4NU9vMFBrcVAyZHdvTVZOVFFNdjVjdnk5akxhVHZTVFhad04ySFFIRTl1N3g3QklZcldpMHNHMwo1cTFJSk5TT0dPNUxvNEhiTUlIWU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHCk1Ed0dBMVVkSHdRMU1ETXdNYUF2b0MyR0syaDBkSEE2THk5amNtd3VibVJwY3k1dWRtbGthV0V1WTI5dEwyTnkKYkM5c01pMW5hREV3TUM1amNtd3dOd1lJS3dZQkJRVUhBUUVFS3pBcE1DY0dDQ3NHQVFVRkJ6QUJoaHRvZEhSdwpPaTh2YjJOemNDNXVaR2x6TG01MmFXUnBZUzVqYjIwd0hRWURWUjBPQkJZRUZDbG95eFlzMEhlVmNxSjVFQVBtCm5yb016QXFVTUI4R0ExVWRJd1FZTUJhQUZBZENvT3NEbklCZ2U2RkJZWmxOcmlYM3dwc2VNQW9HQ0NxR1NNNDkKQkFNREEya0FNR1lDTVFESzBCQ3I0OUROSjQ4WWg1d3UzODhiWmlmREZ4QXNpVVM0VTFmR21wSlpGaENiT0RINgptUndjTXhwNkVPYXladVlDTVFEWUtUeU5jMkZ4V0Z1aEh0ZENFM2xzNFM3U0luZWhkRXJUWk51aEZ5bWM0WU9NCjZWbExXVFkvQ00rcmVzampxeFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpakNDQWhDZ0F3SUJBZ0lRVENWZTNqdlFBYjgvU2p0Z1g4cUppakFLQmdncWhrak9QUVFEQXpBMU1TSXcKSUFZRFZRUUREQmxPVmtsRVNVRWdSR1YyYVdObElFbGtaVzUwYVhSNUlFTkJNUTh3RFFZRFZRUUtEQVpPVmtsRQpTVUV3SUJjTk1qSXdNVEV5TURBd01EQXdXaGdQT1RrNU9URXlNekV5TXpVNU5UbGFNRDB4SGpBY0JnTlZCQU1NCkZVNVdTVVJKUVNCSFNERXdNQ0JKWkdWdWRHbDBlVEViTUJrR0ExVUVDZ3dTVGxaSlJFbEJJRU52Y25CdmNtRjAKYVc5dU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFK3BnK3REVXVJTGxaSUxrNXdnMjJZRUo5T2g2Ywp5UGNzdjNJdmdSV2NWNExlWksxcFRDb1FESXBsWjBFNHFzTEczRzA0cHhzYk1oeGJxa2l6OXBxbFRWMnJ0dVZnClNtSXFuU1lrVTFqV1hzUFM5b1ZMQ0dFOFZSTGwxSnZxeU94VW80SGFNSUhYTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTURzR0ExVWRId1EwTURJd01LQXVvQ3lHS21oMGRIQTZMeTlqY213dQpibVJwY3k1dWRtbGthV0V1WTI5dEwyTnliQzlzTVMxeWIyOTBMbU55YkRBM0JnZ3JCZ0VGQlFjQkFRUXJNQ2t3Ckp3WUlLd1lCQlFVSE1BR0dHMmgwZEhBNkx5OXZZM053TG01a2FYTXViblpwWkdsaExtTnZiVEFkQmdOVkhRNEUKRmdRVUIwS2c2d09jZ0dCN29VRmhtVTJ1SmZmQ214NHdId1lEVlIwakJCZ3dGb0FVVjRYL2cvSmp6R1Y5YUxjNgpXL1NOU3N2N1NWOHdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXhBUElRaG52ZUZ4WUlyUHpCcVZpVDJJMzRTZlM0CkpHV0Zuay8xVWNkbWdKbXArN2w2ckgvQzRxeHdudFlTZ2VZcmxRSXdkalF1b2ZIbmhkMVJMMDlPQk8zNDU2NkoKQzliWUFvc1QvODZjQ29qaUdqaExuYWw5aEpPSDBuUy9scmJhb2M1YQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDQ3pDQ0FaQ2dBd0lCQWdJUUxUWndzY29RQkJIQi9zRG9LZ1piVkRBS0JnZ3Foa2pPUFFRREF6QTFNU0l3CklBWURWUVFEREJsT1ZrbEVTVUVnUkdWMmFXTmxJRWxrWlc1MGFYUjVJRU5CTVE4d0RRWURWUVFLREFaT1ZrbEUKU1VFd0lCY05NakV4TVRBMU1EQXdNREF3V2hnUE9UazVPVEV5TXpFeU16VTVOVGxhTURVeElqQWdCZ05WQkFNTQpHVTVXU1VSSlFTQkVaWFpwWTJVZ1NXUmxiblJwZEhrZ1EwRXhEekFOQmdOVkJBb01CazVXU1VSSlFUQjJNQkFHCkJ5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJBNU1GS003K0tWaVpsamJRU2xnZmt5L1JSbkVRU2NXOU5EWkY4U1gKZ0FXOTZyNnUvVmU4WmdndGNZcFBpMkJTNFZGdTZLZkVJcmhONkZjSEc3V1AwNVcrb00raHhqN255QTFyMWprQgoyUnk3MFlmVGhYM0JhMXpPcnlPUCtNSjl2YU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZGZUYvNFB5WTh4bGZXaTNPbHYwalVyTCswbGZNQjhHQTFVZEl3UVkKTUJhQUZGZUYvNFB5WTh4bGZXaTNPbHYwalVyTCswbGZNQW9HQ0NxR1NNNDlCQU1EQTJrQU1HWUNNUUNQZUZNMwpUQVNzS1FWYVQrOFMwc085dTk3UFZHQ3BFOWQvSTQySVQ3azNVVU9MU1IvcXZKeW5WT0QxdlFLVlhmMENNUUMrCkVZNTVXWW9EQnZzMndQQUgxR3c0TGJjd1VOOFFDZmY4YkZtVjRaeGpDUnI0V1hUTEZIQktqYmZuZUdTQld3QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\", \"evidence\": \"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\", \"arch\": \"HOPPER\"}], \"arch\": \"HOPPER\"}","all_attestations":[{"api_version":"aci/1","workload_keyset_digest":"sha256:fa47ae4c27d5df35d063dd6e0cbd258b8cff1a83b3b974b66ca7cb9fea2d1ec9","attestation":{"tee_type":"tdx","workload_keyset":{"subject":null,"not_after":1790174801,"receipt_signing_keys":[{"key_id":"dstack-kms-receipt-ed25519-v1","algo":"ed25519","public_key":"110f3824daeeef29dbeba9677a5794ffed257b1082d9fd4599b3c0819953aa0a"}],"e2ee_public_keys":[{"key_id":"dstack-kms-e2ee-v1","algo":"secp256k1-aes-256-gcm-hkdf-sha256","public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d"},{"key_id":"dstack-kms-e2ee-x25519-v1","algo":"x25519-aes-256-gcm-hkdf-sha256","public_key":"408e82d159832cfae15007781bcade0badee7d50e9f76d50eaa1777464006537"}],"tls_public_keys":[{"spki_sha256":"22ad6f73dd10547af55d06825c8015413968a439b8f76adc3a6aba9a32e6c71b","domain":"tee.redpill.ai"},{"spki_sha256":"8bafb8e6ddc55e3e662b6385a2820494fc6e90c64688136860b1851a81b7ee06","domain":"inference.phala.com"},{"spki_sha256":"c68585e7dc00a55d3082a9c860cb916e1788c5daec51505e413d27ab94f7d4c7","domain":"api.redpill.ai"}]},"report_data":"79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca","source_provenance":{"repo_url":"https://github.com/Dstack-TEE/private-ai-gateway.git","repo_commit":"b6b5c1b82f6fc59490db5a5255bf4493805e66c6","image_digest":null,"image_provenance":null},"evidence":{"quote":"040002008100000000000000939a7233f79c4ca9940a0db3957f06074d79685452a1c5725d6ff7f9d09c91b4000000000b0105000000000000000000000000007bf063280e94fb051f5dd7b1fc59ce9aac42bb961df8d44b709c9b0ff87a7b4df648657ba6d1189589feab1d5a3c9a9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000702000000000000f06dfda6dce1cf904d4e2bab1dc370634cf95cefa2ceb2de2eee127c9382698090d7a4a13e14c536ec6c9c3c8fa8707701ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6118f0eeb30e9d9178d2b9106dddd002d979b6fa79bdec415051afae2021384c29a32d2f6454fa369617598378ffb5e07e6f51aa763abfe75c3ddfbf4f425fe3f0ceff66d807a75e049303dce9addf68e7218729bd419638af63a370f65878cdf67e467e60edc1737bcf8e682d48131bfb427f523226aa7f197a7608e9b3784783fa759ef5b28191fa12f9ddb36b858f23282cbe6b24708467cc26eca437111e3bed80a2f35bbba448ecee37d3de70407232a8534b9df5635a5646cacd9bbcb79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746cacc1000009be0eb8dcbfe9b11fdda136700e9759503503c803cffd58762ef79a974171c5c44ae77f9a93076aa540bebf9476ad4d89e4982ca210f77d8f6e3cb50134b759df0bfa28939a048d1d67a664ae6595ec4514829a10a01f7fc10230dd75c44697bf80c2e1e89a20ca66c1f76795d1cf5553a394c311bcc4601b9231b111d70d6b506004610000005050a0a05ff00020000000000000000000000000000000000000000000000000000000000000000000000000000000015000000000000000700000000000000e5a3a7b5d830c2953b98534c6c59a3a34fdc34e933f7f5898f0a85cf08846bca0000000000000000000000000000000000000000000000000000000000000000dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c1dc25ab6fd4ae8afb815c1c46f6d3f9bbe7ab053e699d259bf9136751037b20000000000000000000000000000000000000000000000000000000000000000a233764b3a84792c1aa7f165b48fd0eb5e05077a8672b35ad8242d9c544f0d638082a3002dc29b09308131db2a205e5d0782a72a03278473accd29f17c0806442000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f05005e0e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d49494538544343424a656741774942416749555359617753595541735374766a483236625541434d506e6f6a797777436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a59774d7a49784d4463304e5455795768634e4d7a4d774d7a49784d4463304e5455790a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424747690a41664533764c54435150696e5470685047695854516c645948654f6f657257516d4b66745141787939446c63353469446b4b537852786e7a38474f7a466f65690a6b584e532b44374575464864666b476a754e796a67674d4e4d4949444354416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c6d495a7555304e42506c79336e757041556f41396f590a73625a514d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f67594a4b6f5a496876684e415130420a424949434b7a4343416963774867594b4b6f5a496876684e415130424151515162536e396a546e656c37306e456e776e523951666554434341575147436971470a534962345451454e41514977676746554d42414743797147534962345451454e41514942416745464d42414743797147534962345451454e41514943416745460a4d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745434d42414743797147534962345451454e0a41514946416745464d42454743797147534962345451454e41514947416749412f7a415142677371686b69472b453042445145434277494241444151426773710a686b69472b4530424451454343414942416a415142677371686b69472b45304244514543435149424144415142677371686b69472b45304244514543436749420a4144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69472b4530420a44514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b453042445145434477494241444151426773710a686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b45304244514543456751510a425155434167582f4141494141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b453042445145450a424159676f473841414141774477594b4b6f5a496876684e4151304242516f424154416542676f71686b69472b453042445145474242414e78727a30753075620a48784e354e3964353631576d4d45514743697147534962345451454e415163774e6a415142677371686b69472b45304244514548415145422f7a4151426773710a686b69472b45304244514548416745422f7a415142677371686b69472b45304244514548417745422f7a414b42676771686b6a4f5051514441674e49414442460a4169454131305850553751764338564a743949654f724a366c4430744b58462b54746a4e422f6f7a62635235517477434944576e57773946484e7351745359420a70394c5463792f5670376f517367417076763332732f4236576b73760a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","quote_report_data":"79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca","event_log":"[{\"imr\":0,\"event_type\":2147483659,\"digest\":\"5fe4f9ee465a361d077a6892f6bc4d19a82b272fea2e3c2c1ef9c33b4d9050115fca0c6dc7a7f68f91c623de38c48226\",\"event\":\"\",\"event_payload\":\"095464785461626c65000100000000000000af96bb93f2b9b84e9462e0ba745642360090800000000000\"},{\"imr\":0,\"event_type\":2147483658,\"digest\":\"344bc51c980ba621aaa00da3ed7436f7d6e549197dfe699515dfa2c6583d95e6412af21c097d473155875ffd561d6790\",\"event\":\"\",\"event_payload\":\"2946762858585858585858582d585858582d585858582d585858582d58585858585858585858585829000000c0ff000000000040080000000000\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"9dc3a1f80bcec915391dcda5ffbb15e7419f77eab462bbf72b42166fb70d50325e37b36f93537a863769bcf9bedae6fb\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0a00000000000000000000000000000053006500630075007200650042006f006f007400\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"6f2e3cbc14f9def86980f5f66fd85e99d63e69a73014ed8a5633ce56eca5b64b692108c56110e22acadcef58c3250f1b\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0200000000000000000000000000000050004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"d607c0efb41c0d757d69bca0615c3a9ac0b1db06c557d992e906c6b7dee40e0e031640c7bfd7bcd35844ef9edeadc6f9\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c030000000000000000000000000000004b0045004b00\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"08a74f8963b337acb6c93682f934496373679dd26af1089cb4eaf0c30cf260a12e814856385ab8843e56a9acea19e127\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f0200000000000000000000000000000064006200\"},{\"imr\":0,\"event_type\":2147483649,\"digest\":\"18cc6e01f0c6ea99aa23f8a280423e94ad81d96d0aeb5180504fc0f7a40cb3619dd39bd6a95ec1680a86ed6ab0f9828d\",\"event\":\"\",\"event_payload\":\"cbb219d73a3d9645a3bcdad00e67656f03000000000000000000000000000000640062007800\"},{\"imr\":0,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":0,\"event_type\":10,\"digest\":\"2058afc033c14a2558b6b3ce664343eeb2b7941427251330e66ff3f12eb5c5706a9c651eee49d656c38ba3090b29ff43\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"2012337df782407ca9495fe820c6744e398a60731d13a2d11d3cdec1c9541e0946b928b929ff28715cc40bcfd71d92b9\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":0,\"event_type\":10,\"digest\":\"98731e9fce9603662dba3c4f225a117489960615cb2d893e913c903daeaf09528096875ea94610fdb7eba69a5c20e9e3\",\"event\":\"\",\"event_payload\":\"414350492044415441\"},{\"imr\":1,\"event_type\":2147483651,\"digest\":\"90e278aa4d688f4f05bf76f1786fea174abcea0d6b44e81cea5b3327f3f211e5c465a9c34b513283bed2512bca6d4a19\",\"event\":\"\",\"event_payload\":\"1860fd7a0000000000c485000000000000000000000000002a000000000000000403140072f728144ab61e44b8c39ebdd7f893c7040412006b00650072006e0065006c0000007fff0400\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"1dd6f7b457ad880d840d41c961283bab688e94e4b59359ea45686581e90feccea3c624b1226113f824f315eb60ae0a7c\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c0900000000000000020000000000000042006f006f0074004f0072006400650072000000\"},{\"imr\":0,\"event_type\":2147483650,\"digest\":\"23ada07f5261f12f34a0bd8e46760962d6b4d576a416f1fea1c64bc656b1d28eacf7047ae6e967c58fd2a98bfa74c298\",\"event\":\"\",\"event_payload\":\"61dfe48bca93d211aa0d00e098032b8c08000000000000003e0000000000000042006f006f0074003000300030003000090100002c0055006900410070007000000004071400c9bdb87cebf8344faaea3ee4af6516a10406140021aa2c4614760345836e8ab6f46623317fff0400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"77a0dab2312b4e1e57a84d865a21e5b2ee8d677a21012ada819d0a98988078d3d740f6346bfe0abaa938ca20439a8d71\",\"event\":\"\",\"event_payload\":\"43616c6c696e6720454649204170706c69636174696f6e2066726f6d20426f6f74204f7074696f6e\"},{\"imr\":1,\"event_type\":4,\"digest\":\"394341b7182cd227c5c6b07ef8000cdfd86136c4292b8e576573ad7ed9ae41019f5818b4b971c9effc60e1ad9f1289f0\",\"event\":\"\",\"event_payload\":\"00000000\"},{\"imr\":2,\"event_type\":6,\"digest\":\"9c824b958dbbef07ec732fd79727e995d5eca309dbc6d62e4fd2840f267c5e87108b5fe25c7997c67801ff391fb67ffc\",\"event\":\"\",\"event_payload\":\"ed223b8f1a0000004c4f414445445f494d4147453a3a4c6f61644f7074696f6e7300\"},{\"imr\":2,\"event_type\":6,\"digest\":\"5eb4f34f2ec49071551c5562ebaab9f86408f4a0eadaa3d7f05157e37ab04a1f040a82eaae94015d628a7ea4aa482cd2\",\"event\":\"\",\"event_payload\":\"ec223b8f0d0000004c696e757820696e6974726400\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"214b0bef1379756011344877743fdc2a5382bac6e70362d624ccf3f654407c1b4badf7d8f9295dd3dabdef65b27677e0\",\"event\":\"\",\"event_payload\":\"4578697420426f6f7420536572766963657320496e766f636174696f6e\"},{\"imr\":1,\"event_type\":2147483655,\"digest\":\"0a2e01c85deae718a530ad8c6d20a84009babe6c8989269e950d8cf440c6e997695e64d455c4174a652cd080f6230b74\",\"event\":\"\",\"event_payload\":\"4578697420426f6f742053657276696365732052657475726e656420776974682053756363657373\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"f9974020ef507068183313d0ca808e0d1ca9b2d1ad0c61f5784e7157c362c06536f5ddacdad4451693f48fcc72fff624\",\"event\":\"system-preparing\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"8562fc3980258ea5119a31356844547c42ba696d73f6ecdc7d29732beef0083f22674ce14349a8a1400254466e851407\",\"event\":\"app-id\",\"event_payload\":\"fdb7a14e5a6675f752e2cb69c9067a98ca402918\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"3b496ff216c671138e922080e66deabce8a85c8cb628789afa4a93f47566d842d55308dd8cc0f92ab38f1a2578563ee7\",\"event\":\"compose-hash\",\"event_payload\":\"ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"dbb7d7c2c2ce19938fb5989949f2c4bba6829ced5cd7b8c0d98696c293ac1c5dc8b1bfb9bc95b61e2ff778a3686651eb\",\"event\":\"instance-id\",\"event_payload\":\"15e847e02a22706121de347498427469d2e7c379\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"98bd7e6bd3952720b65027fd494834045d06b4a714bf737a06b874638b3ea00ff402f7f583e3e3b05e921c8570433ac6\",\"event\":\"boot-mr-done\",\"event_payload\":\"\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"65828c6f922910fd0e272501a8b2bb6b03e24c99bb19d1cd530586061d8738f9dd0564752db23d556a6b381cbf465a85\",\"event\":\"mr-kms\",\"event_payload\":\"692afc6d7a86a32cfc1ebd9cad1a576aab012bab46986ba609bc8d6407270572\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"c936f709860155a455c519b505fe29bde21d1b778534a8f0b41b706b0f789eae2ea899e224fedb2331c18324aab4db93\",\"event\":\"os-image-hash\",\"event_payload\":\"bd369a8c2f9edb2b52dad48ac8e0b32dde5f1337c423a506b48d07403a7d8033\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"83368b43a0fc6f824f5a9220592df85fd30e2d405ecbd253a5c6354af63e6c9b41aec557c38a38e348ab87f9ac8fc68c\",\"event\":\"key-provider\",\"event_payload\":\"7b226e616d65223a226b6d73222c226964223a223330353933303133303630373261383634386365336430323031303630383261383634386365336430333031303730333432303030343838343465623432636364663863353266643466313734663336326663623962626431396334356664343866316564656332643866316361323335333665633161373430323162346365653631306330373466383239346434333162326237666565326333396535333333666461663061343532326434336662313539643966227d\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"ba51104636900268b0e059fa3d266419d079d1e94aea26fb9fcbb8d764bf4c89a67ac271b8a0d1a3989945132a111fc7\",\"event\":\"storage-fs\",\"event_payload\":\"7a6673\"},{\"imr\":3,\"event_type\":134217729,\"digest\":\"1a76b2a80a0be71eae59f80945d876351a7a3fb8e9fd1ff1cede5734aa84ea11fd72b4edfbb6f04e5a85edd114c751bd\",\"event\":\"system-ready\",\"event_payload\":\"\"}]","vm_config":"{\"os_image_hash\":\"bd369a8c2f9edb2b52dad48ac8e0b32dde5f1337c423a506b48d07403a7d8033\",\"cpu_count\":16,\"memory_size\":34359738368,\"qemu_version\":\"8.2.2\",\"pci_hole64_size\":0,\"hugepages\":false,\"num_gpus\":0,\"num_nvswitches\":0,\"hotplug_off\":false,\"image\":\"dstack-0.5.9-bd369a8c\",\"host_share_mode\":\"9p\",\"spec_version\":1}","app_compose":"{\"allowed_envs\":[\"PRIVATE_AI_GATEWAY_ADMIN_TOKEN\",\"PRIVATE_AI_GATEWAY_CONTROL_URL\",\"PRIVATE_AI_GATEWAY_CONTROL_TOKEN\",\"DSTACK_ROOT_PUBLIC_KEY\",\"CLOUDFLARE_API_TOKEN\",\"CERTBOT_EMAIL\",\"NODE_EXPORTER_USER\",\"NODE_EXPORTER_PASSWORD_HASH\"],\"docker_compose_file\":\"# dstack / Phala deployment manifest for the private-ai-gateway stack via the launcher.\\n#\\n# The launcher image is the measured trust-root: pin it by @sha256 digest (the\\n# digest + this file are hashed into the TDX quote). The launcher clones+builds\\n# the gateway from source at boot; the attestation verifier is\\n# the gateway's vendored confidential_verifier package, so it needs no separate pin.\\n#\\n# The gateway's source pin + static config are inlined as compose `configs:`\\n# (measured into the attestation): the launcher clones the pin and the gateway\\n# reads the config from mounted files. Secret values are supplied as dstack\\n# ENCRYPTED SECRETS and referenced as ${VAR} so dstack injects them — only the\\n# variable names appear in this public file, never the values.\\n\\nservices:\\n  # TLS-terminating ingress: requests CAA-pinned Let's Encrypt certs via Cloudflare\\n  # DNS-01, registers under the dstack gateway domain, and reverse-proxies inbound\\n  # 443 to the launcher's gateway on :8086. Pin by @sha256 digest like the launcher.\\n  dstack-ingress:\\n    image: dstacktee/dstack-ingress:2.2@sha256:d05a7b343c37c1cca1bba8dbf7e8f3c6d2118158af2d41c455103796db4f67f0\\n    restart: unless-stopped\\n    ports:\\n      - \\\"443:443\\\"\\n    environment:\\n      # --- public config: literals, measured into the attestation ---\\n      DNS_PROVIDER: cloudflare\\n      GATEWAY_DOMAIN: _.${DSTACK_GATEWAY_DOMAIN}\\n      SET_CAA: \\\"true\\\"\\n      # Multi-domain TLS. The ingress is an L4 (TCP) proxy: it terminates TLS for\\n      # each hostname and forwards the DECRYPTED stream untouched, so the client's\\n      # original HTTP Host survives. The gateway uses that Host to pick the\\n      # matching downstream_tls_binding. Both public hostnames route by SNI to the\\n      # same gateway listener (compose service name, not localhost).\\n      DOMAINS: |\\n        tee.redpill.ai\\n        inference.phala.com\\n        api.redpill.ai\\n      ROUTING_MAP: |\\n        tee.redpill.ai=launcher:8086\\n        inference.phala.com=launcher:8086\\n        api.redpill.ai=launcher:8086\\n      # --- secrets: values come from dstack Encrypted Secrets (never commit values) ---\\n      # NOTE: this single Cloudflare token must have DNS-edit (and CAA) rights on\\n      # BOTH the redpill.ai and phala.com zones, or cert issuance for one fails.\\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN}\\n      CERTBOT_EMAIL: ${CERTBOT_EMAIL}\\n    volumes:\\n      - /var/run/dstack.sock:/var/run/dstack.sock\\n      - /var/run/tappd.sock:/var/run/tappd.sock\\n      - cert-data:/etc/letsencrypt\\n      # Per-domain leaf certs (cert-<domain>.pem) the gateway reads to bind SPKI.\\n      - evidences:/evidences\\n\\n  launcher:\\n    image: ghcr.io/redpill-ai/private-ai-launcher@sha256:c083ff9e6a5ddf10f6c9e9bb1f74cc618deebecfea5208b563c574399db4637c\\n    restart: always\\n    # The gateway opens many fds (inbound conns, per-upstream pools, control-plane\\n    # + verifier calls). Docker's default nofile (often 1024) is far too low: under\\n    # load it hit EMFILE (\\\"Too many open files\\\"), which killed the gateway's accept\\n    # loop. Raise the limit well above peak concurrency.\\n    ulimits:\\n      nofile:\\n        soft: 65536\\n        hard: 65536\\n    # supervisord streams the gateway logs to the container stdout; cap the\\n    # runtime log on disk so it can't grow unbounded (~5GB total, rotated).\\n    # Sized for the gateway's always-on request_outcome failure logging:\\n    # roughly a month of retention on the persistent volume for incident\\n    # forensics.\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"500m\\\"\\n        max-file: \\\"10\\\"\\n    # no host port: traffic enters via dstack-ingress (443) and reaches the\\n    # gateway over the compose network as http://launcher:8086.\\n    expose:\\n      - \\\"8086\\\"\\n    volumes:\\n      - /var/run/dstack.sock:/var/run/dstack.sock   # only the gateway uses this\\n      - pal-cache:/var/lib/pag/cache                 # cargo/uv build cache (speeds reboots)\\n      - pal-state:/var/lib/pag/state                 # mutable upstreams.json + sessions.jsonl\\n      - evidences:/evidences:ro                      # ingress-minted per-domain leaf certs (cert-<domain>.pem)\\n    # Static gateway config + upstream seed are mounted from the `configs:` block\\n    # at the bottom (measured into the attestation). The source pin is passed via\\n    # `environment:` instead (see below).\\n    configs:\\n      - source: gateway-config\\n        target: /etc/private-ai-gateway/gateway.config.json\\n      - source: gateway-upstreams\\n        target: /etc/private-ai-gateway/upstreams.seed.json\\n    environment:\\n      # The gateway reads its whole policy from this mounted static config file\\n      # (see `configs:` above); CONFIG_PATH is the only gateway-facing env var.\\n      - PRIVATE_AI_GATEWAY_CONFIG_PATH=/etc/private-ai-gateway/gateway.config.json\\n      # Tracing filter. `request_outcome=debug` turns on the raw error-detail\\n      # field of the per-request failure log — a deliberate operator choice:\\n      # upstream error bodies may echo request fragments into these\\n      # operator-visible logs. Drop the `request_outcome=debug` part to fall\\n      # back to content-free failure logging only.\\n      - RUST_LOG=info,request_outcome=debug\\n      # Gateway source pin. These literals are measured into the attestation, and\\n      # because they live in `environment:` (part of Compose's config-hash) a\\n      # COMMIT_SHA bump forces a container recreate on `phala deploy` — so the new\\n      # pin actually takes effect. (A `configs:`-file pin would not: Compose ignores\\n      # config content when deciding to recreate, so the change would never apply.)\\n      # entrypoint.sh writes /etc/git-launcher/gateway.conf from these, and the\\n      # gateway reads that file as its attested source provenance.\\n      - PRIVATE_AI_GATEWAY_REPO_URL=https://github.com/Dstack-TEE/private-ai-gateway.git\\n      - PRIVATE_AI_GATEWAY_REPO_COMMIT=b6b5c1b82f6fc59490db5a5255bf4493805e66c6\\n      # NEAR AI verification posts TDX quotes to the dstack-verifier sidecar below;\\n      # reach it by compose service name (localhost would be the launcher itself).\\n      - DSTACK_VERIFIER_URL=http://dstack-verifier:8080\\n      # --- secrets: values come from dstack Encrypted Secrets (never commit values) ---\\n      # Control-plane credentials. The gateway's in-process middleware reads these\\n      # from the `middleware` config section below (rendered from the same secrets).\\n      - PRIVATE_AI_GATEWAY_CONTROL_URL=${PRIVATE_AI_GATEWAY_CONTROL_URL}\\n      - PRIVATE_AI_GATEWAY_CONTROL_TOKEN=${PRIVATE_AI_GATEWAY_CONTROL_TOKEN}\\n\\n  # TDX quote verifier for the NEAR AI path (reproduces ACPI/boot measurements via\\n  # QEMU). The gateway reaches it at http://dstack-verifier:8080 (DSTACK_VERIFIER_URL).\\n  dstack-verifier:\\n    image: dstacktee/dstack-verifier:0.5.11@sha256:06a20b777e59196c7f54b0cd02ffe567df6d05ae39a0b2fea9cb0642fb23c1fd\\n    restart: unless-stopped\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"50m\\\"\\n        max-file: \\\"5\\\"\\n\\n  # Host-metrics exporter for observing this CVM (CPU/mem/disk/net/fd). Inside a\\n  # CVM the container's /, /proc, /sys ARE the guest's, so node-exporter reports\\n  # the CVM's own state. Pinned by @sha256 like the other images (measured into\\n  # the attestation). Exposed on 9100 (reached via the dstack gateway) and guarded\\n  # by HTTP basic auth — both username and the bcrypt password HASH are injected as\\n  # dstack Encrypted Secrets, so neither appears in this measured file.\\n  node-exporter:\\n    image: prom/node-exporter:v1.8.2@sha256:4032c6d5bfd752342c3e631c2f1de93ba6b86c41db6b167b9a35372c139e7706\\n    restart: unless-stopped\\n    pid: host\\n    command:\\n      - '--path.rootfs=/host'\\n      - '--path.procfs=/host/proc'\\n      - '--path.sysfs=/host/sys'\\n      - '--web.config.file=/etc/node-exporter/web-config.yml'\\n    volumes:\\n      - /:/host:ro,rslave\\n    configs:\\n      - source: node-exporter-web-config\\n        target: /etc/node-exporter/web-config.yml\\n    ports:\\n      - \\\"9100:9100\\\"\\n    logging:\\n      driver: json-file\\n      options:\\n        max-size: \\\"10m\\\"\\n        max-file: \\\"3\\\"\\n\\nvolumes:\\n  pal-cache:\\n  pal-state:\\n  cert-data:   # Let's Encrypt certs/keys persisted for dstack-ingress\\n  evidences:   # ingress attestation evidence + per-domain leaf certs, shared read-only with the gateway\\n\\n# Inlined, measured into the attestation. Public pins use LITERAL values so the\\n# code version is bound into compose_hash; only secrets use ${VAR} (injected by\\n# dstack, never measured).\\nconfigs:\\n  # Static gateway config. `admin_token` and the control-plane credentials are the\\n  # only secrets here — ${VAR} keeps them out of the measured compose. The\\n  # `middleware` section runs the in-process middleware, which consults the control\\n  # plane at `control_url`.\\n  gateway-config:\\n    content: |\\n      {\\n        \\\"bind\\\": \\\"0.0.0.0:8086\\\",\\n        \\\"state_dir\\\": \\\"/var/lib/pag/state\\\",\\n        \\\"upstream_config_seed_path\\\": \\\"/etc/private-ai-gateway/upstreams.seed.json\\\",\\n        \\\"admin_token\\\": \\\"${PRIVATE_AI_GATEWAY_ADMIN_TOKEN:?set PRIVATE_AI_GATEWAY_ADMIN_TOKEN}\\\",\\n        \\\"tls\\\": {\\n          \\\"domain_certificates\\\": [\\n            { \\\"domain\\\": \\\"tee.redpill.ai\\\", \\\"certificate_path\\\": \\\"/evidences/cert-tee.redpill.ai.pem\\\" },\\n            { \\\"domain\\\": \\\"inference.phala.com\\\", \\\"certificate_path\\\": \\\"/evidences/cert-inference.phala.com.pem\\\" },\\n            { \\\"domain\\\": \\\"api.redpill.ai\\\", \\\"certificate_path\\\": \\\"/evidences/cert-api.redpill.ai.pem\\\" }\\n          ]\\n        },\\n        \\\"middleware\\\": {\\n          \\\"control_url\\\": \\\"${PRIVATE_AI_GATEWAY_CONTROL_URL:?set PRIVATE_AI_GATEWAY_CONTROL_URL}\\\",\\n          \\\"control_token\\\": \\\"${PRIVATE_AI_GATEWAY_CONTROL_TOKEN:?set PRIVATE_AI_GATEWAY_CONTROL_TOKEN}\\\",\\n          \\\"tee_only_domains\\\": [\\\"tee.redpill.ai\\\", \\\"inference.phala.com\\\"]\\n        }\\n      }\\n  # Initial upstream routes: seeded into <state_dir>/upstreams.json only when empty,\\n  # then managed at runtime via PUT /v1/admin/upstreams (does not touch this file).\\n  gateway-upstreams:\\n    content: |\\n      []\\n  # node-exporter basic-auth credentials. exporter-toolkit's basic_auth_users maps\\n  # username -> bcrypt hash; both are ${VAR} so dstack substitutes the injected\\n  # secret values when rendering this file into the container — only the literals\\n  # are measured. NODE_EXPORTER_PASSWORD_HASH must be a bcrypt hash\\n  # (`htpasswd -nBC 10 \\\"\\\" | tr -d ':\\\\n'`), NOT the plaintext password; the plaintext\\n  # goes to the external Prometheus scrape config.\\n  node-exporter-web-config:\\n    content: |\\n      basic_auth_users:\\n        ${NODE_EXPORTER_USER:?set NODE_EXPORTER_USER}: ${NODE_EXPORTER_PASSWORD_HASH:?set NODE_EXPORTER_PASSWORD_HASH}\\n\",\"features\":[\"kms\",\"tproxy-net\"],\"gateway_enabled\":true,\"kms_enabled\":true,\"local_key_provider_enabled\":false,\"manifest_version\":2,\"name\":\"\",\"no_instance_id\":false,\"pre_launch_script\":\"#!/bin/bash\\necho \\\"----------------------------------------------\\\"\\necho \\\"Running Phala Cloud Pre-Launch Script v0.0.15\\\"\\necho \\\"----------------------------------------------\\\"\\nset -e\\n\\n# Function: notify host\\n\\nnotify_host() {\\n    if command -v dstack-util >/dev/null 2>&1; then\\n        dstack-util notify-host -e \\\"$1\\\" -d \\\"$2\\\"\\n    else\\n        tdxctl notify-host -e \\\"$1\\\" -d \\\"$2\\\"\\n    fi\\n}\\n\\nnotify_host_hoot_info() {\\n    notify_host \\\"boot.progress\\\" \\\"$1\\\"\\n}\\n\\nnotify_host_hoot_error() {\\n    notify_host \\\"boot.error\\\" \\\"$1\\\"\\n}\\n\\n# Function: Perform Docker cleanup\\nperform_cleanup() {\\n    echo \\\"Pruning unused images\\\"\\n    docker image prune -af\\n    echo \\\"Pruning unused volumes\\\"\\n    docker volume prune -f\\n    notify_host_hoot_info \\\"docker cleanup completed\\\"\\n}\\n\\n# Function: Check Docker login status without exposing credentials\\ncheck_docker_login() {\\n    local registry=\\\"$1\\\"\\n\\n    # When registry is specified, check auth entry for that registry in Docker config\\n    if [[ -n \\\"$registry\\\" ]]; then\\n        local docker_config_path=\\\"${DOCKER_CONFIG:-$HOME/.docker}/config.json\\\"\\n        if [[ -f \\\"$docker_config_path\\\" ]] && grep -q \\\"$registry\\\" \\\"$docker_config_path\\\"; then\\n            return 0\\n        else\\n            return 1\\n        fi\\n    fi\\n\\n    # Fallback check when no explicit registry is provided\\n    if docker info 2>/dev/null | grep -q \\\"Username\\\"; then\\n        return 0\\n    else\\n        return 1\\n    fi\\n}\\n\\n# Main logic starts here\\necho \\\"Starting login process...\\\"\\n\\n# Check if Docker credentials exist\\nif [[ -n \\\"$DSTACK_DOCKER_USERNAME\\\" && -n \\\"$DSTACK_DOCKER_PASSWORD\\\" ]]; then\\n    echo \\\"Docker credentials found\\\"\\n    DOCKER_REGISTRY_TARGET=\\\"${DSTACK_DOCKER_REGISTRY:-docker.io}\\\"\\n    echo \\\"Target Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n\\n    # Check if already logged in\\n    if check_docker_login \\\"$DSTACK_DOCKER_REGISTRY\\\"; then\\n        echo \\\"Already logged in to Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n    else\\n        echo \\\"Logging in to Docker registry: $DOCKER_REGISTRY_TARGET\\\"\\n        # Login without exposing password in process list\\n        if [[ -n \\\"$DSTACK_DOCKER_REGISTRY\\\" ]]; then\\n            echo \\\"$DSTACK_DOCKER_PASSWORD\\\" | docker login -u \\\"$DSTACK_DOCKER_USERNAME\\\" --password-stdin \\\"$DSTACK_DOCKER_REGISTRY\\\"\\n        else\\n            echo \\\"$DSTACK_DOCKER_PASSWORD\\\" | docker login -u \\\"$DSTACK_DOCKER_USERNAME\\\" --password-stdin\\n        fi\\n\\n        if [ $? -eq 0 ]; then\\n            echo \\\"Docker login successful: $DOCKER_REGISTRY_TARGET\\\"\\n        else\\n            echo \\\"Docker login failed: $DOCKER_REGISTRY_TARGET\\\"\\n            notify_host_hoot_error \\\"docker login failed\\\"\\n            exit 1\\n        fi\\n    fi\\n# Check if AWS ECR credentials exist\\nelif [[ -n \\\"$DSTACK_AWS_ACCESS_KEY_ID\\\" && -n \\\"$DSTACK_AWS_SECRET_ACCESS_KEY\\\" && -n \\\"$DSTACK_AWS_REGION\\\" && -n \\\"$DSTACK_AWS_ECR_REGISTRY\\\" ]]; then\\n    echo \\\"AWS ECR credentials found\\\"\\n\\n    # Check if AWS CLI is installed\\n    if [ ! -f \\\"./aws/dist/aws\\\" ]; then\\n        notify_host_hoot_info \\\"awscli not installed, installing...\\\"\\n        echo \\\"AWS CLI not installed, installing...\\\"\\n        curl \\\"https://awscli.amazonaws.com/awscli-exe-linux-x86_64-2.24.14.zip\\\" -o \\\"awscliv2.zip\\\"\\n        echo \\\"6ff031a26df7daebbfa3ccddc9af1450 awscliv2.zip\\\" | md5sum -c\\n        if [ $? -ne 0 ]; then\\n            echo \\\"MD5 checksum failed\\\"\\n            notify_host_hoot_error \\\"awscli install failed\\\"\\n            exit 1\\n        fi\\n        unzip awscliv2.zip &> /dev/null\\n    else\\n        echo \\\"AWS CLI is already installed: ./aws/dist/aws\\\"\\n    fi\\n\\n    # Set AWS credentials as environment variables\\n    export AWS_ACCESS_KEY_ID=\\\"$DSTACK_AWS_ACCESS_KEY_ID\\\"\\n    export AWS_SECRET_ACCESS_KEY=\\\"$DSTACK_AWS_SECRET_ACCESS_KEY\\\"\\n    export AWS_DEFAULT_REGION=\\\"$DSTACK_AWS_REGION\\\"\\n\\n    # Set session token if provided (for temporary credentials)\\n    if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n        echo \\\"AWS session token found, using temporary credentials\\\"\\n        export AWS_SESSION_TOKEN=\\\"$DSTACK_AWS_SESSION_TOKEN\\\"\\n    fi\\n\\n    # Test AWS credentials before attempting ECR login\\n    echo \\\"Testing AWS credentials...\\\"\\n    if ! ./aws/dist/aws sts get-caller-identity &> /dev/null; then\\n        echo \\\"AWS credentials test failed\\\"\\n        # For session token credentials, this might be expected if they're expired\\n        # Log warning but don't fail startup\\n        if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n            echo \\\"Warning: AWS temporary credentials may have expired, continuing startup\\\"\\n            notify_host_hoot_info \\\"AWS temporary credentials may have expired\\\"\\n        else\\n            echo \\\"AWS credentials test failed\\\"\\n            notify_host_hoot_error \\\"Invalid AWS credentials\\\"\\n            exit 1\\n        fi\\n    else\\n        echo \\\"Logging in to AWS ECR...\\\"\\n        ./aws/dist/aws ecr get-login-password --region $DSTACK_AWS_REGION | docker login --username AWS --password-stdin \\\"$DSTACK_AWS_ECR_REGISTRY\\\"\\n        if [ $? -eq 0 ]; then\\n            echo \\\"AWS ECR login successful\\\"\\n            notify_host_hoot_info \\\"AWS ECR login successful\\\"\\n        else\\n            echo \\\"AWS ECR login failed\\\"\\n            # For session token credentials, don't fail startup if login fails\\n            if [[ -n \\\"$DSTACK_AWS_SESSION_TOKEN\\\" ]]; then\\n                echo \\\"Warning: AWS ECR login failed with temporary credentials, continuing startup\\\"\\n                notify_host_hoot_info \\\"AWS ECR login failed with temporary credentials\\\"\\n            else\\n                notify_host_hoot_error \\\"AWS ECR login failed\\\"\\n                exit 1\\n            fi\\n        fi\\n    fi\\nfi\\n\\nperform_cleanup\\n\\n#\\n# GHCR image pull access verification (pure HTTP, no docker daemon)\\n#\\nif [[ \\\"$DOCKER_REGISTRY_TARGET\\\" == \\\"ghcr.io\\\" && -n \\\"$DSTACK_DOCKER_USERNAME\\\" && -n \\\"$DSTACK_DOCKER_PASSWORD\\\" ]]; then\\n    COMPOSE_IMAGES=$(grep 'image:' /dstack/docker-compose.yaml 2>/dev/null | awk '{print $2}' | tr -d '\\\"'\\\"'\\\" || true)\\n    for img in $COMPOSE_IMAGES; do\\n        [[ \\\"$img\\\" != ghcr.io/* ]] && continue\\n        repo=\\\"${img#ghcr.io/}\\\"; repo=\\\"${repo%%:*}\\\"\\n        tag=\\\"${img##*:}\\\"; [[ \\\"$tag\\\" == \\\"$img\\\" || \\\"$tag\\\" == \\\"$repo\\\" ]] && tag=\\\"latest\\\"\\n        echo \\\"Verifying GHCR pull access: $img\\\"\\n        token=$(curl -sf -u \\\"$DSTACK_DOCKER_USERNAME:$DSTACK_DOCKER_PASSWORD\\\"             \\\"https://ghcr.io/token?service=ghcr.io&scope=repository:${repo}:pull\\\" | jq -r '.token // empty' || true)\\n        if [[ -z \\\"$token\\\" ]]; then\\n            echo \\\"ERROR: GHCR token exchange failed for $img\\\"\\n            notify_host_hoot_error \\\"GHCR token exchange failed: $img\\\"\\n            exit 1\\n        fi\\n        http_code=$(curl -s -o /dev/null -w \\\"%{http_code}\\\" -H \\\"Authorization: Bearer $token\\\"             -H \\\"Accept: application/vnd.oci.image.index.v1+json,application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.list.v2+json,application/vnd.docker.distribution.manifest.v2+json\\\"             \\\"https://ghcr.io/v2/${repo}/manifests/${tag}\\\")\\n        if [[ \\\"$http_code\\\" != \\\"200\\\" ]]; then\\n            echo \\\"ERROR: GHCR pull access denied for $img (HTTP $http_code)\\\"\\n            notify_host_hoot_error \\\"GHCR pull access denied: $img (HTTP $http_code)\\\"\\n            exit 1\\n        fi\\n        echo \\\"GHCR pull access OK: $img\\\"\\n    done\\nfi\\n\\n#\\n# Pull latest images from docker-compose.yaml so existing CVMs pick up new tags.\\n# Pull is fail-soft: short-lived tokens may expire between login and pull, but\\n# falling back to already-cached images is preferable to blocking boot.\\n#\\necho \\\"Images before pull:\\\"\\ndocker images --format '{{.Repository}}:{{.Tag}} {{.ID}} ({{.CreatedSince}})'\\n\\necho \\\"Pulling latest images from /dstack/docker-compose.yaml...\\\"\\nif docker compose -f /dstack/docker-compose.yaml pull; then\\n    echo \\\"docker compose pull completed\\\"\\n    notify_host_hoot_info \\\"docker compose pull completed\\\"\\nelse\\n    echo \\\"WARNING: docker compose pull failed; continuing with existing images\\\"\\n    notify_host_hoot_info \\\"docker compose pull failed; using existing images\\\"\\nfi\\n\\necho \\\"Images after pull:\\\"\\ndocker images --format '{{.Repository}}:{{.Tag}} {{.ID}} ({{.CreatedSince}})'\\n\\n#\\n# Set root password.\\n#\\necho \\\"Setting root password..\\\"\\n\\n# Check if password files are writable\\nPASSWD_WRITABLE=true\\nif [ ! -w /etc/passwd ]; then\\n    echo \\\"Warning: /etc/passwd is read-only\\\"\\n    PASSWD_WRITABLE=false\\nfi\\nif [ ! -w /etc/shadow ]; then\\n    echo \\\"Warning: /etc/shadow is read-only\\\"\\n    PASSWD_WRITABLE=false\\nfi\\n\\nif [ \\\"$PASSWD_WRITABLE\\\" = \\\"false\\\" ]; then\\n    echo \\\"Skipping password setup due to read-only file system\\\"\\nelse\\n    # Check if chpasswd is available\\n    if command -v chpasswd >/dev/null 2>&1; then\\n        echo \\\"Using chpasswd method\\\"\\n\\n        if [ -n \\\"$DSTACK_ROOT_PASSWORD\\\" ]; then\\n            echo \\\"Setting root password from user..\\\"\\n            echo \\\"root:$DSTACK_ROOT_PASSWORD\\\" | chpasswd\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set/updated from DSTACK_ROOT_PASSWORD\\\"\\n        elif [ -z \\\"$(grep '^root:' /etc/shadow 2>/dev/null | cut -d: -f2)\\\" ]; then\\n            echo \\\"Setting random root password..\\\"\\n            DSTACK_ROOT_PASSWORD=$(\\n                LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null\\n            )\\n            echo \\\"root:$DSTACK_ROOT_PASSWORD\\\" | chpasswd\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set (random auto-init)\\\"\\n        else\\n            echo \\\"Root password already set; no changes.\\\"\\n        fi\\n    else\\n        echo \\\"Using passwd method\\\"\\n\\n        if [ -n \\\"$DSTACK_ROOT_PASSWORD\\\" ]; then\\n            echo \\\"Setting root password from user..\\\"\\n            echo \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd --stdin root 2>/dev/null                 || printf '%s\\n%s\\n' \\\"$DSTACK_ROOT_PASSWORD\\\" \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd root\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set/updated from DSTACK_ROOT_PASSWORD\\\"\\n        elif [ -z \\\"$(grep '^root:' /etc/shadow 2>/dev/null | cut -d: -f2)\\\" ]; then\\n            echo \\\"Setting random root password..\\\"\\n            DSTACK_ROOT_PASSWORD=$(\\n                LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null\\n            )\\n            echo \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd --stdin root 2>/dev/null                 || printf '%s\\n%s\\n' \\\"$DSTACK_ROOT_PASSWORD\\\" \\\"$DSTACK_ROOT_PASSWORD\\\" | passwd root\\n            unset DSTACK_ROOT_PASSWORD\\n            echo \\\"Root password set (random auto-init)\\\"\\n        else\\n            echo \\\"Root password already set; no changes.\\\"\\n        fi\\n    fi\\nfi\\n\\n#\\n# Set SSH authorized keys\\n#\\nif mkdir -p /home/root/.ssh 2>/dev/null; then\\n    if [[ -n \\\"$DSTACK_ROOT_PUBLIC_KEY\\\" ]]; then\\n        echo \\\"$DSTACK_ROOT_PUBLIC_KEY\\\" > /home/root/.ssh/authorized_keys\\n        unset $DSTACK_ROOT_PUBLIC_KEY\\n        echo \\\"Root public key set\\\"\\n    fi\\n    if [[ -n \\\"$DSTACK_AUTHORIZED_KEYS\\\" ]]; then\\n        echo \\\"$DSTACK_AUTHORIZED_KEYS\\\" > /home/root/.ssh/authorized_keys\\n        unset $DSTACK_AUTHORIZED_KEYS\\n        echo \\\"Root authorized_keys set\\\"\\n    fi\\n\\n    if [[ -f /dstack/user_config ]] && jq empty /dstack/user_config 2>/dev/null; then\\n        if [[ $(jq 'has(\\\"ssh_authorized_keys\\\")' /dstack/user_config 2>/dev/null) == \\\"true\\\" ]]; then\\n            jq -j '.ssh_authorized_keys' /dstack/user_config >> /home/root/.ssh/authorized_keys\\n            # Remove duplicates if there are multiple keys\\n            if [[ $(cat /home/root/.ssh/authorized_keys | wc -l) -gt 1 ]]; then\\n                sort -u /home/root/.ssh/authorized_keys > /home/root/.ssh/authorized_keys.tmp\\n                mv /home/root/.ssh/authorized_keys.tmp /home/root/.ssh/authorized_keys\\n            fi\\n            echo \\\"Set root authorized_keys from user preferences, total\\\" $(cat /home/root/.ssh/authorized_keys | wc -l) \\\"keys\\\"\\n        fi\\n    fi\\nelse\\n    echo \\\"Warning: Cannot create /home/root/.ssh directory (read-only file system?)\\\"\\n    echo \\\"Skipping SSH key setup\\\"\\nfi\\n\\nif [[ -S /var/run/dstack.sock ]]; then\\n    export DSTACK_APP_ID=$(curl -s --unix-socket /var/run/dstack.sock http://dstack/Info | jq -j .app_id)\\nelif [[ -S /var/run/tappd.sock ]]; then\\n    export DSTACK_APP_ID=$(curl -s --unix-socket /var/run/tappd.sock http://dstack/prpc/Tappd.Info | jq -j .app_id)\\nfi\\n# Check if DSTACK_GATEWAY_DOMAIN is not set, try to get it from user_config or app-compose.json\\n# Priority: user_config > app-compose.json\\nif [[ -z \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]]; then\\n    # First try to get from /dstack/user_config if it exists and is valid JSON\\n    if [[ -f /dstack/user_config ]] && jq empty /dstack/user_config 2>/dev/null; then\\n        if [[ $(jq 'has(\\\"default_gateway_domain\\\")' /dstack/user_config 2>/dev/null) == \\\"true\\\" ]]; then\\n            export DSTACK_GATEWAY_DOMAIN=$(jq -j '.default_gateway_domain' /dstack/user_config)\\n        fi\\n    fi\\n\\n    # If still not set, try to get from app-compose.json\\n    if [[ -z \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]] && [[ $(jq 'has(\\\"default_gateway_domain\\\")' app-compose.json) == \\\"true\\\" ]]; then\\n        export DSTACK_GATEWAY_DOMAIN=$(jq -j '.default_gateway_domain' app-compose.json)\\n    fi\\nfi\\nif [[ -n \\\"$DSTACK_GATEWAY_DOMAIN\\\" ]]; then\\n    export DSTACK_APP_DOMAIN=$DSTACK_APP_ID\\\".\\\"$DSTACK_GATEWAY_DOMAIN\\nfi\\n\\necho \\\"----------------------------------------------\\\"\\necho \\\"Script execution completed\\\"\\necho \\\"----------------------------------------------\\\"\\n\",\"public_logs\":true,\"public_sysinfo\":true,\"public_tcbinfo\":true,\"runner\":\"docker-compose\",\"secure_time\":false,\"storage_fs\":\"zfs\",\"tproxy_enabled\":true}","key_custody":{"provider":"dstack-kms","keys":[{"role":"receipt","path":"aci/receipt-ed25519/v1","purpose":"aci.receipt.ed25519.v1","algo":"ed25519","public_key":"110f3824daeeef29dbeba9677a5794ffed257b1082d9fd4599b3c0819953aa0a","kms_public_key":"02f7fb3ed8c352d316dfdc19458a9f29c06eb7e74130b3808d784e2fd401a2c12d","signature_chain":["d1f59335effc2688acdf502ee34d8d3373b0e7e6be493075383714ce5673a29973f224690437c483ae3fdd37172df3abad82877c4023ed7c5a64d5acaf18477c00","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]},{"role":"e2ee-secp256k1","path":"aci/e2ee/v1","purpose":"aci.e2ee.v1","algo":"secp256k1-aes-256-gcm-hkdf-sha256","public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d","kms_public_key":"03943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f","signature_chain":["452d6f86a807fef0ce0d65e6c5cd25a0a249b1fd8608d26c3efe17fc10346f4c2d3dfb8969d10dc1feac1d595b3816f63faa40ac370a3a233ce1d712d418c89701","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]},{"role":"e2ee-x25519","path":"aci/e2ee-x25519/v1","purpose":"aci.e2ee.x25519.v1","algo":"x25519-aes-256-gcm-hkdf-sha256","public_key":"408e82d159832cfae15007781bcade0badee7d50e9f76d50eaa1777464006537","kms_public_key":"03892f86b3f55f78cc0760cec933cf8e2a92862fb173c2d221cc25895847cbb5eb","signature_chain":["358cd661ca4f5e986ed950ca083bf7bcfef6ab4b839ca11a953b156d64f82b1c51a213730d5777b4c845170827680d41e8220c2f950a38081025ff16eb3789ba00","5c2fe36bdb1e434c0a371579bcbce07c4e7b89eba45affa089191baec84f23ad77b24a594aa28427b6b7a5f348b0ecf5597abfd9a2add05ddb55c521ba38a38501"]}]},"downstream_tls_binding":{"domain":"api.redpill.ai","spki_sha256":"c68585e7dc00a55d3082a9c860cb916e1788c5daec51505e413d27ab94f7d4c7"}}},"service_capabilities":{"supported_e2ee_versions":["2"],"serving":"aggregator"},"signing_public_key":"04943cea0b4babf60f6e2031e9a00866a37c4ae696fb45895b3a9b38ab8cbb898f42c85b704aceaa0a396cf26f7fdf79d83205be7e11d3a5d70419a68277158c3d","signing_algo":"ecdsa","signing_address":"0x79a5061efe5a46b0d1f33b11cf1c5adbedae6b79","intel_quote":"040002008100000000000000939a7233f79c4ca9940a0db3957f06074d79685452a1c5725d6ff7f9d09c91b4000000000b0105000000000000000000000000007bf063280e94fb051f5dd7b1fc59ce9aac42bb961df8d44b709c9b0ff87a7b4df648657ba6d1189589feab1d5a3c9a9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000702000000000000f06dfda6dce1cf904d4e2bab1dc370634cf95cefa2ceb2de2eee127c9382698090d7a4a13e14c536ec6c9c3c8fa8707701ce26ab560d466475b6778456f406dd73da55a3f94dbd1cffc141db63527d3bd8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d6118f0eeb30e9d9178d2b9106dddd002d979b6fa79bdec415051afae2021384c29a32d2f6454fa369617598378ffb5e07e6f51aa763abfe75c3ddfbf4f425fe3f0ceff66d807a75e049303dce9addf68e7218729bd419638af63a370f65878cdf67e467e60edc1737bcf8e682d48131bfb427f523226aa7f197a7608e9b3784783fa759ef5b28191fa12f9ddb36b858f23282cbe6b24708467cc26eca437111e3bed80a2f35bbba448ecee37d3de70407232a8534b9df5635a5646cacd9bbcb79a5061efe5a46b0d1f33b11cf1c5adbedae6b79000000000000000000000000c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746cacc1000009be0eb8dcbfe9b11fdda136700e9759503503c803cffd58762ef79a974171c5c44ae77f9a93076aa540bebf9476ad4d89e4982ca210f77d8f6e3cb50134b759df0bfa28939a048d1d67a664ae6595ec4514829a10a01f7fc10230dd75c44697bf80c2e1e89a20ca66c1f76795d1cf5553a394c311bcc4601b9231b111d70d6b506004610000005050a0a05ff00020000000000000000000000000000000000000000000000000000000000000000000000000000000015000000000000000700000000000000e5a3a7b5d830c2953b98534c6c59a3a34fdc34e933f7f5898f0a85cf08846bca0000000000000000000000000000000000000000000000000000000000000000dc9e2a7c6f948f17474e34a7fc43ed030f7c1563f1babddf6340c82e0e54a8c5000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c1dc25ab6fd4ae8afb815c1c46f6d3f9bbe7ab053e699d259bf9136751037b20000000000000000000000000000000000000000000000000000000000000000a233764b3a84792c1aa7f165b48fd0eb5e05077a8672b35ad8242d9c544f0d638082a3002dc29b09308131db2a205e5d0782a72a03278473accd29f17c0806442000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f05005e0e00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d49494538544343424a656741774942416749555359617753595541735374766a483236625541434d506e6f6a797777436759494b6f5a497a6a3045417749770a634445694d434147413155454177775a535735305a577767553064594946424453794251624746305a6d397962534244515445614d42674741315545436777520a535735305a577767513239796347397959585270623234784644415342674e564241634d43314e68626e526849454e7359584a684d51737743515944565151490a44414a445154454c4d416b474131554542684d4356564d774868634e4d6a59774d7a49784d4463304e5455795768634e4d7a4d774d7a49784d4463304e5455790a576a42774d534977494159445651514444426c4a626e526c624342545231676755454e4c49454e6c636e52705a6d6c6a5958526c4d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424747690a41664533764c54435150696e5470685047695854516c645948654f6f657257516d4b66745141787939446c63353469446b4b537852786e7a38474f7a466f65690a6b584e532b44374575464864666b476a754e796a67674d4e4d4949444354416642674e5648534d4547444157674253566231334e765276683655424a796454300a4d383442567776655644427242674e56485238455a4442694d47436758714263686c706f64485277637a6f764c32467761533530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c334e6e6543396a5a584a3061575a7059324630615739754c3359304c33426a61324e796244396a595431770a624746305a6d397962535a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464c6d495a7555304e42506c79336e757041556f41396f590a73625a514d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949434f67594a4b6f5a496876684e415130420a424949434b7a4343416963774867594b4b6f5a496876684e415130424151515162536e396a546e656c37306e456e776e523951666554434341575147436971470a534962345451454e41514977676746554d42414743797147534962345451454e41514942416745464d42414743797147534962345451454e41514943416745460a4d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745434d42414743797147534962345451454e0a41514946416745464d42454743797147534962345451454e41514947416749412f7a415142677371686b69472b453042445145434277494241444151426773710a686b69472b4530424451454343414942416a415142677371686b69472b45304244514543435149424144415142677371686b69472b45304244514543436749420a4144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69472b4530420a44514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b453042445145434477494241444151426773710a686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b45304244514543456751510a425155434167582f4141494141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b453042445145450a424159676f473841414141774477594b4b6f5a496876684e4151304242516f424154416542676f71686b69472b453042445145474242414e78727a30753075620a48784e354e3964353631576d4d45514743697147534962345451454e415163774e6a415142677371686b69472b45304244514548415145422f7a4151426773710a686b69472b45304244514548416745422f7a415142677371686b69472b45304244514548417745422f7a414b42676771686b6a4f5051514441674e49414442460a4169454131305850553751764338564a743949654f724a366c4430744b58462b54746a4e422f6f7a62635235517477434944576e57773946484e7351745359420a70394c5463792f5670376f517367417076763332732f4236576b73760a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436c6a4343416a32674177494241674956414a567658633239472b487051456e4a3150517a7a674658433935554d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484178496a41670a42674e5642414d4d47556c756447567349464e4857434251513073675547786864475a76636d306751304578476a415942674e5642416f4d45556c75644756730a49454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b474131554543417743513045780a437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741454e53422f377432316c58534f0a3243757a7078773734654a423732457944476757357258437478327456544c7136684b6b367a2b5569525a436e71523770734f766771466553786c6d546c4a6c0a65546d693257597a33714f42757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f536347724442530a42674e5648523845537a424a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b633256790a646d6c6a5a584d75615735305a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e5648513445466751556c5739640a7a62306234656c4153636e553944504f4156634c336c517744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159420a4166384341514177436759494b6f5a497a6a30454177494452774177524149675873566b6930772b6936565947573355462f32327561586530594a446a3155650a6e412b546a44316169356343494359623153416d4435786b66545670766f34556f79695359787244574c6d5552344349394e4b7966504e2b0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000","nvidia_payload":"{\"nonce\": \"c2a26fe2fe311c12b867d1110c13d88a9d592d9c2658e9446597699a7e8746ca\", \"evidence_list\": [{\"certificate\": \"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURlekNDQXdLZ0F3SUJBZ0lVVGthcGp3dnhBVFBmWXZCZ3VhWlpoUldUS3NRd0NnWUlLb1pJemowRUF3TXcKWkRFYk1Ca0dBMVVFQlJNU05ERkNPRVpDTnpVd016bERNalpHTWpaRU1Rc3dDUVlEVlFRR0V3SlZVekViTUJrRwpBMVVFQ2d3U1RsWkpSRWxCSUVOdmNuQnZjbUYwYVc5dU1Sc3dHUVlEVlFRRERCSkhTREV3TUNCQk1ERWdSMU5RCklFSlNUMDB3SUJjTk1qQXhNREUzTURBd01EQXdXaGdQT1RrNU9URXlNekV5TXpVNU5UbGFNSHd4TVRBdkJnTlYKQkFVVEtEUkZORFpCT1RoR01FSkdNVEF4TXpORVJqWXlSakEyTUVJNVFUWTFPVGcxTVRVNU16SkJRelF4Q3pBSgpCZ05WQkFZVEFsVlRNUnN3R1FZRFZRUUtEQkpPVmtsRVNVRWdRMjl5Y0c5eVlYUnBiMjR4SFRBYkJnTlZCQU1NCkZFZElNVEF3SUVFd01TQkhVMUFnUmsxRElFeEdNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRU4reXcKTllla0wrVHprWkwxTW0vVERkMXRpbEhPZmYzSGgxblZ4MFZQUnM5N3hUbll4K2lJbE5CeUVhRmtqK004UlVkYQpLL1NkcFhMdVhvTlgrMkNFTElsZDR1engyUkJ6VGZROEFyZStUQUNBblRyWG51SkpvN2JTSllLTjhxR3VvNElCCldUQ0NBVlV3RGdZRFZSMFBBUUgvQkFRREFnZUFNQjBHQTFVZERnUVdCQlFPUnFtUEMvRUJNOTlpOEdDNXBsbUYKRlpNcXhEQWZCZ05WSFNNRUdEQVdnQlJ0a3hHUkFBRlNHMjhlVWVPb1R2R00rVXNHUURBNEJnTlZIUkVFTVRBdgpvQzBHQ2lzR0FRUUJneHlDRWdHZ0h3d2RUbFpKUkVsQk9rZElNVEF3T2pRNFFqQXlSRUU1TWtNNVJEZEVNa1l3CmdjZ0dCbWVCQlFVRUFRU0J2VENCdWdJQkFUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkhIMTAxbisKc2pSMy93My96RWZZT0dLTkcydVBBeXU0YnI2OHIrUVNtbUJONUxFZmJKQ3BiMW1LRTlteGFPNVBOdERBT3ZwSgpKR0ZxeDBXODNER2JKcHRQdHRUaG5qRkhxNktRdnZNUGJNL3E0ZVBQb3hpTmxLcXJiRThBUFNZbzREQTlCZ2xnCmhrZ0JaUU1FQWdJRU1QR3VmUUNUby9Wb25NN1ZnRVhKZEUrVTZ5cWszY3FJRTFHWCswR252a1ZYYkNpQno1SU8KTEx6QWtMSExraDk3TFRBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpCWmpmU1UzM0FZR1lMU3RrVVFjZGdIbFhHWQppZzJjenJDNHVuYWhzV1RnMWdGb05odWZ5OTRPcEs0aDdybm1nNUFDTURYVHUrSDdwa3lycGxDbjhGaXRRRTkrCjlnZFdJNWs4b1JqUGxxR20xdy81S3F3VUw3dmR3YXNpQS9Nd2hjcGphdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNUekNDQWRhZ0F3SUJBZ0lKUWJqN2RRT2NKdkp0TUFvR0NDcUdTTTQ5QkFNRE1GTXhKekFsQmdOVkJBTU0KSGs1V1NVUkpRU0JIU0RFd01DQlFjbTkyYVhOcGIyNWxjaUJKUTBFZ01URWJNQmtHQTFVRUNnd1NUbFpKUkVsQgpJRU52Y25CdmNtRjBhVzl1TVFzd0NRWURWUVFHRXdKVlV6QWdGdzB5TURFd01UY3dNREF3TURCYUdBODVPVGs1Ck1USXpNVEl6TlRrMU9Wb3daREViTUJrR0ExVUVCUk1TTkRGQ09FWkNOelV3TXpsRE1qWkdNalpFTVFzd0NRWUQKVlFRR0V3SlZVekViTUJrR0ExVUVDZ3dTVGxaSlJFbEJJRU52Y25CdmNtRjBhVzl1TVJzd0dRWURWUVFEREJKSApTREV3TUNCQk1ERWdSMU5RSUVKU1QwMHdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFSeDlkTlovckkwCmQvOE4vOHhIMkRoaWpSdHJqd01ydUc2K3ZLL2tFcHBnVGVTeEgyeVFxVzlaaWhQWnNXanVUemJRd0RyNlNTUmgKYXNkRnZOd3hteWFiVDdiVTRaNHhSNnVpa0w3ekQyelA2dUhqejZNWWpaU3FxMnhQQUQwbUtPQ2pZekJoTUE4RwpBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0lFTUIwR0ExVWREZ1FXQkJSdGt4R1JBQUZTCkcyOGVVZU9vVHZHTStVc0dRREFmQmdOVkhTTUVHREFXZ0JRcGFNc1dMTkIzbFhLaWVSQUQ1cDY2RE13S2xEQUsKQmdncWhrak9QUVFEQXdObkFEQmtBakFOUnFvZlFCSlV5dWwyRXVLeDk1WWlLVTRET0drYnRiaHpzTGR2clRqRgpoMzNPWmhheUFwRk9INTNRRUsyUHRxa0NNQno0UTQ0TTBsUkdxQWZWUFVTWkI0R3Qrek85aFo5Mmc2WnI2elJYCnlIZjBNT3RzUVhZTmRuOUZWbGZTVWkrQkRnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3FqQ0NBaStnQXdJQkFnSVFhdjV4aFBraU1zamZleVFpWVhkdVZqQUtCZ2dxaGtqT1BRUURBekE5TVI0dwpIQVlEVlFRRERCVk9Wa2xFU1VFZ1IwZ3hNREFnU1dSbGJuUnBkSGt4R3pBWkJnTlZCQW9NRWs1V1NVUkpRU0JECmIzSndiM0poZEdsdmJqQWdGdzB5TWpBek1ERXdNREF3TURCYUdBODVPVGs1TVRJek1USXpOVGsxT1Zvd1V6RW4KTUNVR0ExVUVBd3dlVGxaSlJFbEJJRWRJTVRBd0lGQnliM1pwYzJsdmJtVnlJRWxEUVNBeE1Sc3dHUVlEVlFRSwpEQkpPVmtsRVNVRWdRMjl5Y0c5eVlYUnBiMjR4Q3pBSkJnTlZCQVlUQWxWVE1IWXdFQVlIS29aSXpqMENBUVlGCks0RUVBQ0lEWWdBRXpVZFdxam4xT2xYaExmRk9LQUZUZ2hxRytRM3pGNHhnU0JiWnNVRXlXWUNDM3JLakU5Tm4Kbzg4WnBCUXg4NU9vMFBrcVAyZHdvTVZOVFFNdjVjdnk5akxhVHZTVFhad04ySFFIRTl1N3g3QklZcldpMHNHMwo1cTFJSk5TT0dPNUxvNEhiTUlIWU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHCk1Ed0dBMVVkSHdRMU1ETXdNYUF2b0MyR0syaDBkSEE2THk5amNtd3VibVJwY3k1dWRtbGthV0V1WTI5dEwyTnkKYkM5c01pMW5hREV3TUM1amNtd3dOd1lJS3dZQkJRVUhBUUVFS3pBcE1DY0dDQ3NHQVFVRkJ6QUJoaHRvZEhSdwpPaTh2YjJOemNDNXVaR2x6TG01MmFXUnBZUzVqYjIwd0hRWURWUjBPQkJZRUZDbG95eFlzMEhlVmNxSjVFQVBtCm5yb016QXFVTUI4R0ExVWRJd1FZTUJhQUZBZENvT3NEbklCZ2U2RkJZWmxOcmlYM3dwc2VNQW9HQ0NxR1NNNDkKQkFNREEya0FNR1lDTVFESzBCQ3I0OUROSjQ4WWg1d3UzODhiWmlmREZ4QXNpVVM0VTFmR21wSlpGaENiT0RINgptUndjTXhwNkVPYXladVlDTVFEWUtUeU5jMkZ4V0Z1aEh0ZENFM2xzNFM3U0luZWhkRXJUWk51aEZ5bWM0WU9NCjZWbExXVFkvQ00rcmVzampxeFE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpakNDQWhDZ0F3SUJBZ0lRVENWZTNqdlFBYjgvU2p0Z1g4cUppakFLQmdncWhrak9QUVFEQXpBMU1TSXcKSUFZRFZRUUREQmxPVmtsRVNVRWdSR1YyYVdObElFbGtaVzUwYVhSNUlFTkJNUTh3RFFZRFZRUUtEQVpPVmtsRQpTVUV3SUJjTk1qSXdNVEV5TURBd01EQXdXaGdQT1RrNU9URXlNekV5TXpVNU5UbGFNRDB4SGpBY0JnTlZCQU1NCkZVNVdTVVJKUVNCSFNERXdNQ0JKWkdWdWRHbDBlVEViTUJrR0ExVUVDZ3dTVGxaSlJFbEJJRU52Y25CdmNtRjAKYVc5dU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFK3BnK3REVXVJTGxaSUxrNXdnMjJZRUo5T2g2Ywp5UGNzdjNJdmdSV2NWNExlWksxcFRDb1FESXBsWjBFNHFzTEczRzA0cHhzYk1oeGJxa2l6OXBxbFRWMnJ0dVZnClNtSXFuU1lrVTFqV1hzUFM5b1ZMQ0dFOFZSTGwxSnZxeU94VW80SGFNSUhYTUE4R0ExVWRFd0VCL3dRRk1BTUIKQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTURzR0ExVWRId1EwTURJd01LQXVvQ3lHS21oMGRIQTZMeTlqY213dQpibVJwY3k1dWRtbGthV0V1WTI5dEwyTnliQzlzTVMxeWIyOTBMbU55YkRBM0JnZ3JCZ0VGQlFjQkFRUXJNQ2t3Ckp3WUlLd1lCQlFVSE1BR0dHMmgwZEhBNkx5OXZZM053TG01a2FYTXViblpwWkdsaExtTnZiVEFkQmdOVkhRNEUKRmdRVUIwS2c2d09jZ0dCN29VRmhtVTJ1SmZmQ214NHdId1lEVlIwakJCZ3dGb0FVVjRYL2cvSmp6R1Y5YUxjNgpXL1NOU3N2N1NWOHdDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXhBUElRaG52ZUZ4WUlyUHpCcVZpVDJJMzRTZlM0CkpHV0Zuay8xVWNkbWdKbXArN2w2ckgvQzRxeHdudFlTZ2VZcmxRSXdkalF1b2ZIbmhkMVJMMDlPQk8zNDU2NkoKQzliWUFvc1QvODZjQ29qaUdqaExuYWw5aEpPSDBuUy9scmJhb2M1YQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDQ3pDQ0FaQ2dBd0lCQWdJUUxUWndzY29RQkJIQi9zRG9LZ1piVkRBS0JnZ3Foa2pPUFFRREF6QTFNU0l3CklBWURWUVFEREJsT1ZrbEVTVUVnUkdWMmFXTmxJRWxrWlc1MGFYUjVJRU5CTVE4d0RRWURWUVFLREFaT1ZrbEUKU1VFd0lCY05NakV4TVRBMU1EQXdNREF3V2hnUE9UazVPVEV5TXpFeU16VTVOVGxhTURVeElqQWdCZ05WQkFNTQpHVTVXU1VSSlFTQkVaWFpwWTJVZ1NXUmxiblJwZEhrZ1EwRXhEekFOQmdOVkJBb01CazVXU1VSSlFUQjJNQkFHCkJ5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJBNU1GS003K0tWaVpsamJRU2xnZmt5L1JSbkVRU2NXOU5EWkY4U1gKZ0FXOTZyNnUvVmU4WmdndGNZcFBpMkJTNFZGdTZLZkVJcmhONkZjSEc3V1AwNVcrb00raHhqN255QTFyMWprQgoyUnk3MFlmVGhYM0JhMXpPcnlPUCtNSjl2YU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCCkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZGZUYvNFB5WTh4bGZXaTNPbHYwalVyTCswbGZNQjhHQTFVZEl3UVkKTUJhQUZGZUYvNFB5WTh4bGZXaTNPbHYwalVyTCswbGZNQW9HQ0NxR1NNNDlCQU1EQTJrQU1HWUNNUUNQZUZNMwpUQVNzS1FWYVQrOFMwc085dTk3UFZHQ3BFOWQvSTQySVQ3azNVVU9MU1IvcXZKeW5WT0QxdlFLVlhmMENNUUMrCkVZNTVXWW9EQnZzMndQQUgxR3c0TGJjd1VOOFFDZmY4YkZtVjRaeGpDUnI0V1hUTEZIQktqYmZuZUdTQld3QT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=\", \"evidence\": \"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\", \"arch\": \"HOPPER\"}], \"arch\": \"HOPPER\"}"}]}