nod-ai / SHARK-ModelDev

Unified compiler/runtime for interfacing with PyTorch Dynamo.
Apache License 2.0
92 stars 46 forks source link

Failed to legalize operation `onnx.Conv`. #817

Open vinayakdsci opened 2 weeks ago

vinayakdsci commented 2 weeks ago

The ONNX operation onnx.Conv fails with failed to legalize operation 'onnx.Conv' during lowering, as reported in https://github.com/nod-ai/SHARK-Turbine/issues/812.

Duplicate of https://github.com/iree-org/iree/issues/17944.

More details will be added later.

kumardeepakamd commented 2 weeks ago

https://github.com/llvm/torch-mlir/pull/3670 seems to be in flight : Do we need more fixes?

vivekkhandelwal1 commented 2 weeks ago

llvm/torch-mlir#3670 seems to be in flight : Do we need more fixes?

Once that is landed, we can test it again and update.

vivekkhandelwal1 commented 2 weeks ago

@pdhirajkumarprasad This PR https://github.com/llvm/torch-mlir/pull/3670 is merged. Can you please test the fix?

pdhirajkumarprasad commented 2 weeks ago

Complete IR:

module {
  func.func @CNTKGraph(%arg0: !torch.vtensor<[1,1,28,28],f32>) -> !torch.vtensor<[1,10],f32> attributes {torch.onnx_meta.ir_version = 3 : si64, torch.onnx_meta.opset_version = 17 : si64, torch.onnx_meta.producer_name = "CNTK", torch.onnx_meta.producer_version = "2.5.1"} {
    %0 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<"0x05AABB3D63B3F83D52CCAE3D4E19FB3D863FCABD86A1E5BD9A5C12BD1225C5BDC66F17BE3FC80E3DDD6F46BD952D0C3E5D8F153E9D49F5BD9408553EA29568BE7CBFD83E8257703DDD542BBE39DDBDBE5DDA44BEEA2AC13D7DE1BF3DEAF92ABC64206C3E7CA8E7BEB1E4233B56BD4BBCD829023D4FCC9BBE33AB933CF8E9C63CEF1F933E20182F3E315C98BD7BBB903CBEC5D7BDB88CA7BDFB43753DB33EF83936311DBE740CF73DCA7CDC3DE573C13DC10D8FBDF465D2BC2880DF3DEF58AABD351FA93DC3EC33BE31342CBE9253D73D457F32BE9683A8BD9DF3ED3E0CE5F73CBA2923BE695F4C3E78EFCEBD7234FDBEE6BFA83E22C5353ECEA0D23E6C70FC3DFD2F8DBE1ABEEEBEF117BEBEDFFCABBCAD1203BE22E7463DBC69C33ECD8B6DBE1CD6D03EED9DB93C22769F3D32912BBFD1937ABDFE8E3F3D13EA06BD6AA9113EEEA303BE28C8D43C17C412BC8DB2373EB60D09BD4B7BDEBC676C053E36563ABD04DF5B3D28FEB23C6A7CC3BBEC6F4BBD4BBA22BE3AE9DE3DD5252EBE32FBB23E497C32BE4C73293E2FBD0FBE4CE731BEB1EB15BDA043243D7990443EED252E3DD6C127BE7B42E23E86A09D3DB312E0BE82A94A3DAB6D71BEAD3AC9BDF699CFBEC0FCBEBEB989793E4D8705BFA01F113F0C230E3F2BDFD5BD3059383E91FBE8BD0E6822BD53ABE5BD39571BBBA50B4EBB1778D2BD32FB9B3CF5BE93BDBDEC80BDC6FFB13DE4D1733D14B7383EA7EFDC3D69B848BE8157033CA3A3813D4385723C803C93BD31E2DA3D8BED7ABE00E4793C029DABBE984C06BDAAE322BE0E90153FD08B96BD7907043FA602253EA8384DBEDE5AB03DE39188BEF50CF7BE31B9253D390AD4BC5659993E45DE5EBE4039A63D997A883E509294BE957F883EC0EC4FBEC78FFEBD9179C33B5DBF653E6AD10B3EA799E5BC96D48FBE54E7BA3CD657853DEA8B15BE4526D13D268B0CBED3CB653DE620A6BD540CE93BFFA553BEAAD5E73D607538BE3A3AB83E63546BBEFBC4FE3BE0C159BED2EFD1BDC090BA3DA1EE8A3E578614BE60A7B23D96CB8FBD3C180B3EC1CAF03DDC49C7BBC4001EBDD214B03DCC32423DF31316BDFC3EA73D147AAC3D5AFA093E041681BD30B8B53B524B9E3DFEC9C4BCD84297BD7F7C783E0A174D3EC29502BE226CC0BE5EC183BE93542E3EF4ED94BD26B8DFB90E9F0FBDF52B813ECDB5973E3929353E7071D0BE708C37BEFE47F9BE0A043F3F1E1F32BDE8D526BDBEDB673D862291BE1D528A3D9AAF8CBE2F3497BE718FA33E2B55CCBDBAC1B73EAE650CBEA2B178BD84A8B63D0ABFFDBD237BF6BE80C7F7BD6D959ABDAFCE013F2096253E0F0E093D303254BC1245E13DDC8739BEEF1656BE4ACC2E3E8E75553E6EDFD43DA4E6283E55C054BDFC7B983EF262F5BD258B35BE720612BEEF443EBB23B320BEFA987ABDC6163C3E0D258C3E2E87B8BDF771F2BD0745DF3CA52CAB3EC6C413BEA5E293BE0A9182BEEA38C7BDC6E8133FF82395BE5C2F3E3E64C86EBEBC063A3E46F129BCF2451CBD4297B6BD8586253F816C2B3E67D8013E108EC8BD284E5B3EC670873EE5A45C3D886F42BF76C64FBEE259B23EB7C40CBE57DF923E46EF5B3E78CAC93DB63076BEE95E233EA93668BE2D958C3C24C43A3CF864333E037E4C3D4D959E3D64903BBD2D5EC83CC6B652BD103DFABEB5C486BD6E4ECE3D4764893EC81D23BD0290C83DDF2A22BDDFD19BBDE7A9DAB862E2053DB2B69FBE906DB63D8D5794BE2FC8A1BD194C7E3EC9ED273F604694BE8053B13E08EFDABE491380BD2E92293D1B33C2BDF41512BE5A56153D5DEE06BE7B1C393C2AD02BBD59B7CFBC028A35BEBF85473DCF4BE93B08FA0FBDCD18F7BD99EB1C3D366C49BE64DE1B3EFF48883D7743DA3C929B3ABEC08F4DBEF2937D3E7326123EBAEA4EBC0A0B013EA6B494BCD9B23DBC9DF2E83D20B1AABEA43D06BEA01F14BECD01603EFF2C943E090B803EAA24323E0ED6D03D762583BEAC73E5BDA83372BD8935103DD73627BDCC0BB5BDD55A8FBCAC7E0F3D8DD4D3BD232E8E3D9663903E494C883D847F2ABE7E88873DCB7C28BE2328D13ED132803D894882BD585A91BE42873B3E072BFD3E68EF973ED7198BBE3DF1FABB4F4AFEBEE3BCAF3EEABBC23D37DC8DBE4DBA453E51F578BE7D3F643E29F5383E6E4EAEBE9F80C93C2C0FF6BDCFC7AA3E60B573BEAB6CFB3C32D1AA3C8B186CBDF5574BBC3EEA81BE4B99ACBEE4A0FE3EA1F0CE3E4388B83CBD1765BE1D5A023B5F53A3BE1BB2F43C4994333EF2915B3E28C2883EFD4BE03D42F090BE2AC5A73E63128D3EF112C1BEAC982CBF0C35D9BE59E133BE8868633EF29E063F293EFF3E6FF53BBF676794BDA62102BD55361D3FAFF48C3EA7ED39BE1ED2303C53408E3E4048473DF38C443ECCAA11BE7BD3C03D03A011BED49E43BDCB800D3E8602E93D28A411BB6AF3463C421703BEC5E7573E5AE2C93DDFF1F0BBD023BBBDE78E3EBEC4D9BF3D3F25613EDECD613CD9DF973CA43FCD3D788A6B3D8DFFB23D28B584BE0E9F513D2D84013D82DB9A3D01B05CBE65703DBE7BD1893ECFDD6DBE98DF753E86DF5A3E158208BF084BA1BDCEDB583E75A52E3EA848093F654D4CBE0B56B9BB5FE947BE2100FEBD8A668A3DAFA2F9BD226E5F3D81219ABE13E80FBAA09E2F3EF32E453F9EB38ABE154E713D09F312BE9C4EC1BC1F46B6BC42AB6FBEED308DBE2D53CE3DD02B08BE10F10ABEC51F1A3E56290B3E9D4FABBD15CA123E3534DF3DC969E0BDADF9973BF130A83DD76269BD138705BD32FB2A3E17CFEEBD2478053EA462ED3D2817AC3D73330FBE482F8EBB69B39ABDC8339A3D12B6153E83D595BD1EE428BE995145BD5EF8E93D1B9629BECE68CBBDF64B31BE14D5C83D506E563D4FEB123D673787399A06E2BD07B4A23D558369BCA44B373D0CABC4BD0E7085BD40DE983CBEA6D83DFFE0E53DB761313E354786BD55EC033D4F7D873DC2EFD2BD35DF3ABDBBEAB9BD7416AF3D38F18CBDD6D4A83EEE560DBE13F780BDCD27303E4EC46BBD4DB60EBE0E898EBEDE9A6EBBEA8A2CBEAA40CD3E3399D73D2339F6BCB3CBA0BEBFEDD6BB60CD9ABCBB37BDBC09F054BEC262EE3DC6453CBD50BCF83D3BB0F13D51E5B63E9C0941BE05E507BE24345D3E03C991BDCDE676BDC66E6ABC97E6C83D9055DDBD76B1FD3C5FE7C7BD97C4CC3CAECD76BEA10DE03C9B0F0A3B304FF43DD186C63D0055A33E6F302ABE54D9273E25FC7EBE5FA8043D22A2C23DCE7E823D9751C93EC96ACCBE563842BE4E5179BECDCBBE3ED8EAB4BEC065AE3BDB1838BD138A6F3DB43F86BEDA3B72BD0844B6BED0EE533E165B8A3E99A85C3E0600B7BEF01312BC8F4DCCBE31B6603C44E4D83C1098113E6D614FBE98A98E3E0221DBB90E1E45BE5ABF223EBA4CBDBC2795E63CDCA7EE3DF39A92BC376867BD50E7A3BD511B97BDD027D4BDBAC72E3D04EBB03E5B02B6BE1B31843DB511BEBD0310EE3D24935B3E7F5E933ECA53B8BE26EBA0BEA236B43D7AADCEBEFFDF493D2C58853EB5CC3ABD804DAEBDF512C53E15EA803EF84DF63C401344BE2C612B3CFB3628BEB68BCF3D052C983DE794923D534109BEBA5844BEA944963BECF2533C064787BCCB9F323B2B7E15BC1ABFEB3D854C8C3DACD3D3BD8DF6ED3D479D783CAF60E13C6265F1BCB6DBB33D73572E3ED92FDABDE885EDBD2B9D0DBE3A1B4FBC526ED53D7CE193BDBCDF2E3DEBB3A93D460F8B3C2CF9833E2F39E2BDFF1A12BE9E85B43DDC076C3EC01C25BDCCBE99BD0EADA1BE39C6B6BCA7CC13BE9D8794BD5F2A22BE8B5A21BE05EA87BD0F4CB53EF812E13B51D01A3D72878FBE8705993CB44CA93C7BC88C3D10804E3E302BC53D5BABF1BD4778F63DE86D8DBCA4914F3D8CA4DF3D5F592EBD17EDE6BCC863633E4A53053E091258BDC440FF3D86C2B03D49FE4A3D1EBB463E2C71A7BE553D52BE40FC73BE0AC78DBE17A8793D67C2473E2D20A33D836E17BE0D9F4EBE2FFFA0BD050FADBCD2531F3F440A03BE1045BABD3E1FD8BDABCD943E79F365BD5E2D6D3D0FB7A9BD23D79E3C04E7AD3E9F132ABDF31833BE5F3D073E7EB46EBC6B23F1BDF1758C3DD6C82EBDC229113E556B823D701C45BEC644E8BD6B4646BCD58EDB3D128F9A3E71A1FFBD76BB16BD7309963E004986BE16A85BBD9D09AEBDDADFF83DF28D00BC078A97BEF82AA73D03C7C43E82CDB33D2759863DD0D0163EF758003EC9C763BD43D7803E2E1CC9BAAD9E38BE0D9828BEC3C0F0BD043BEDBDCB52DBBD7B2C2A3E19DAB53D01BCEA3D253F46BE1A0F1BBEFA54653DB6330B3E0E47FDBC9DDF4ABC80B6A83D1B70853DB69A74BDB0B418BEF802043EE20B7A3E949E2BBE66D6B63D6461123DD9ECB6BD2F503CBBBA4909BE977A6CBE06FC1F3D1B432BBEF6E8363EE533C1BDB6D199BCAE530C3E9AFFA4BE6CD55E3E1AFAA93EAD84F3BEC724E53E5AA19DBEC55B1CBE418D3A3ED3FCB5BDE306293E92272A3D41073B3EAECE3B3BBFFC9BBE498F1A3EE6928ABD92C62ABEB5FA0CBE3A31B23D9DA625BD2F7D17BD464439BE0D25283D9892FE3DB9A72DBD6E7C82BD5DE30ABEBC79B83D9E68133EA3A1493E8B8EF8BC261F3B3DC5B3863DBF7F41BD5184B63DC647253D4D1D56BD5C841FBE4CE7443E86AE0A3E4C8140BC4C46813D1665E1BC264EA13C224A9CBD2D4C273DD8CE09BD22768FBD8D464CBDEFF516BE9AC84E3DC8E577BC158EDD3DA72CCB3D64DF0BBE56F225BDAA3BBABD1D59713E9AF484BEEBD035BD262FEC3C1603543DAFE37E3B28AB203E7E71CF3D5F6554BE0694C0BD4985823E6D3B1BBE9E94C1BEEB21193EC7A8D23DED585FBE3BDE65BAC80EEEBDE814BA3D1B26083F5A423D3E625D1E3E02B29DBD890F9B3D9BB3753E993DE7BE793C063B8AD5CBBE18CC05BEE7B6CCBC44448D3DF15D2ABD457B863D3AF881BDF7B73F3D88AE4DBC9C18EDBDAACA6EBEFDB88DBEBB535FBC92B695BE14DDCDBEF0DFBBBEBE41AC3ED84E4EBDBE242BBD861A85BE637E993EE643E03E367A743D658401BC7550C3BE015260BE59E7803E7EDD313EB1AE32BEA1661EBEEF2B393EDE2AB73E866733BDA22FBE3E02B3E7BEFDC63F3E7F3C57BCB96C12BE645013BF275404BE5975313E1BECC33E7C071D3ECF4C23BE6DF3173D14158EBC76630DBDCA0733BE2F3DDF3D2098993D1EDE1B3ED30229BD1CCE8A3D8BBE1EBEAF78273E9D52693E8BE43F3DD45AF4BC1CFDD43D3E3C42BED2F60A3E40C8B8BD1ECC863E71BC91BE8FE9253FE86A0BBE4F4D843DD98CF63C9ADA8D3E115763BE24E8243E6F9575BE21CB65BE65AE69BC2113E93E1F176ABCDEC649BE1F438CBE167B353E09E9933DC0AFF4BDB24293BDBD50DF3D4B6033BECC59B6BD3DD22F3E0AF473BD9B85E93D982F293E9905B4BE203C0DBD0F70F0BDFE5B09BE68F523BE173A873E8D30DF3DF224B7BD9C6B31BE358B5EBD2F8E3B3DCF47A73DC14FAE3D9446A43D818D77BE0298BE3E06BCCEBD557120BEAA8A503D83924C3EF1C47ABEDF0E0A3E3CC90F3B3554FFBC648AF83DE8EE01BE8A2142BE91AC2A3EA39FF93C2BC41E3EC80258BD4537D73C99EA68BE1B9909BEFD849C3E2C6BBEBD15313DBE8C93CC3EFC8162BE774B303EC6C5F2BC2F38E13D7AF1B8BDFCC661BB6903183E9651533D041C2F3E590BA73CE8278CBEF63C67BEFC7814BE82D74DBD6BC1833E6E37373E4D30D5BE9870C23C0EC230BE2A9F02BF83CCFC3D5BA19CBE68F7183DBE42453E0502F23E51B4DEBDDCF6C73BE24A3EBD625DF9BE8029253D876CAD3D3785033FAA4586BD6EEA193E778D24BD44345DBE58C77A3EF3420ABEB455D63DE620383FEC3302BE912B87BEE65AFB3D7528663BF4451FBFCCCA823D4ED1F03C110EAC3EF28AF1BC2648DF3DB8CAE73D60334FBE62D3783E8069DF3D9A7AA5BEC55411BE68FF83BDD7BB4C3E72F8083D5CFE41BC6BCFBD3C4218053D3A1FCB3D2EE10F3CEF6BD9BEED04033E3F57B13E628E92BE0C74893EF9AC563ED3E943BE5B3EA93E5F649BBE8AFC29BBA42400BEC355733E93B67B3E731D4D3E0514E6BDB34781BE3635E8BDD140A8BE42415ABE77339ABDE851C53E796972BE52EAD33E4EB2F2BD67E9253D615B703D8857DB3EAE3EAABEE2AD98BCEC6999BE7E22B8BD03C4D4BD602E513B4EB900BEA0E81CBDC77BD1BE4867BE3CC33337BE109AA43EFFB182BE4C4BE33DDE43CD3DEC7C033E3E764A3B4076033E5402D3BDF2466B3E04ED9FBE15E9153E0031543DD96B393E70279CBD8E14833CB92879BEE87C9B3E3F2DDABE10848B3E91221C3DA646813CB26BA13E6281AEBC10D3483D06CA56BC395D8D3DD3B5C43B8FEA3ABECACFB73D3B84EC3C130419BD315FFB3D84CA7E3D27E8DF3DB467BABD08B92D3E7762A5BE4AD910BEE2D1833EE3A7FF3D83FB5BBDF50BDE3B4A3BEE3C116E08BCE2CB3B3E5B044F3C04E273BD5FDAE73B0846253E36A7533D3FA907BD7A4F16BE65302BBDBB5CC73C782425BDD66C93BD12697EBD75E4CABD06F09EBD8EFFFF3D5C52693D05A5B33D5F68043E524944BB38C8D0BD518C2F3B40A28FBD61B7C33D2776203E45EBD43D1528133E02514BBE05764D3EF7A67EBEB18E913C3868DB3D1C61FC3E248289BE6A44F8BDDF0B02BEA055573DA8EE89BEF345DCBD0E594A3E5C78553EEBF7403EFD99EBBD284F9CBE9743EFBD7D14B2BE574E053F7E49F1BE19706EBED6561E3EA515833EEF3C393EB1C4B2BE6F83AABDE317A8BD48714F3ED93F2F3EDEAE34BEEEEB31BE86698A3EE3D5A5BDF6F6913DB5EFE6BE92F48B3D9BF27DBDA00B893EFC510EBD3DDD383DD81AE83C48D95CBD1A598B3E2E16F63D007956BD89A3643D26CF933A8E75C8BD8F24B73DCE30763EDFA72ABEDE6E27BE3645383E17AC11BC38D6E7BC2CBB03BE65DF1C3DAD0903BCF004D53E245953BE6DB003BED69A093EA10306BB95BA8EBE0C4194BEF43DFBBDD9BE12BEB747F63D0FBEA4BC301AF33CF01706BD24DFAE3DEAC3BEBB41D28D3EB94ABEBD63DD263D65D984BD3BF0893D5E8CD0BEE107353EE7424DBDD014E3BED134083E8A584DBB71AB11BFCDDAB43E72E21CBEE194933D6DA2AE3E685E80BCA5F39B3C7F62E1BD50C60FBE0B45A83D1F74A13EF9EEA23EB70C14BBB90A073D36C696BD7D7A6DBE8BBDA93DBD37A93E04B8EFBD91FB0DBECA78F03D20E0F2BD19DB793ECA722B3C9EF426BE868CCBBD5903D1BD75B111BD22D44BBE8B5C3D3E02CF2B3A57E834BCF3533EBDE017393E701B55BEFE0E2FBCA674E13D0BE1A4BE088461BDCEF2943E304B4D3EAABD97BE94F493BDE567443EE0BEF7BECF46933ED0EC0F3E6D258F3E97A315BD248FA53DB30E2FBEDDCBFEBD586E8ABE8623C73EC060B3BE8567CBBD242ED13EA6E1273E3882703E709CA8BD8B126FBECE9A763E2F07543DFFDE883E59F2CBBD07AD17BEA5EB22BE5E2C3C3D3F1FF33D741F79BECDB80FBEACA1543EF6FB3CBEE966223EC72AFF3DCED0D9BCBA504D3D63BEA83CAA296D3DACD683BD45777FBC582C183EF363D6BDDB7701BE261B25BE248AE53CA3282EBE449B213EBEA4F63D59E028BE61BFB93E1C8088BE921111BE0146C33D3BAA813DA6EDD9BE6EEEBEBD27B98A3D16A5D43D255CB53E175A293C4EA7A5BD614A4FBD0AEA4DBEBCBAAE3CD26C3C3E90642DBEFE7EB63CAEDFE0BDD26F98BD583613BFA420B53EB310F73D7168523E34B003BD9998073E712872BEC51CBEBDA69004BEAA18DE3DEC81F2BE209340BD0B327BBE6EF3ECBD99F73BBE24D3973FBC5057BE957C0CBE2116ADBDF02ED03EF9C02C3E607BE93D1CECFC3D1EE9B5BEF866443E8C763DBEB44F863D0F104D3E1C83A7BDA25644BEA305ADBDB0B7AEBD0D50B6BB303056BEB942AF3D40B0523B70F2163D53D71A3D73F5F8BD6AFED53DCA21C03CD15BE1BD6061703D894863BD79204EBB5002C9BD932B673DAA51AABD84F191BD8F04A9BE2EFA583E40E70DBD1FFA433E8B0B053E8692D93DD88472BE112BDE3D866B9FBEE4C32D3E22C79EBD96B0023F9825F13D67703B3E43A12FBEF84C573E45E898BE239FC23E4A7A54BCAF6A943D562E89BEC6B14E3ED25B41BDA120FE3D4AFD87BD3EBE8A3D495B86BD6FF9653D10B708BDA42D3DBD73D0E4BD4E55BFBB93C9423CEBEBABBCFC42803E0987E0BD4EF403BC63DB72BEC9F588BBBAB9573E1FF6D2BD1369AEBD7B395FBD1A6C323E39E4863EC2D220BEEAE95BBCCB7709BEEBFB8C3C011CE13D589AF93DDFA71DBEE01EF43DEA04243D1BF95A3E68A636BE9F25B23D38F37FBE06436BBDEF12453D2E33E8BCD952133D3B4B5DBDF45E233D8051463EFFCDB0BDE148C33D9A6FA5BD7E5B013ECC66DFBD6F4796BE59B890BD4AFBE1BDCF6AA63E083CE03DB4322CBD1A123D3ECBFCB3BDBBF551BD1CABBB3D38C795BD416BDCBDECD6593E26935E3E3BD6AE3DBF7677BE80E47E3C5B73153EFF70813E1D3DBABDCCA51A3EAB4136BD3DA9093E01CE02BE26A948BE3480A73E42F0BDBECBA8B8BEF8D5273E06BB4ABEF2F25BBEFA5C533EB37604BE8A0C45BD6928F33DE10612BC8CC8893DE2A76FBE6BEE863BD873B2BEE1879DBED17E01BE0E8F8EBCA3652BBD6A29CE3E555435BE5576873E50CB353EDFA71A3D9C622FBD77576DBE2672723DB1CA1FBEE110483C5A72B73DECC934BEE6C5613DC6AA26BEBE72B13D288AD03E69B097BE86C87FBE221E153EDD69043EDBE4D6BE808E5F3DF46C1DBE8886663E7556AA3D544D26BEF63FB9BD411A423DD5E8FE3DBD77B3BCA8DEB9BDE14F16BE47CCCABDFA123C3E2998993D3B8D7EBEA8C38A3E57F103BD2274083EC3B177BD53BE9B3D1DC931BE1A16393E40489CBE4CC4DC3D9665FF3B394FB23D5C848FBE415312BED04A03BFABD8663E3452013EA3198B3E863D2FBDE15E3FBFC451463D2A712F3EFE6584BEDBCE453F2327CCBE2FC3C3BE9F65143F13C482BED1F2353FACA680BEC09BA6BDD82F023EEF9479BDA2E76E3E9806EA3C1946C1BD595EEBBD8DA5093D18B0433EDAE88DBDAE6849BD864F8CBDFB4754BD358434BE63193EBE551BB5BDA4E5223EC66E173DD906A93DA991363DE279D7BC5BBD90BDBC80DD3D171F063C791430BEBAA9243EF4CAA2BD223F563D77AF693EC66C9CBE53CEDC3D35E7603DDD3AD23E15C9513C21643DBE3F81CE3D28F7F33CA17664BEA49CDABDB5AD92BEE7CC323BD1AD99BCA95FE43C6C19E7BC3C43353E392B95BA87652DBEE5F23A3D724101BE6ACEC6BD7BEDDABD9C77823D749149BD85BD08BE07A402BE8043C43CD641B23C4F859F3DC55E2ABE8356653E7258403E7D43F8BD7917753DD10501BE93FC6EBE78F695BD3753823AB90B79BCF7424BBEA4B941BE5A750B3ED8A6583EABBAB4BC119F89BC64F20A3EE98FCD3DABD0E83ED2A527BE1A5A6ABE525C8F3C89845ABEE4B2C7BDF8D24E3E44A2853EC4715C3E69F3133E37DEAF3BC168FA3D4C8EFEBDBCF4823CB2D602BE513CAE3DDE4A65BE9D47AE3D336B37BD98C528BD96210CBC4A93DCBD8FEFE9BD03C822BE9032643E40ABECBD89F430BE825699BC3A8382BC4E004E3C162BC83C7AF9173E09B92A3E927D58BE13B8703CBB7146BE5E5D1CBE9DB82E3EDD05993D76BFF3BD8233CBBD6784153D17439F3E3C7FC4BD9D08D1BD8712E63EB15C46BEC080743E682E04BEBF0BDC3CE662833E37854BBE90AD03BE6B1301BD33AED9BD56001CBD374B033D396B7FBD3116A5BD1C61083E6176A93D9054A83D8FD7FE3C487F2F3CB27BF73CBA7EECBE88113C3E2066B13CC3FBA3BDFB098B3C8E4835BD284C9B3DA3BF0D3E10BF6F3E4C5DA3BC93E2893D71D58EBD927A4E3DFDDB1B3D3533FABDBC8EB2BD738182BDEAD02D3E402FE2BDE4D7713D1A00EB3E876B13BED1C41B3EC92A143EC6579CBD64259ABE007E58BDBC116C3ED09465BE4D44DEBD0BA941BDC14B0D3E4E3281BE78971D3E9C19A7BDEEC9363ECA99713E638438BE18D5663D669D3A3E67B578BDAEC4103DC0B4ABBD170220BC19B9D8BDE126CEBD1433973D0B65263EDF71263E05CE943D6BF088BEE937893D8955483E5D23323EC107AABEE87B59BEF90BB03CCEAE25BD30AEA93D1D724BBDE7362DBD5F975BBDC84F703EE4038D3E7E48193DCBA5733E019D703CD79CD0BDDE81AD3D8C8751BD87D3D03CF2C5CCBE3F15B03E122998BDA335C93D37A91D3ECE416BBEE6CF3D3EC69C623DE414E2BC53A6C0BDF459E2BDE584AABDAD91293E7872453EC3F025BE51B891BE557363BB76FCDFBD10E8873E89C107BDBF1DBFBDDE2B0EBE8428913DD10C853EDB71303EA79282BEB33A68BD37CE953D235F75BD5B84BCBDD5D766BEA0281EBED40F99BA2AA8883E8717013E3CFCA43E067B04BE5A2D283D2B8C1CBED466EF3E8D4B80BEA66DA5BDBC0D18BE804E973DD4C6A6BE15578ABD5A86FC3B81CE80BC061B723ED71BED3E2CC68EBE70D818BE7B369DBDC451713E742A53BD3A93003F8B4B05BF481B183C33B930BC1A94C43E0FAE21BE514DDB3C9F6980BE5FED083E1F58673C439669BEC0FCC23EF5BBA83DEE3E4EBD2D258FBE6E94193E581B04BEB4C9D03D83B0B6BD12E2A3BD6022E13BF55D14BEB03CF2BDE300B13DD3A4FCBD09EAC73E3587493BC2B94BBD660E60BEBBC91C3E9919093E6D7BEC3D7B8E03BDC21AD7BDF6B7563E6128ECBCAAA167BEE630C63D34C161BEAEDAFB3D14700EBE5C07303D47A9CABD93B0853DE305F03C4AD9AF3D6F0F4ABEA18FC83DDDF3DDBC7D7018BECC91CFBC60DA743E597B5DBC452ACCBDB3B2BABD82B3833C6EF38D3E474CD7BD2A6DC4BD7D862D3D832F4FBDAAC359BE361FF13D715F593D057A17BE234DDBBC1239BF3DFBDBCFBD2689C6BC04D34D3D22391EBC3201D93D11A4A43D1F2019BE86A9933D0C62A83D2D9ABEBDA7FABE3DE60A8FBE9A2B20BC6D7B263E85193A3D450802BB02118DBDCD703EBE3BA2963BE9FC53BEECB2683D40E6263EBA6821BEE104CDBD53018C3DFAACABBD00077E3D108A85BE10373BBEDB5A1EBEDDB9623E446B983E5077113E2A26DD3C270F41BE4F56D5BDE920E53D5736453EFEDFF73D8A657E3B013E2BBD2F3203BE79C0CF3BE881FEBD19395CBD27B973BDDCBC0A3D32218C3E2587DDBBED01C9BD5F01FBBC5E73CF3D337D8D3D4A60AEBC2DCE53BEBF28243EEB3F013F20CFFF3D7BF3EBBD95F766BE1EEC6BBC56A6BA3DF2F81EBE573056BE144AC3BD78ABA1BE479C213E48E00CBE6507E23D7D31493A8676333E7028933E153F253E5D823FBE1546AEBD699182BEBFCDCD3D76D6B5BDB6B0873C785F85BD09700C3E293B81BEE8D5773EE685543EC90F33BD5E63843ECEAD353E1BE4093EE689A3BE1143CCBC274F7DBE27E869BE0D4D963E0B2A22BE923294BB4E81933D32B3A43ECC0E923DBF8B16BBC92CDBBDEDC02C3E86EF75BAFB788A3EE403DBBD38FA89BE5A48BFBD0533B5BE2A179ABE8555B43E1ED687BDE294A2BEDD3369BEB52B62BD8DE0F33E514AA13EF3BDEF3BD492C5BE433ACEBD4C0D193E26C9FE3C1EE4AE3D6AF7B73D197DCFBCD9ADC8BDCEAA853E0CD3493E703EFBBB3FFBFC3E44873BBE24FFE33D3EE3B8BD42A92B3E20DC6EBE070660BE78A94ABEE620F93DF4048B3D4921143EDF5A61BE1F623EBDD18FA9BCCDA1A73A858A113E5D7580BE29047D3CCFBCB03E9256B1BEFC30AB3CC6F19D3E5533703D00D03E3D38B4623E2E16FEBDB7239FBD962199BD98E7DBBD1F8498BD9FA21ABD7F09833D923FE83DA3D20CBE2E742A3EE658053DB96EDC3D5F4627BD5E1122BBE21B9D3E17632CBEC66C91BEE6F5B63EED2C1F3E02FE3A3EB8B0153EEFA338BE40E179BE12FE89BDCFED153E051500BDE2FFC1BE71BCBA3E6AAAB43D809694BD17C48FBD0E5AFE3B3D94DBBE3E71BCBD2C8DC83E2D879FBE5671EBBD121F753EE81FA73DC1E9BC3D7C5EA4BDF7F58ABDF898A4BEFD8D583EE59D08BEE4B570BE5C8737BED558793D81AF2FBD935A5E3EA93753BE47E24D3E5862A53D057F653E6E2214BF6F0045BD296472BE46ABAC3E8310123EAA0A983EB0FE89BE00FD4F3D7C2D75BCAEE10ABEB967803C785D663C274F0A3F77C5D9BE3ABD84BEFF476D3D27FE863E8A9AA43D02A578BE7503F73DE21BB83D2987FA3E5C73373EFCA677BD76B22EBF4ECB86BEF4860DBE65698F3EC54C0B3E4EA58E3EBE2E12BEB49DBABE9CD12E3C563E3EBDEEBAE5BDB0246C3E85DA8FBD1EA0803E7802F33DFF36943E02A9A0BE0953E63D6B3504BF1105B73EFCD445BE78D634BEA13E44BD1EFD1E3EB8B8BB3ECCA2C9BDF0863FBDC7A9483EBFB208BE574A5FBDBC4F0CBC88AC51BE77E551BE467D31BEA16B083D01B570BD7E159FBBC64B42BE7536F33D1B16BABDF90EC13D28DA103EA622623E184BE23CDE2E66BDC36F223E48DD13BE4764283EA2A61CBE05102BBEC2A02B3DD661BCBD6CFEC33D08C9D7BC0CE034BD1E8D32BEDB81913EA381F8BE349F96BE496B863E0E8AB4BDAD745ABEAAC5E23E520ACEBD15EFC93E4E160DBF1A06743D85FC1CBE5EA7083EA72FF23EA7153B3D033642BE3BE20B3FAECCB2BE64BE003F071F88BEA873A2BDFF2AC5BE4ED79C3EBEEF2A3E837ECA3DDFA916BC8FD0643DC5D8663EDB6C103D9B845FBD442EA2BB098D07BEEEE3D0BDE1E3FE3CF136F8BC3615ADBD76621BBD85D2D4BDBF44C6BD3B98CFBD3FBFA53E388989BE84CF4B3D569ED93D3F1DAA3BF2DE25BEAF32CE3D9D655DBDB36657BEFEC1F43D2907863E180D0BBE59F0023C92A2BA3E49C394BE36D91A3E292EFD3C1547BA3D62F9ECBE9AF65EBEB736A7BB461D153E06905B3EDCF9523EC49E10BE06F3213E22CD0EBCBFEBC8BD01C2A23DAF030FBE31DA7C3DA86C893D7D4F8ABCCC67CA3D51E364BD74917B3CDEE70A3E0E1900BE33C504BD4C8F8B3D011D533DE671B7BD361546BE1C67243D0C27013E6752ABBCBAE01C3D116A89BE83B92BBE1F64083E66F0473E1AD5DDBC546C60BC30AB183EA7C9E1BD240389BEB3A42E3EC4E49EBE667005BE98EE493D82ED22BE2CF37FBC0BCD513D7E230F3E19C3D7BDB45817BEDCCC2CBE3B139DBD5242803E0ED444BB714336BE955C483C94856BBD3A1CE2BDF58ED2BC3393933D8DE8033E815EDCBDEDB71ABDAA9711BE68F16ABC0D0FE6BD24C0BE3E93FD55BE74A70E3EDCE3DEBDB069533ED7BE0BBE09B5A4BC2F595C3DE13DEB3D6B0973BDE1C092BEC30A4ABE1EBA843E5A3838BD8313043E0F4007BD6D0CD53D66EDD6BD750DB9BEA4D4D0BE4E6A083F591DE2BE6239F23EAFBA6C3E343BACBEC513CF3E9AED21BED621C7BDA3C667BD48C1ACBD195092BD57EF1F3E4AE3393E5D2B2BBEFEAAC1BDE763F7BDCC509A3CF78A263EB4EF8ABD1FED6F3D5F4D30BD96EB113E440126BE56183EBE74BD743D2920893E38B3E3BC19B106BE8D55333E7C531ABE3CAA053E9FAE2EBE079A9F3DCF0892BE9A44FA3DE8B3BDBDAC810C3EE1DB4FBE1539663BA188403EB663E93C4F741ABC32F4B93C6246C9BDF0E738BEB279EF3EC85126BEFF30CE3D6B1FA0BC823D91BD61822CBDAC30F23BBC8F58BD0138EDBD044301BE1979753D4BA812BEADEFD5BD9E0D293D18EBEF3D7FE8F5BD7340343EA68333BE22F6833EC8292C3E95399DBCFBF944BE194E17BE2708173EC36772BED396DD3D9A46583D41F581BE7CDEC93E7B73F3BB0044F7BD53040EBEF6F2C7BD0004473D3A4D30BEE0DA5B3D0D28893D4E9AB53C37F59FB9374403BD040674BD5B82883D9E251B3D128493BDFBB26DBCF6B0CABD1E776EBDEF7A8EBD63E57FBD2444E0BDB3CB0B3E1AE9D93D780B2EBE50C944BE724B9FBE619B88BD4E4A893E95943EBEA59ACB3E9411BF3CA43F6C3D917D5E3E6097853E4160883DBE37A63BF3FA02BFA96C14BDCE48053E795D8E3EDA37043DE00EBFBE292E4E3CB52894BE1755873EBAF543BED83B833DA1D4DF3E6784C0BE498FF1BDADF58A3EFA8FA03DB077D9BD84956A3DF992CDBC365605BD53A2C9BDF7A52FBDD110893D99F19D3C4A90043E1B9E06BE1707D03DEF24CA3EED1661BE4F43A9BEA3D884BE14E0D2BC8F2F40BE699A243DA984043F814304BD7795073DF9CF87BD7936BD3E82EFB03D019D5EBE5BB7A7BE7442503E8A8F2A3DC4D418BD1C47833E82A885BE0356983E70BE07BE0E89B23E78D5CCBE656BC3BC258D1C3EF082B3BE0591CD3E263AB9BB9EFB82BE14F5FBBC3984F8BDEBD410BEB414723D7099B2BD408FB93D35D5143C2F0DD53B8C89C23BBCDC08BCDC2236BE9066E63EB9FD1EBEE7C957BE6760883D753F263EE64285BD55E3B63AF7463DBEF2FCE6BD3DF7CDBD5804C93D6A214DBE271EB63B334EBA3EA76FE63DB95CEDBE279C7B3D2755BFBE7FD3043FFAE0033E7714F2BD2C580EBE9FCE543E5F4D8BBE812E8A3EA82C63BE82BE703E13C315BD9EE7F93D"> : tensor<16x4x4x10xf32>} : () -> !torch.vtensor<[16,4,4,10],f32> 
    %1 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<"0x0AE346BD5C65BABDAF37D7BB317C03BE1507DF3DCF86AC3D486E2CBE83EB8ABE4DDB9BBC88D98D3D9CD1223D1AEE40BC316981BD077B1ABEFB48E6BD3F198F3D8987493A89B7AA3D456439BE2AB3F2BD458E5D3B81AA803E1943463EF7535FBD353703BEDD1CD9BE468F8ABE8CD684BE21F7A53DED29B43D8F001F3C3CEF6ABE231B83BD78BBB23CA5474BBDA6882D3E0444713EFB359FBC19460ABE44582FBD3E4287BD029B3E3E55D7393EF95C14BEF69CF63C3A340FBE6FA9E83D6D23D73DB218523D03B26C3D67C91EBEDF3109BEEC82A13D5095EE3D728D0ABE9B04FFBDF21C54BE8DD011BEFCB97BBD90B3ADBD75FB41BE6AEC61BECBC35DBE1887B1BDA4ED843DADC284BE8BDBD4BD097BAABE9FE109BE2B9F01BD78B2E73CED6BB73D08A7DEBD00F03FBE012E65BED851D33D67FE42BD1914D9BC3C14B0BC4E1DEB3C6107443D7F51CBBA3EB5D43D464CB4BDBEFC60BD8C1B9D3D3267D83C03FB83BEE6AB91BE22A155BEAF90923C1EDD8A3D3CB80CBDFAF49BBEEDAC01BE68CE2ABC847AF03D10F72D3E285789BD197E613DFE08333E042C86BD6D510EBECD029EBEF705D6BD0A79BD3D2294993ED6667A3D8F4365BED9F75EBE3C97B1BD83780D3DA082F93DD9DC12BEB3BA10BE60B5D8BE630311BDBDCA593D6827C63C96A783BC1E99F6BD558126BE9F22C6BD5F06123DBD925D3CCC4E133E5F7CA13C6FA2ACBEFF8264BE31EB25BE987F2B3EDF70E73EF81F893EBEADFFBD197E5FBECDBD18BEE2BB9BBD50D7833EC3B0D23D7F4F853D9282D7BE69749FBECF8413BD07AB3F3D4985EA3D390F5ABD566D0BBEFD5D88BE5A2E5ABEEFBFFDBCDB9A5E3DCF9E2EBE2F5B94BE9FA729BD358F7CBE0D5FCB3D52EE473E180DC9BD927D8ABE175D19BEBA41AFBD2F95013B88885D3D7A7A3F3DC1F124BEDAB4BE3C5991853D8BD47B3E4160783D703A523C4BF9C1BD29B4D8BDC9D86A3EEF34513ED31BB8BD297B7DBE95BB133E4FD2543D1940C4BC5FCDCC3D88F869BDBE589BBD524C6BBD3C90513DF452B13DE4147F3D1C351EBE9BE30FBE749EA53C1A69E23C2423D0BD805EEB3CD41403BE947268BE6F9D89BE4E70083EFFE29F3DFBD4FCBD19E314BE120E31BECC69993D42E05B3EC4DA98BC1A583EBC538D21BED4F220BD10F66ABCA8210FBD08D00C3E02E5803E4327333D860BC9BEE08D9FBD6593193E4721533E6C5010BE8CC745BE839A31BD73C8B83D47485E3E0F09ACBDDF144FBE9EB906BE838ACCBD2E47E1BAF127BCBE86C79EBE632FD3BEF5AF04BDBABF13BEDD6FAABD9FEE84BDB82288BE5FE871BD558BD1BD38ED143DB76A0C3EC28719BD4222BFBDBE15E23B97DAA53C886E6B3ED4BF13BCD3482FBE28BC38BE12CCBD3C3CBC1DBE441856BCCEFD07BDCF84AEBDAC3F63BE781781BEC1283DBEE34B66BDE799C33DCE58D4BD33DB2DBE9B2321BE3DD9EE3A3F46C83BF293C4BBD10E563E6DDD823D145C293E48A28D3E667D6BBD6536B23D9346173E3DBA0B3E23481CBCCBE2023ED9CF90BCE2879FBD57FA05BDAC441BBE92AF0B3E1946F63C986292BD772321BE3E8FA3BD9A23C73CD69BD73B1F000EBE3750E83D1724733E245989BDB45002BE1279C6BCBBE45E3EB34A763EB6AE69BE09740CBC23E348BEC7E4B6BD39B736BE99E84BBE75729EBE86B3E2BDC66AF4BD05C42A3D2B1A3C3CE587B9BD855C25BE867E25BE79C1BFBDD544CF3DE8186C3E2310AB3EAC8922BE6946E5BCD5EE1B3EBBD4073D0EF7503E7859DC3D9C38023E848AD83C4EF93DBE395C5CBE87121BBE290847BE413CD0BD2ADA88BDDBF339BEDDDF66BEABDE7EBD706557BE3971B2BD7AD806BECAF0F3BD5F2B19BEFEADCC3DD0D4F43D5CEC693EBB2EEABCFF24353D404C213E6C2DBC3D00E7683EABA5B2BCF749443E3AEB963D9566483DDC9920BD91BA40BD00696ABE550814BDABAE293D4CF99EBDE7B185BE7CC7BABDB91331BE3B1074BED5AED53D6075FFBC29EC82BB86554CBDFFBA0B3EE0735E3E567D4DBDD1F02BBD4DEB81BD8F218DBDD1EF0B3C0574793E2F3A0D3EEBBD36BC0B5C12BECB60E43DCFC7953D24CAB3BD7D2D493D1B8D3FBDF10940BEFC632ABEE31050BDE294ADBD8DC2DB3C2A23B1BD8CF43EBE6837F13B6FA70BBE1FEA76BEBD138DBE8C1CD9BDA92957BA3D8D9EBDA79DE63DDAE7C83D874622BD2221033EDE3EB33D97748A3E7A8C4F3E6480543EF404233DDCDC18BE04A8BFBD73E1DCBD686247BE6DA68ABE507020BED215DABC4CB8C63D965A0EBC615277BCD2F237BE1C0F70BD6C03A2BD88F961BE8559DC3D834402BF74AC9EBE73D611BED807643C624808BD84907ABDFB7269BE33F52CBE4765F0BD375ABABDF006853DAC4671BECC3689BCAC60EF3C67B5563E2C732FBE22B4A03EA768633ED51973BE08DE2EBE8C3A5FBEE0414B3E0BFB2C3E4E2D7C3D155B2FBDC06989BE92CC873DA175953ED2CC193D9B592B3E63CFA5BE578A84BE5AB794BD9E1348BE761B913D91679D3C487595BD8A6D61BD904BD8BC468040BE2A40BE3D9ED641BCE9AC3CBE3DE8F8BC8C04A6BDD44BF23DB9130B3DF53B1BBE6539FFBD1041B83E95929B3EE79C233E9679F03D8B03323E29745E3E46B5C9BC907D54BDD0ABA4BC50FFD93DFA76ECBD0EF0D13D2E1682BD3D9BEEBD0DBC08BE07EB94BD581CA03DAB05A13C2E7CD93DC054A93D0B131E3E9B1197BE9DBA44BE50AE95BD1FC5433D17AD4E3E47D262BE4E5592BE52C9C9BE7D3104BE2B598CBD2B2E823ED38FC73D55966FBDDA9F0CBEE98381BEEADA873EDBE5393DEAF87E3D23DD373E1077333E364EB53DC058BD3CC8BD9DBDF9EE9F3DCFB93EBD008CACBD5A5784BD4F8800BEF622ACBD40B8683C7C0E113DE49728BEDA807ABE3B23BDBEC7D538BEF3BB0E3E85C1D23D3DBFCCBD7C171FBEBF8ECDBEB114A43D6750EE3DDEFC473D0CE2533E907ED63D730F98BB812A773B285A41BE4277BB3D82A3B5BD093E3EBDA49D25BED24E1DBDAA3347BD138854BD74FC863D0FCCB33C7CA302BE344946BEAD488ABE5E4CC13DAAC3683ED84CC33D0BCD26BD21A373BE3F6B0FBE693A243DF8F15B3EE82F8E3D2EFC9B3EDF6B8ABD962377BD446A63BC94A7643E63A9F63DCD0380BDCA319FBD8BD18F3BBD4287BD02089ABE1A100EBE1C3662BE5F3225BE72598BBED16491BEB9CE5CBE3D0A97BDCEA648BE00E58BBE316886BE56C43EBEBEDB663E2484AD3C4AEC543A1E45373C8CCE863D53F909BD147653BE148B52BE047154BE4276A2BCC8E04E3D0E8A9A3BAA144EBDBEE2713EA0F383BD03035B3D62BE893EE5F6B03EF964513E6DBDD4BE210D7CBE0BFFD5BD148737BDC2A0DC3CB650B23D77CC65BE067E6ABE9D43D53B081794BCF538AC3E213B533DB3A3D1BD8CD66CBDFE1924BE93E81EBC903F56BEBCECB23DAC43CABD53CF0BBEE54950BD1A4F23BE6166A63D28F26F3D1AAF67BD24B23DBC0EBC00BE175D1D3EA7EC10BDEC80A7BC83A929BEC573A9BE9B9865BE290E953C9F6369BEBC018E3D988CFF3DCB5AFE3DAC9E4DBD551DBE3A68C0C73DCBE1853E67F62D3D1CEDBBBD3536883E4054453C3107823DF95D953E6BD856BE28DBA5BDF3181BBED4BB8A3C8907D73C1D5093BE055E1FBEF052EDBD3EEC29BED11547BD2F50BBBDE951AFBE80EEA8BDC3E915BE99BF7C3DA89283BDABB1D73D2984053DAE7624BDDA6A2BBDC0ED15BEBD773E3DBC3044BE2612C7BD993EDBBCBFB60EBC84D83BBEDA10053D87DA603D3575673D7253B93D872A95BDB6FF263DF807913CC1C5BD3C18ECAE3D6810963D4D4F973DB587493EEF11083E981CA6BD7183BCBD1C8DADBC8208853D2960883C6EB84CBEA0B6C8BEC1A35A3D5CE1173EAF8082BCD2C73FBD362D40BE32D81EBD27C4C4BD693477BEDEFDE1BD0EA3FFBD1BD746BED83358BEB801B7BD1DB9E5BDEF834ABEE3B5E9BD631A74BD852DCA3D52B047BBD63FC23D9F668DBE84708DBE9DF1DB3DABE92A3E0B081FBE9AC8CDBD691567BDB1752DBE0085E23DD0C303BE1C1E69BE7C3CC5BD78BDD0BDD1F4D1BD2B6FBABDA650CABDC5A801BEF7A78FBDCF8709BD91DA50BEADA50EBE6F2A66BEC420ABBD7274C33C7BBA243EF8A821BEB81372BE68133FBEC7DEA93DC4E1FC3B077742BEB2DC16BD389211BEAAEB3BBDA043173DC9DF90BE5C7D29BE7EF63DBE54916BBEAB8E36BDC72954BE191E7FBDCBC4D9BCA3F6B9BDB3EC90BC04E95ABE81072EBE36EA4EBD8674243E637AD6BD9DBC3CBE596EA7BD969FC53CD9E9A13E1DECA8BC6DCB17BD573C82BCA7DC8E3D81E9D03E46D1443EC5BA1BBEB2F8A4BD057E423EABDB823ED9A8B93B863982BD20A0C0BCA2BDE93CDF26DDBD038AA0BDB9E7E23B5476F5BC4C80503E0A01D33DE75F7B3D3CEBD8BDCE149D3D2DE9883A37D2443E39526F3D9E2D56BEACC9E2BD484E1B3E581C18BDC2E75DBD4B8366BD3A3B2D3E9008313EE12D93BD0A8C1EBE7245C73DE9ADB0BD1AA41A3D45B6F8BD97A334BECF5E19BDD12BF8BD0B4D85BDBBEF3DBCDC723EBE5DC5333E8688693E496DE63D0603AB3D6CD0F6BDD5F32F3EDEA35A3E023F603DCF55833EF9E538BDA2209DBD7C03F1BC2508C33E8A3EF03D9ABB813C139437BE4B2290BC790ED73DE950E73BB04A75BDA59B92BB52CB0FBEB5CB88BDBB2F47BE644F44BD11B9663C568C59BD1F94C73D5FBA3A3ECA758B3E36D5173ECB2FDFBDD81FC9BB603F6E3C0715EF3C00AC2DBD9E3315BE9BBC87BE02734FBEC2656DBE220E443E06B9083E23B31BBE869C61BEE25296BE84D993BDE76E56BD4350903D6E1A2B3E39EF263E76B639BDAF5629BE3C3521BE3B9BB0BDD7960FBC79C185BD4DD7EFBD760394BE3BC311BEA73B8FBDB44E96BDCE99403D65C4903D91C03E3CA58BC83AC02F893E935BD43EBBECA93E1D76593DEFE9BABD887DBABD71EBA4BD56D19EBD9ED51BBE2A388EBDFA8D23BE171B903C5E6B893CB883D5BDCB6A1ABE00AD0ABED81461BC0E2BDFBCDAF7F83DC8FE4ABEF05BD5BC8605D23CFDCD71BDA0FF663BD24EC1BD5AD505BE84A471BEA7E0DCBDC30D89BE09478FBDF95BDE3C061E963E8B20783E0667E83D9FC6C23D7C4F94BBCB808D3D333CF23C18F506BD6459ABBDD61620BD4B20143D663F76BD50FDAF3D417E8DBDAFC01A3D16ABE73DD12C95BB009D54BD011187BDAED71DBD640A92BC9BCD5DBE488A87BE75CF6FBEE1610DBDE778C83D6B4D3B3EE918243E42337B3E8042333DF6174A3E32D9963D4795653E93DC75BD40DB8BBCC13FC6BD099CC3BD2811C53B369D00BEEB39C63DCA68243E3382C2BDFEA787BE2FE350BEBB75613C1E461C3DF1E2BFBD2A0721BECA3092BDCE3FDBBDDCE708BD071F183DF8DDB8BD4890ACBD71DE00BECAC61ABE1A6EE43BAF65553DDAD6AA3C103EE63DE352D4BD602C193DD34E873D8AC0DE3C1C31623C052CE3BDC2FD6CBE2DC23B3DE388A83DFBDA66BEDB00D2BD9923DFBD0266C8BDAA82FBBCA5A5413E22DE353DC18B9ABC4F880ABE33402FBE7C04393E5556DD3D27CE82BC00600BBE681D5FBE75DAF2BD551FB8BD481403BE1FD175BD33A4BEBDBBD428BEAC7F8DBD54FD663D4F80A83DBAE701BEEAFC9D3DA73AA73E1B09233E9DAA25BDC0E200BEBD39863EBFF4A33E2773EF3D03BE973E8CD4D23E45D382BD693EC53D4EC2D0BD8F1094BD20AF913C0EFBF9BDAAF58C3DC7FBA4BE8A11E5BE4F4359BEA08133BD378152BE64314EBEC8C567BE5A6AA6BE90D73DBD06FA1CBE40E035BEF04BB6BD03FFA6BED6EED83DE21A963EC7D3BC3D4402DCBD4F35EFBD701CE53D547D243E32AB433E03D38ABC9212BABDB6060E3C8546B4BD2B6A623ED4D7A23EF0F30DBE54AF773D979C243C926A663DF903653EAD9F273DBA4984BB1BE3493A067A8F3E1273F43C974C0BBDB16F52BEBB315DBE7CCED2BE773E4ABE4C965DBE030B06BE25F463BE4E6E81BE655389BDEEEF03BE3AC8E53C4610893D0CB6A9BC7A7EAFBD4E212A3E16000B3EC21E553D0DBF1ABEC5CE33BE0B21513E38C763BDB4E41EBEB55181BE90B6363DD650293E83969F3E13843A3CA541763DA4741BBE4E02E03CFC2E3DBD5376CBBD3D33B93D15B5FABD35DD66BD4B46CABD5779E6BC97CCC6BD5391EBBB083638BEC51C83BD4E87DEBC54B58ABE3F7A38BE9217BEBE4EF57B3C8F0361BEBABF93BC78651DBE5E812ABE5BBF03BEF28D8ABE040F28BD5F64223EF263E53D6BF4A43D348249BEB0FFB5BEAEC10B3E515E5F3EB055F73CB1933ABC54F168BE763B81BC48422D3EE7611D3E8DE5803D1A3420BE9217503C659D0F3DB779D3BC43BAC5BCBC9B39BCACF4253D5EABFF3B2ED4D93DE5E22ABE13DDAFBE6DC5A2BD082688BD2F6BC1BB10232ABE5EE0BEBEBF845FBE4E07FA3D05AB923DA0FFEEBD766885BEF245E4BD9CE2AB3E3805C33DDE38BE3D0F6FB2BA87C93C3DCE72DE3D26CF8CBDD111923D68C31F3D947A83BC41B620BD01981EBE29A4FF3DB79A563ECE4309BCB239853C63F4073E221F893D9B1A12BECA10453D15DD223EDF572B3E5920F1BD077510BE87748DBDCC82FC3D8F7ACDBD085007BD771C92BD564951BD2D5F5CBE4B7D21BE63C8EF3D3BB72939A9DB163EED9E6CBC1BC79D3D170206BC23D5C2BD85ECABBCE2FBFC3D2B5C053E80569E3DDC3BB63D5DAA5C3D029D4A3D1C3B53BDA0AB243D0E98763D3C1EA43D60BF4C3E71FC3C3E0CA381BD537178BCE0B7CA3D791C4F3EB2EAC2BD420124BEB12C6CBEA97A8BBDB3D69BBD16D99B3DDEF8323DE37276BD88295DBE881A1DBEAB354B3D37CE613C34D00DBECD6C003E4860BB3DBD78ADBD387399BD788FBE3C14E4923EF77D943EDAD5C9BD2320CBBD4D4B453EC77E7CBCA5E78C3DF13F36BEFB51653C9EFC18BCC0DACEBE651CBABE3302C93C52A6EFBDAC9049BE6E9E78BE970197BE4185C3BD72FD98BEFB2E56BED23084BD9189BFBD35C405BE93189EBD1F1C7EBC1E6208BE54F5CD3D86A33CBE833AEF3D3B380E3E2F2906BE6479AA3CEE8A433CACC3883CD27CFCBD588731BE25D4DA3DCC3D53BED94127BB474DA4BD7F6582BC63405F3EF7A84ABE43602BBEC62383BD043502BE355C073ED23619BE4FE7D8BDC24586BDCBC5C43DFA42E13E8E72ECBDD5F043BECA7B29BE522C05BE81C372BD282352BE27D299BE39E00FBE7EDF523CF69A253EA165673DE6505DBE3C1F12BECB4F46BD0315853D5B77CBBC7D9756BEC1F807BE7539553EECA9983E7CABCABE6F6CA13A337C243EFCCB183E781230BE768E65BEC5B0FABD8EF6FB3C22FBAEBD8FE875BE712D54BE163DE7BD164D9FBD2884FBBE7C7A85BEE876C03DAF4877BD281330BE063CC2BDCD52713E40F0F43CE2F508BE7A2DEFBD2073823D418D463EE946953C8E6AE6BDFD6FB8BD86C074BB6A0C2ABD70BCE23CA95089BDF455DDBD0A16953DB7DDC439ECBE0C3E5542A3BD94B54D3DFBB498BDA2A0143D98C5893DF0BCA03CDAB2E6BB621D21BBEE18163E9D96B8BDFEF18CBC5ADE42BBE695263DBB76083E044045BEE5C01D3D659A9B3DA77F1FBDB38B503EBB965FBDE2FB07BE64DC2EBEF726AA3D543E133D5F1E073EE0EF673D017C17BED1A752BD5B12CC3C3681C23D1EA4B33D81EF3CBE94A8A7BE6E7730BE59B87F3EFFFAE33D9662FABD188288BEA4CD63BDC546AD3E520030BC3FCA0ABE392FBFBC036522BE971A083EBE972ABE5E16163DB101BA3ED94FADBBEEFEB6BD8ADB2BBE06B8D43E0A10AC3D31E8B3BB8FE830BEACF635BEEA3482BE497244BEAD125CBEA5CDF83C89279DBE910517BEF51527BEEBA5B9BCC8B922BEAFA2B0BE48CA873C4ECC823E68D1D63E600235BE0BDD26BE720E193E71BC4E3D3FC22D3D3D16A7BEA73CA2BCB7CDB03D68D4383CD6C431BDCBA0D53CF4E5BC3D2AD00ABC3894BBBCB006E0BDCC8E433DA3CBB03DA521B2BDA9F4D3BDEDD272BE7325793C80D69B3EE1ED073D22C42BBE20F3DC3D7153123E1121223E9113D0BDCD1E673E9F569C3D5250113D166213BC88C67A3E2386323D19E3073E546EEEBDF65A403DBDA400BE0C9605BEE199843E99C2153EACDE643CED2D39BE603AFBBD6AE45D3E4590053EA0E67DBEC6D39EBD1CAFD83D91D1B03E6FF51B3EB3B638BED53A9C3D97CB25BDEB94A13E6E4A71BE5B46CABD3B2DAABC25C0033EFF6EFF3B480F64BD1BAD26BD4D47943CDDB39B3DB6F017BD8D6A46BE9F408CBE2938703D71A0A23BC00DC7BDD06449BE82A99DBD18E7623D330E15BDB14183BE8724123E59D28B3D25C00CBD4BF85CBE15464DBE637B323E038221BCBC3F31BEF2F6813C978D0EBDD718963D92CC173E0007673EEA2AC03DC5B9CB3C4A94D63CD66E403DAEC1343C686CE8BD653A053E4C01F23CE65DA73DD57D34BE9BDB82BE7D12CD3D4E26E7BD5D3569BE135983BE0D044A3E011E983E8F7B0ABEC55B2EBE965B3DBE9FA7723DCC74A93D826EFABDB90BF03DB00E7A3EBDD7AD3E7BB824BCE6AB52BE030DE1BD160283BC46BEB0BD391860BE3AE69CBAA374C6BD087692BED74681BE751297BEC68E4BBEA31B7DBEB2ED84BEAA03D9BDED711BBEEED807BE6CFDB1BE66D8B4BE84B0DCBC520639BD3EFB093EB52E863DAC48F03DFA943C3E9F6E513ED4541FBE57640DBEC2A83DBD9D8B823D973D4A3D372939BEE90E78BD43906ABE5B88E3BD4B6D8ABE9489AABDD8D436BEA6DB8CBE83EB31BE41B36BBD54E282BECC5CB0BE0308AABE769707BE43591ABE9ED73BBDE39738BE9D26A0BCF10DBE3D80729E3CA2E657BE3045BB3C454D09BD183D0FBEF5798EBD7A8333BE5316043E05EBC23DD24E2DBB318E0EBE2C53C7BDF5C4183E3DC39F3D2D6282BD30CA00BD033D4DBEA2FB7E3D4D7C1DBEE9550F3EB48E123D091891BE8CD7A03D6364063DAADB993C4195FCBD0F2898BD2DA62A3EDBA3353E6D131A3E515637BEA930963DAD73113E687B23BC25B65ABE1E9948BD08A9413E357A03BAE3AC78BEBF2115BE2F5C08BDDEAED83D3685A1BE91A31ABE1001533BC8A5173EBD8265BE1E8D81BD9BB959BE784B2E3D92E4BA3D15422CBE50EAE7BBBBE799BED35D72BE5E5B41BE6F137DBD807D853D616E9FBE9F332BBE637265BE2B89C0BD636BC1BD47FC533E3F5C083FF1CDD23DB5220EBCA7E0633E7D59C53E0C7F813DA9F53F3D6E4F75BE3AA3183E8886843D7A843D3E13A4B33DCB028DBC28BED9BDC34E153E70F5933E6CF9DF3D24A2DEBCBC2AACBCF97188BD80EA6E3E39FC1A3E02E440BE548C8EBCB4EBD83DF7438ABE6734A5BD6B34D83D3A9C36BDB28185BE1DCE3ABED7C1DF3DBC8C25BE9064353DA573CF3D2021C43D84234BBC31FCE2BD7B4D7ABDB88E9B3CF484C4BD3D74BEBEBE18F73D5C5F213EAB983E3E09D753BE5F9B4CBE8C7B4F3E051DDB3D90E314BE3A3B8ABE909D3BBE08B29BBDBD88D3BDBCC599BE58A279BE61871DBEF9B15CBE57961E3C18B3433DACD11CBC25F617BEA09D32BEDEC651BDBEF5EA3CD00F1BBCEEFB33BE9A43B8BD6DB2CBBDBD98A4BC022A83BDA8C65DBBB11043BE4803F13BC703553DA174403E99A3C03E0C2E063EB9236C3E72918C3E6A10443EA9F19CBDFEFEA8BC82E9D23DE177DBBB9A7BDEBCCC0C933E8A0F16BD9D03663E2BC23A3EE8B823BE8B19863DEC42D6BD16843EBE4F8B95BDA95A2FBDA4A0AB3D05AEA5BEB982C53DB18A05BE60EF2E3DA7CC10BECCAB60BDC0F188BD8BA232BD0A243CBCB0BCE0BDE496A7BCE1FF9CBA6011CABC510299BDC6ACA03E18C5D2BC771B313E89232D3E89325F3D7F4A6F3E8A84523D1A3DA7BDD78CA1BB8CCBD5BD066FBABD3B8405BE2233CA3C1113BE3DB29DB7BD7D8B5EBEC9B5F2BD2539AB3DE30414BE0E6A99BE077071BD011C543E390E01BC6A521E3E8C11093C5C1D903DAD73DBBD269C47BD3C5F85BC0F31EB3D54F5403D0BB4B2BDBB157DBEE705A1BE73E959BE59D388BC04C4D5BE6102AABE000DF2BE9200E1BE689C94BEF228B0BEB83DBCBEC965A5BE455DD2BD250BF13DF6344BBE976AB9BD882269BCEA90A6BDDD6311BDEF25C3BD4B7166BD002AB13D250810BE4921D4BDD15F1B3E3E18263E6037D3BDA033B0BDE9054BBED34DCABC05F386BDE5354D3D730CD33DD2371F3EB83B43BE1FD2D3BDFCA1163E9CFACA3DF551D53C224074BE7F72B4BCF76F8EBE8A571ABE896F273ED504B93D2618613D799959BE1ACC333D8D6C5F3E5BDF0F3E6015403B2A59D8BDBC4B043EF280343C12EB753E3025AABE7163B8BD51B115BE1E305FBEAB8D963CA28ACCBD8396BBBEEDA8D5BE4854EEBD9042ABBC5E4EF33DEDB4333EA642203DC11C39BE0BBCC63B613881BD8F8CF23DB672D33E1F70DFBD3EDBD23D0CEF21BEBC69113E139A983E39B2B83CA50F1CBEE6F2A0BB9943053ED5DFE63EE8F7933DA97F05BE3D8109BE5A6B633BA943543E6DF6153CE013D03D089491BCA685D2BDB55387BD8B54B1BD85F9F93DF992453E1317D4BCF9D096BC49B734BEA11BACBDA854F1BC233C47BE1122FDBD4DC8B9BEEFCFEABDA35BD1BD1909BEBD8F2B193E003A1CBE235668BEF72516BEF11D19BE5D7ACC3DF07C953C0799703ED436DD3D8C760CBDAE7455BD57928DBD00FD0A3E87AB283E827646BE48A3F13D7EDDB3BDC97E3F3DEE711EBEDD9BF7BD7EEAA13CD49C28BE6920033DB48A92BEA40983BE62CFA63C560FEBBD7BD253BD354955BECED34CBD8F3789BD303B86BEBB93243D650F37BEBA03C4BD81E9C6BD37CA84BD2E01503DB09CA53DADA110BE7A3E17BE0A3DD93D47EBEDBDAFC3C2BD8E868ABEA8D0EFBC7D26303E59F3B6BDE7F3EEBDDE7116BE6A177DBCBADABE3EA34BD9BD1CBE95BDB2CD5DBC0547C33C5E8F0E3E4361B63D3B7B57BBE3999EBE49B74EBEE25601BE7366EA3D518CF23CFC355ABD660C8EBEA56D48BDF925B4BD1C9FD7BDDBDF95BD81A556BEC0A219BE49CD3F3CA13207BEA9BB0FBEDFF20FBEFE39ED3D11B1F8BCF4B138BE7F1FD1BDFFA3833DB6323E3E324950BE13FD63BE8CD9B4BE612535BED0117A3E44E8C6BD5AED5BBCFAF255BDF18481BD3D41953EE4F61BBD681A233E3A402A3CDB1A903D222FA43E7000D13D16DA943E0A8E153EA81A233EC3F2BB3E1898403E192E903DE1B8C73D4C70ACBD8ECF913CD897C23D090C64BDBD78BA3DD4BD083D9E6B333D1B4D43BD7A0B5E3EED7F7BBC3E4513BE4F33993C4789F83DD450323D176B84BB8C7180BBB6F93FBED58A9C3D244F5FBE3616FFBD9B71333EDD1A38BE138105BD95B6A5BEC14959BE38322ABE0707863B4291783D8528A03DDE0717BD54A067BC8216DDBD6B64DC3D19F7193E91BE22BEA633C4BDDB7E8FBD690548BDD81D02BE722CCA3CA8C6DE3C5D7EF7BCADA757BEDBB0D83C14CB093E45C4EC3DD81547BD48CF183DDD25893E3541D03DEC1C1E3EA98AAA3E6A269C3CDF948DBD5DD2B6BD579C0DBE54AC4BBDDFBD8A3D4D531ABEFA5AA7BBE4E4813C8A5134BD4864D43D92E96CBE7FF3C7BDB71D98BD9EB7723D9D39383E2652A7BC9C7E553D65049D3D80069BBDD442FB3DCF5B3C3D82C2E53D9CA5283EE2764EBBF653AFBD478E2FBE61E639BEC2C14CBED2A5E1BCA01AD6BD7E2F21BEEA79A0BD80005CBD9F38903C2A6A38BDF6B9D0BC2C6F7BBD8C6DAE3CAC7E863D5C2103BE8B2F9E3D3D6E293E19F3143D5AAF6BBEF152113E9AAC693EC22DA33E2D903FBECA41C8BE89C798B9A3104DBD4929EBBD89F7F8BD49E5FD3D01E59D3B630622BD96E32EBDAA3A903DC17633BCB53C6F3D02F2C5BC951EB33D412FEE3C03C8BF3D09FBA6BD9446C63CADB15BBD600891BDFF2F73BD428C77BE682F0DBEADE581BEE293D4BD8462B93D082CE0BBD5FD3FBE5C3262BE41FEBBBDFCE06EBB910D4DBEE32D04BEFDDBC1BDBDB5273BEA191D3CCB04493D031E853E407E003DCFA08ABDCD2A6BBD6279423E375C513C9F3509BED8F34DBE8995E1BDE95623BE0E144DBDA1817DBEDA3327BEDD3E723DC73844BDC53A9FBC06732DBE417AB93BB1ED9ABD63252CBE6480B4BDFD072ABE7BE4E1BD6E291BBD20422C3E27FF583E9A1F6D3D58650EBD43A7D2BD22D7DA3D65FB3F3D490744BD97B843BE9E5DF0BD0FF343BEF93305BEEB4325BE87688CBE1776E9BDB5B716BBC5C809BDC8832CBC025D25BE78E609BD5D9E493C5680023D0999E73D985D98BD8D2510BDACC6E2BCCE040C3EEBA182BBB3AFF5BDEAD14E3B1D174B3D5D3C0CBD307983BD5AFCCBBDA63DA2BD927DCCBD3699BABCFA8D063DD4519DBD599A813D02ADBDBDBA3F6FBEC01134BE5272F8BDD70FF23D345FCE380F332DBECEA012BE4942B6BDD357BFBD2462B9BD26C099BDD897A4BD8BEAC4BCF07EE7BC772E9F3CD06C433E852E513ECD64963A8877EFBDAD31713E3356623EDC62B33D7FD081BE9141A3BDAC5E75BE72FD0E3EAA5F6A3EAC7335BE045783BDF46530BE01C246BD05B900BE101E9DBD0FFB89BDAD33F9BDD2A777BD676F993D065AABBD300A24BE873CC63D5241D63CFC28EDBCFD8BE63D8B34AD3C4B72713EC5870D3E814030BE5C4D833EF0E9193E37B71DBEC315A8BB66D8D6BD95BF013DE95403BE569D833C60F9CCBDDD46273DFBE7AE3DA66781BEF56E9A3C9E1C70BBEA99A9BC53181ABD9FBCB73DA81DF6BD74F88BBDCE8E9BBDF005DA3BC05AFF3DCF5101BD55958EBED4F1B43DCD00BF3D2494533DB9C5513E98E2923E5E91283D7BA72DBE59C4B53CEFC20DBDE05C9F3D952FF63C48F3F0BD791C05BEB1F50F3D1C987E3D84F2003E675BD4BDD99473BE21FF063C0F93743D783D493ED852743CA2C252BDF1F6073C7FA9C43C83201DBEECD268BEE1D932BEEE4BB2BD96D5A7BD81CDCD3C23CC4BBE2D109FBED95E86BE7F3855BE369701BE7FFAC0BC94921FBEC0BB16BEDAB8D1BDB07ED03D6D2F233DD2FF283E339062BD225D21BDA67BE33DD8656F3DE12CCA3E6D11153D2082D03C1253063E61C6D13E5BE4F03E67F8F5BBF815DF3CC159C63CA521DBBCB37F02BE9BC3DD3B47A3C33D91F6783DC2D4B2BDB113E53C6119DFBD9B5FA53D01FD5B3C4DA41A3DD0017C3E7FA7BFB736E9ACBDEEF759BD406D7EBDB438BA3D88EA183CC6902D3D8C6924BEC16F2CBC363756BDF2AE313EAD794D3D7E13CEBD4F1D4CBC0B34493D27E51EBEAE64633D3874C93D142007BE8123D63C8032A83C79FC963D7B32FC3DE2EE26BD552BFC3DD1A5903C2348C0BDED0F303DE5681A3D5246DABDD8B770BC09A7EA3CFB969EBA32920BBE209DBDBEC2560F3E0E6E92BDB63A443E525C583E329DF3BB7029B33D5ADA0F3D4A148C3C5998683C394F283D6FA872BD079A5DBCB501CCBDF4DA09BEBD3B5BBDAACC573DAD650CBE8293F9BDF42102BE78F701BE46E0DE3D74B5B93DE81770BD249D99BD784BD5BDA505593E04CE583EE2AA8C3D231982BEC8EC24BEE43B8D3C88FD2F3DEAB7DD3D0FCF26BEF76E7FBE0E79A43A92EBBBBD6D6091BDA281CFBDF9BB59BECB4A6B3D31B8633CC1F257BAAAD606BE9BA05DBE9952DA3CA06D23BD487056BEA38AFBBDFF06D03CDC4D1B3D5EB1F03D3FB3F5BD53252EBED27CC7BDC7FD503E4FEC413E2C432ABD8FCE3F3DC46560BD9E0D9ABDA009A3BDFD6CDEBD909D05BEBA419CBC5A7B55BEE40A01BECC4154BD473D09BE3B1083BEC6FC41BDFA881E3D8DA125BE8FED41BE146673BE470DC03D5384013D6F85303EA9EB1A3ECEB9883D3B2F8E3C25707EBE0B8F8D3DCED9A93D16C3153EBD00183E65B92FBE825EC1BD6ACF4D3B9EDC403D2974183D6C7BB6BDB316063D4B7C31BE96F8FFBD2FE7F53D3D6B13BCA2B2BD3B54A853BEAEA8903DFE5A96BB5F7CACBDBE23443D1F70593C39F0283D69119FBD85C4353D5AE29D3DD48681BBD964373C38626C3E3B5F103D440B12BE469CC9BB8277E23D03A2233E5F37B3BDE4024BBE6F414BBD725EC5BAE6791DBD34E820BDA964903C974A553B4F103FBEA7CD843E5662F63B936073BE28BC53BEAEA2493D9754E93D240819BEAE0193BEC0463DBEF08ED7BC0A5266BE54420EBE722A53BEB4600EBE8B64A3BD184342BEB5DF09BED60B15BEA16967BDDEA216BEF760443DCF7E6E3DACABACBC29A0833C7E7A3E3ED2395C3D27408A3C6362DCBD06C51B3B99472ABE2506E3BC806493BDBDC315BE38B24BBEF291213C6649FFBC52D4ACBD474269BD5523F93C10E116BE5D5C7ABC59F9313DA1FBCABD00A9893D2B730CBEB547A0BD2375793D04F0F23C5A95A53D49D3603EAA50FF3B1FF534BE09061BBC9B365BBC0A0F6EBD9E7A5FBEAA9B35BD8E1B0BBDAD7135BE8940883B71EE81BDDB2FC33D220C74BD14862FBD93EA03BD548B8FBC7C1E5F3C2E6F423DE35B37BD0D9609BE9D0F2FBD43D207BDB87128BD6157F03CE591763E83654EBE6E7184BBF0D51D3E639E36BEAA1340BB112B75BC8F66463E39960E3D7F2186BD3625563DD3E9803EEF941F3E0620E4BD3A518DBDD1BF03BEAAAB8ABD89F362BEEE5998BDBF11FA3C37F24FBE4AEF63BEB79CECBDF1B9DFBD7136373E9116463E01E9963D3372663E9F5A84BDE767D03CB014A63DEE6D843ECC870A3EC38202BC5799483C0678CF3D0C39703E3B3FC7BDDADD86BE409594BD58737C3D205CC3BD2CFA40BE589EEDBDC1661BBEC2C49DBD5962B7BD9593943C24DCC8BCFEB3CEBD44AD56BE8011BF3D6E421FBD5A6754BE402A48BE618734BE332AF0BD06ED253EE0AB37BEF82563BE57666A3DEEBE92BDE3DBD43B1503513E9191103F6F524C3E878807BE4F94943E29EE893E57A9A03E4FB4EE3DC0FBD43D08BDA13D793A853E785E253EB5B348BDA1DFBBBD232767BD3C77FEBD296D86BEC7C50FBE0C2C083DD3797ABD0390213CBF2B723E88624BBEB157893DC977033DDCFCA53EA70D1A3EF46890BC07754C3E16E333BE1469203E17E1EDBDBE0F2FBEAC295F3B0964E8BDD32A013DEA6C08BEF5DD56BE9A9E053CB30A96BC559E14BDABC416BE21B365BEC30AF93DD86CC03D1EBF1B3D76A293BDF4139BBEC121C03D4368043EA31CF4BD2EF150BE8D35CDBD3250AA3D6F8A95BE8734A6BEE0E30CBE698C9E3DC672683DDC7A453D70F62ABEBF592CBEB9A883BE7642B43C58B3B83D9697C63D8107B93D0A5B04BE15B18A3BDD1614BD2A7F8A3C3B1D2FBE151803BE0B57213B690303BE24E687BEFE0A69BEFC724EBD6B58473DA6A148BD73D2083E196AA73D877893BDD3D0BD3D2DDD583D58CED13DE9ED313C8CF3EFBD8EE2513C35EF093E2474EC3D3DC43ABEF54199BDEAFC133EB76A443DE9E3B3BDD61A25BEF00F11BD99BAE03B22B051BE5E2FADBD7E61C1BC2080BFBD68D18DBD05280FBE7210D6BD284AEE3DD423AD3DC256733C741408BEB78428BD09B7093EC80DD93CA9252B3C8594F93D7248F93D03AE8ABDFC53463DE463EA3DDBCE963D16AD493D563AAABD397FEABD56F450BCBAF7F9BDBE55B4BD43E3293EF72801BE47201D3ECC91D0BD41E091BEE4F049BE3A9E143E5E92EFBD405522BE3F7A71BE3B4612BECDD5A83D422DCB3B12E9FD3C923056BEE3BA47BE9A6315BD758F21BE2C414ABED6AAA4BE430373BE130DFA3CF8DF9FBE4A2AAABE1561B6BE85E0953DAFCE503EA3272CBE74817DBE5AC45DBE63F0943ED51FCC3E1EFAF8BD8A14333DF4B1A73E1A33B93E181C81BEA9DBDA3D1A2AE0BCAC7149BEE21C4EBE0A4882BE442AC73DDAAF6C3E2C97933D04BAFD3D5CA1F33D3343213E770BF73CB5A4B4BDDADA2E3ECC7E223E938601BEBCDC54BE28644DBDFE49D43D0E3110BED74F153EE3BCA1BDAD26BEBD60D3FDBC36E8B1BDA49A593EDB0F763D77EAA23D144C46BDD59FECBCF4111EBD9585CABC9D02ECBDDE42233DBED902BDAEF773BEAFA40DBDF416C7BD26E0883D48248BBC872DCE3D89F2D6BD3B250EBE8B8411BEF9BB8DBEF8A3A03E46592BBD8EAE5ABE6ABA28BD11E304BE118E76BD8D14453D0B44B63DB7CDDA3DB9856E3EE72F27BEC3166CBE9F1A1EBE619D9CBD614399BBB001623D893C99BDDE5CCDBC91472D3E0919AB3D308D363E3AF65B3D8503F83C660E133E1C4BCB3D4956873E1BA1093D35470A3C64568E3E04145E3E5E0F9ABD45F2093E4CC9A23DF86C573ED24C613E3DF8C8BDFE3A81BDF4BB22BC810C39BEB89548BEBC243CBE5770E0BD42ED9B3C0DF6113EEF432A3E678E13BD4A94D1BD494B73BD3EBD35BDD202BD3B8A7600BDBC190EBEBE4656BEEF468BBE141D3ABECD06C5BD2B332A3D5D778E394D09B9BDB9C6B6BDC2A6AD3DE402B6BC983EC6BDFD3AF03B47C52F3D349210BED38A37BED7E941BE4DFFA0BD9373F83D1585B13CC3E79CBDDE478FBE3658C5BD8BC7793EE2303B3E45CE99BCF52280BE47CD6EBC54BFF03DE1DB96BE800293BC3C8B41BD7A1928BE447B88BD4786953D7F863EBDF834DFBD921C823BEFA7AE3DE37E2C3D0A21403E2FBF4CBE611118BE3851C9BC94C857BED644B63D5C6A5F3D21B5E3BD53EB343EF8889ABD49E1453DB4DE5BBEEA2BCABDCBD13D3E01033DBEC935A9BDD1ABDABCCBCFDCBDE4FBCEBD973E593D26C721BE24ED82BDFCF4C93D49F3F43CD922C73A4A75853E1326663DCB1B6EBEBA719E3B25FF32BE9FF6493E326A8B3D9A69853A0B547F3DF34AFDBD30A113BE24B018BED76A3CBE18B6153ED5653FBE5E8F32BE0761873BE8B70EBE8C335EBD005DBB3CC2C65FBD8F89343C793BFFBD28BF25BD8B165A3E2D49C93D60F0AB3DCD0F80BD43A7D7BDD9FD3A3A14E5943E5969BF3DCFFF3CBD1146AC3C5EC0A33D3B8DBF3E092B563D32642CBE2481A73DA9EFE83DCDA41C3E71DB703E93933F3E6C900C3E433DEDBD32ED01BE54EF5DBE174A27BE7A806ABE13CF43BE763DC8BD92152ABD93E652BD7B18EEBC6706CABD7A88B9BD0EBF4ABEC79687BDB30AECBD98C1A73DE1D81A3D26D579BE91F51FBEB4D411BD0FEF87BE4819D5BC2B2F083D83CF15BE11B01F3D6EDDA2BE45B9103E79CD5E3E8E7DBFBCDF794ABE1A0705BE6A76303E67E9313EDFA8DABC17B574BDA8711A3E6D5A353EC84B67BD132847BE6C8BE6BD1DE7D03D2057833DBE71B73C185647BDF49F89BDDF3F24BE3802993E3E73C03DD78754BD640A52BE0D0B8ABDA884C03E3986913D7C50B8BDF0B8B5BD1638E13DDB469F3E781B23BD19F430BE91A9B4BD2647A83DC24A353EFD4292BC9AFD85BE8B5E26BD39310E3E5AE680BD118B6FBE12322BBE201D86BD4CADA9BD991D533C1E68FB3CA72738BE48007F3CC5364D3D79C4DDBDC5B73ABEAB3C4ABD0DA4F43DBBE27ABE3A8B35BEA7D183BE390602BE9D11E03DD76449BEDB043BBE48E5FABD2812FABDDBE443BEABA09CBEA86EBBBD76556CBD2373053C0F2CF4BD91CFA8BEF876413DF562813DBF7E513D04BA09BEE740AABDD23CF73D42D3D03DC2AE74BE28E2C8BDED4001BD3E8A9B3E488AA33D278375BEA74E36BEB22691BCF478813E91387D3A23528FBEF282ABBDA696963EAB8E723C8CABD9BDD52A73BEAF3985BCAB16B2BE9AC6D5BEF7730CBD1F1FF6BCC96A25BE370B90BEAF0317BEF6947A3DBA88EC3BDABD59BE321058BDE82E073DA1F0503D1859B6BD59BA9CBDD18712BE104B373D2E5A223D39B503BE307B9EBCD656B4BD8533053D2EA3E5BD9383613C8F363DBE591C6ABEF61EA1BE306BA2BE5829C9BD95DD443CE153B0BDB6D97FBE2B37D3BCE4BF21BE4B12273CF49A803C953F323D0DAA6BBC4FC0D33C8E950F3E1C0D32BEA2580FBC1265E4BD7BBEE83DD8F88BBD833B81BE788F86BD5419E5BD10DECFBDE19A12BEACB1F6BDF39A69BE103A77BEA19DB3BD63AB09BE34B6C23B6B8E9DBE1C545ABCB5D5053DF4A2C1BC7A25C73DF7DE51BEC03D2F3D352D123E850EBC3D62433FBEAA4E163EB4872A3E61BD063E1CB9213C75AA25BEB962BA3EE983503E3A14C33D7E3C64BB0E3116BE01BAF63B2615853D8166743DD2658C3D6BF19DBE779F7EBEF2DA6E3CD5F9073EE6EF493ECE5FDDBE431A8E3DEC6E85BDB27110BEC7F8C0BD2E12D1BDA749C2BB028DE5BAC2EC55BE3FC2C2BD7B9255BE68F2523D9E1C10BE92BD5F3C1841E9BD"> : tensor<16x8x5x5xf32>} : () -> !torch.vtensor<[16,8,5,5],f32> 
    %2 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<"0x16E911BCDD9772BE234202BFF73884BD2037113EC08B17BF9B58F3BE48214ABDC7A9443FE9E4863E6BC8FBBE56CF633D6E6D823F18010E3FD621E2BEAA5D23BE0ABB0E3F4B93173F58E896BE5AF91CBFF8B01D3D9B71673E39CD5FBED052F4BE5A5A95BEAC5B23BDA1D85F3E2759FF3E82EBD83E0CDA463D5E38CFBD14C78DBEB52590BBC2F4063FB38BCE3E40751ABEE744A7BE28CD22BE4ECEB73E17CABE3E425311BFA07CC5BE44DD31BE9F82693E145EAA3ED5F5C2BEB3FC6ABEAFA887BD42906EBCFFDF913E8C07C2BCE606D63D6DDB813E1F3AB93EEBE2303F2E7AAB3EFC80D53E3C08C53E70A8A83EE9D8783E092AF0BE55909BBD5BFE13BE65BA31BE70B17CBEA30179BFB33237BF4FC809BF49E51DBF709BE5BE26C24BBE9FADAABE29BAB2BE678A15BE8A3F82BD253897BE6432AABEE8EEA7BEBD37A2BDF9C463BE431AF4BEFDC557BE94A36BBD2AAB273E9BDC253E4C90C8BE5DA0C0BC0773FC3DA4AB2D3DB285693E729EC13DA67BBE3E0EA7603E6D8137BC3D86393EA2B0A73E86C5B33E311AEE3C5F3E563E7272AE3E0CB05BBE3EF4F9BD50021CBB2B2867BE470825BECC5EB63D35E5513EBC1920BED21167BEADE50FBF88B876BD1A24D23EF85C6DBC5829F3BEF06510BFEAABECBDD781113EB6B08D3E3F7C2E3DB2393DBC0DDD1E3C52057C3E3128203F62EA2E3F79BC713EEB072ABEBDE9AABE78C843BEDD205B3DFCF8103E90423B3E104F0CBF4DB83BBFB29816BF03B9C4BE09500A3F8E37B13E9D2C81BE066DB1BE26FA57BE296F613EAFAE283FFEC4BA3E8E7A043EBE60E0BD85B0763D8F0F9B3E78AC723EB034F03EEFA6643E47A5C83D643A0F3F16945BBEA954EABEE4E858BEEC93BA3E4560F93E56BBD0BE69C0DBBE017C7DBE8C71D43E589B993E0171EABED09A9BBE5960B7BD345D8E3EDD5AEA3D177330BE250FB4BE71AD1BBEF884B23E88413E3E142D913D9365093E3C2A3DBD26EDB4BC482C07BEF8C5BB3D562A6D3EB0F2AD3EC102293E71C2C03EEEB5473EFA5DA13E2230113F57ACF1BD7AAF483E91BC073EFDBF433DD1D9083EF975E83C8E7D0EBEFC59F7BDE4454ABEDE9500BF71BB12BD4B6242BE1AE6DABE88CA91BE19EB42BE"> : tensor<8x1x5x5xf32>} : () -> !torch.vtensor<[8,1,5,5],f32> 
    %3 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<[[[-0.161539719]], [[-0.433835655]], [[0.091641359]], [[-0.0168522168]], [[-0.0650264397]], [[-0.131737873]], [[0.0204175506]], [[-0.121110231]]]> : tensor<8x1x1xf32>} : () -> !torch.vtensor<[8,1,1],f32> 
    %4 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<[[[-0.0822488219]], [[-0.108868778]], [[-0.141039595]], [[-0.204869166]], [[-0.17913565]], [[-0.215438381]], [[-0.133805066]], [[-0.195724562]], [[-0.268250644]], [[-0.258212209]], [[-0.0761560649]], [[0.0132841459]], [[-0.00444464432]], [[-0.414740831]], [[-0.17879115]], [[-0.0386558883]]]> : tensor<16x1x1xf32>} : () -> !torch.vtensor<[16,1,1],f32> 
    %5 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<[1, 256]> : tensor<2xsi64>} : () -> !torch.vtensor<[2],si64> 
    %6 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<[256, 10]> : tensor<2xsi64>} : () -> !torch.vtensor<[2],si64> 
    %7 = torch.operator "onnx.Constant"() {torch.onnx.value = dense<[[-0.0448560268, 0.00779166119, 0.0681008175, 0.0299937408, -0.126409635, 0.14021875, -0.0552849025, -0.0493838154, 0.0843220502, -0.0545404144]]> : tensor<1x10xf32>} : () -> !torch.vtensor<[1,10],f32> 
    %none = torch.constant.none
    %8 = torch.operator "onnx.Reshape"(%0, %6) : (!torch.vtensor<[16,4,4,10],f32>, !torch.vtensor<[2],si64>) -> !torch.vtensor<[256,10],f32> 
    %9 = torch.operator "onnx.Conv"(%arg0, %2) {torch.onnx.auto_pad = "SAME_UPPER", torch.onnx.dilations = [1 : si64, 1 : si64], torch.onnx.group = 1 : si64, torch.onnx.kernel_shape = [5 : si64, 5 : si64], torch.onnx.strides = [1 : si64, 1 : si64]} : (!torch.vtensor<[1,1,28,28],f32>, !torch.vtensor<[8,1,5,5],f32>) -> !torch.vtensor<[1,8,28,28],f32> 
    %10 = torch.operator "onnx.Add"(%9, %3) : (!torch.vtensor<[1,8,28,28],f32>, !torch.vtensor<[8,1,1],f32>) -> !torch.vtensor<[1,8,28,28],f32> 
    %11 = torch.operator "onnx.Relu"(%10) : (!torch.vtensor<[1,8,28,28],f32>) -> !torch.vtensor<[1,8,28,28],f32> 
    %12 = torch.operator "onnx.MaxPool"(%11) {torch.onnx.auto_pad = "NOTSET", torch.onnx.kernel_shape = [2 : si64, 2 : si64], torch.onnx.pads = [0 : si64, 0 : si64, 0 : si64, 0 : si64], torch.onnx.strides = [2 : si64, 2 : si64]} : (!torch.vtensor<[1,8,28,28],f32>) -> !torch.vtensor<[1,8,14,14],f32> 
    %13 = torch.operator "onnx.Conv"(%12, %1) {torch.onnx.auto_pad = "SAME_UPPER", torch.onnx.dilations = [1 : si64, 1 : si64], torch.onnx.group = 1 : si64, torch.onnx.kernel_shape = [5 : si64, 5 : si64], torch.onnx.strides = [1 : si64, 1 : si64]} : (!torch.vtensor<[1,8,14,14],f32>, !torch.vtensor<[16,8,5,5],f32>) -> !torch.vtensor<[1,16,14,14],f32> 
    %14 = torch.operator "onnx.Add"(%13, %4) : (!torch.vtensor<[1,16,14,14],f32>, !torch.vtensor<[16,1,1],f32>) -> !torch.vtensor<[1,16,14,14],f32> 
    %15 = torch.operator "onnx.Relu"(%14) : (!torch.vtensor<[1,16,14,14],f32>) -> !torch.vtensor<[1,16,14,14],f32> 
    %16 = torch.operator "onnx.MaxPool"(%15) {torch.onnx.auto_pad = "NOTSET", torch.onnx.kernel_shape = [3 : si64, 3 : si64], torch.onnx.pads = [0 : si64, 0 : si64, 0 : si64, 0 : si64], torch.onnx.strides = [3 : si64, 3 : si64]} : (!torch.vtensor<[1,16,14,14],f32>) -> !torch.vtensor<[1,16,4,4],f32> 
    %17 = torch.operator "onnx.Reshape"(%16, %5) : (!torch.vtensor<[1,16,4,4],f32>, !torch.vtensor<[2],si64>) -> !torch.vtensor<[1,256],f32> 
    %18 = torch.operator "onnx.MatMul"(%17, %8) : (!torch.vtensor<[1,256],f32>, !torch.vtensor<[256,10],f32>) -> !torch.vtensor<[1,10],f32> 
    %19 = torch.operator "onnx.Add"(%18, %7) : (!torch.vtensor<[1,10],f32>, !torch.vtensor<[1,10],f32>) -> !torch.vtensor<[1,10],f32> 
    return %19 : !torch.vtensor<[1,10],f32>
  }
}
pdhirajkumarprasad commented 3 days ago

We still have issue with conv and can be reproduce with below ir

model.mlir 
module {
  func.func @main_graph(%arg0: !torch.vtensor<[1,128],si64>, %arg1: !torch.vtensor<[1,128],f32>, %arg3: !torch.vtensor<[?,768,128],f32>, %arg4: !torch.vtensor<[768,1,9],f32>) -> !torch.vtensor<[?,768,128],f32>   attributes {torch.onnx_meta.ir_version = 8 : si64, torch.onnx_meta.opset_version = 17 : si64, torch.onnx_meta.producer_name = "pytorch", torch.onnx_meta.producer_version = "2.1.0"} {
    %323 = torch.operator "onnx.Conv"(%arg3, %arg4) {torch.onnx.dilations = [1 : si64], torch.onnx.group = 768 : si64, torch.onnx.kernel_shape = [9 : si64], torch.onnx.pads = [4 : si64, 4 : si64], torch.onnx.strides = [1 : si64]} : (!torch.vtensor<[?,768,128],f32>, !torch.vtensor<[768,1,9],f32>) -> !torch.vtensor<[?,768,128],f32> 
    return %323 : !torch.vtensor<[?,768,128],f32> 
  }
}
vivekkhandelwal1 commented 2 days ago

Hi @pdhirajkumarprasad, can you please tell me how many models are impacted through this issue? And the list of the failing ones too? The issue is that the Torch-MLIR does not have the support for 2d group convolution, and hence resulting in this failure.

zjgarvey commented 2 days ago

This is specifically a depthwise conv op. There isn't a linalg op for grouped 1-d conv, but there are depthwise 1-d conv ops in linalg dialect.

pdhirajkumarprasad commented 1 day ago

Hi @pdhirajkumarprasad, can you please tell me how many models are impacted through this issue? And the list of the failing ones too? The issue is that the Torch-MLIR does not have the support for 2d group convolution, and hence resulting in this failure.

we have 52 models failing due to this