diff --git a/PdfSharp.sln b/PdfSharp.sln index b2b46225..cac0551a 100644 --- a/PdfSharp.sln +++ b/PdfSharp.sln @@ -318,324 +318,966 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PdfSharp.OpenType.Test", "s EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "docs-public", "docs\docs-public.csproj", "{B75C5BBF-4110-E576-C755-66CBF94A4CD9}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReadC2paInfo,PDFsharp", "src\samples\src\PDFsharp\src\ReadC2paInfo\ReadC2paInfo,PDFsharp.csproj", "{4A6FAC63-5329-44D4-A215-FA5CD30244FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|x64.ActiveCfg = Debug|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|x64.Build.0 = Debug|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|x86.ActiveCfg = Debug|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Debug|x86.Build.0 = Debug|Any CPU {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|Any CPU.ActiveCfg = Release|Any CPU {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|Any CPU.Build.0 = Release|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|x64.ActiveCfg = Release|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|x64.Build.0 = Release|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|x86.ActiveCfg = Release|Any CPU + {0B1C5283-63AC-4B2C-B0B2-D2FFD4BB3BD2}.Release|x86.Build.0 = Release|Any CPU {9891081B-017E-4974-8BF9-FA775406841E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9891081B-017E-4974-8BF9-FA775406841E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Debug|x64.ActiveCfg = Debug|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Debug|x64.Build.0 = Debug|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Debug|x86.ActiveCfg = Debug|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Debug|x86.Build.0 = Debug|Any CPU {9891081B-017E-4974-8BF9-FA775406841E}.Release|Any CPU.ActiveCfg = Release|Any CPU {9891081B-017E-4974-8BF9-FA775406841E}.Release|Any CPU.Build.0 = Release|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Release|x64.ActiveCfg = Release|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Release|x64.Build.0 = Release|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Release|x86.ActiveCfg = Release|Any CPU + {9891081B-017E-4974-8BF9-FA775406841E}.Release|x86.Build.0 = Release|Any CPU {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|x64.Build.0 = Debug|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Debug|x86.Build.0 = Debug|Any CPU {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|Any CPU.Build.0 = Release|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|x64.ActiveCfg = Release|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|x64.Build.0 = Release|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|x86.ActiveCfg = Release|Any CPU + {CA022FCC-7A23-4759-8789-9FC86C805557}.Release|x86.Build.0 = Release|Any CPU {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|x64.ActiveCfg = Debug|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|x64.Build.0 = Debug|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|x86.ActiveCfg = Debug|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Debug|x86.Build.0 = Debug|Any CPU {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|Any CPU.ActiveCfg = Release|Any CPU {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|Any CPU.Build.0 = Release|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|x64.ActiveCfg = Release|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|x64.Build.0 = Release|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|x86.ActiveCfg = Release|Any CPU + {92E59C39-1633-4763-B9A3-3E6FA2593477}.Release|x86.Build.0 = Release|Any CPU {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|x64.ActiveCfg = Debug|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|x64.Build.0 = Debug|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|x86.ActiveCfg = Debug|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Debug|x86.Build.0 = Debug|Any CPU {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|Any CPU.ActiveCfg = Release|Any CPU {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|Any CPU.Build.0 = Release|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|x64.ActiveCfg = Release|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|x64.Build.0 = Release|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|x86.ActiveCfg = Release|Any CPU + {9920A6C0-509E-4319-A35F-E0DB6866DAFF}.Release|x86.Build.0 = Release|Any CPU {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|x64.ActiveCfg = Debug|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|x64.Build.0 = Debug|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|x86.ActiveCfg = Debug|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Debug|x86.Build.0 = Debug|Any CPU {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|Any CPU.Build.0 = Release|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|x64.ActiveCfg = Release|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|x64.Build.0 = Release|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|x86.ActiveCfg = Release|Any CPU + {8854C41C-8F3D-406E-A565-3B623599BFF2}.Release|x86.Build.0 = Release|Any CPU {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|x64.ActiveCfg = Debug|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|x64.Build.0 = Debug|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|x86.ActiveCfg = Debug|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Debug|x86.Build.0 = Debug|Any CPU {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|Any CPU.ActiveCfg = Release|Any CPU {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|Any CPU.Build.0 = Release|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|x64.ActiveCfg = Release|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|x64.Build.0 = Release|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|x86.ActiveCfg = Release|Any CPU + {5448826B-C121-4A3D-B632-8F9E6519F787}.Release|x86.Build.0 = Release|Any CPU {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|x64.ActiveCfg = Debug|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|x64.Build.0 = Debug|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|x86.ActiveCfg = Debug|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Debug|x86.Build.0 = Debug|Any CPU {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|Any CPU.ActiveCfg = Release|Any CPU {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|Any CPU.Build.0 = Release|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|x64.ActiveCfg = Release|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|x64.Build.0 = Release|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|x86.ActiveCfg = Release|Any CPU + {F5258632-D60B-4BD4-AAF9-BEEC6CCD471F}.Release|x86.Build.0 = Release|Any CPU {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|x64.Build.0 = Debug|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Debug|x86.Build.0 = Debug|Any CPU {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|Any CPU.Build.0 = Release|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|x64.ActiveCfg = Release|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|x64.Build.0 = Release|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|x86.ActiveCfg = Release|Any CPU + {B0BEB589-A3A7-4412-B045-09621FB1DE25}.Release|x86.Build.0 = Release|Any CPU {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|x64.Build.0 = Debug|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Debug|x86.Build.0 = Debug|Any CPU {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|Any CPU.Build.0 = Release|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|x64.ActiveCfg = Release|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|x64.Build.0 = Release|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|x86.ActiveCfg = Release|Any CPU + {E4D95A70-171A-4027-BFCE-AB2B1907C6C1}.Release|x86.Build.0 = Release|Any CPU {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|x64.ActiveCfg = Debug|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|x64.Build.0 = Debug|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|x86.ActiveCfg = Debug|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Debug|x86.Build.0 = Debug|Any CPU {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|Any CPU.ActiveCfg = Release|Any CPU {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|Any CPU.Build.0 = Release|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|x64.ActiveCfg = Release|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|x64.Build.0 = Release|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|x86.ActiveCfg = Release|Any CPU + {034B233F-0745-476A-A3DB-8DDF8FA0EF9C}.Release|x86.Build.0 = Release|Any CPU {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|x64.ActiveCfg = Debug|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|x64.Build.0 = Debug|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|x86.ActiveCfg = Debug|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Debug|x86.Build.0 = Debug|Any CPU {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|Any CPU.ActiveCfg = Release|Any CPU {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|Any CPU.Build.0 = Release|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|x64.ActiveCfg = Release|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|x64.Build.0 = Release|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|x86.ActiveCfg = Release|Any CPU + {05E1F63A-EC20-4280-86A2-7971691DA964}.Release|x86.Build.0 = Release|Any CPU {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|x64.ActiveCfg = Debug|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|x64.Build.0 = Debug|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|x86.ActiveCfg = Debug|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Debug|x86.Build.0 = Debug|Any CPU {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|Any CPU.ActiveCfg = Release|Any CPU {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|Any CPU.Build.0 = Release|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|x64.ActiveCfg = Release|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|x64.Build.0 = Release|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|x86.ActiveCfg = Release|Any CPU + {E42F855D-9A4F-45BE-9950-F20A94169568}.Release|x86.Build.0 = Release|Any CPU {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|x64.Build.0 = Debug|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Debug|x86.Build.0 = Debug|Any CPU {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|Any CPU.Build.0 = Release|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|x64.ActiveCfg = Release|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|x64.Build.0 = Release|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|x86.ActiveCfg = Release|Any CPU + {5BB33F6F-0151-4D8F-8530-249A9C3B9B23}.Release|x86.Build.0 = Release|Any CPU {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|x64.Build.0 = Debug|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Debug|x86.Build.0 = Debug|Any CPU {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|Any CPU.Build.0 = Release|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|x64.ActiveCfg = Release|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|x64.Build.0 = Release|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|x86.ActiveCfg = Release|Any CPU + {CEE874A6-EBE0-4D8C-80AA-38AEBFE9C3F3}.Release|x86.Build.0 = Release|Any CPU {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|x64.ActiveCfg = Debug|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|x64.Build.0 = Debug|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|x86.ActiveCfg = Debug|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Debug|x86.Build.0 = Debug|Any CPU {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|Any CPU.ActiveCfg = Release|Any CPU {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|Any CPU.Build.0 = Release|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|x64.ActiveCfg = Release|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|x64.Build.0 = Release|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|x86.ActiveCfg = Release|Any CPU + {063311BF-3B6E-4550-9342-FEF6CFF80C54}.Release|x86.Build.0 = Release|Any CPU {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|x64.ActiveCfg = Debug|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|x64.Build.0 = Debug|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|x86.ActiveCfg = Debug|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Debug|x86.Build.0 = Debug|Any CPU {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|Any CPU.ActiveCfg = Release|Any CPU {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|Any CPU.Build.0 = Release|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|x64.ActiveCfg = Release|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|x64.Build.0 = Release|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|x86.ActiveCfg = Release|Any CPU + {24C998BB-C700-4047-97D5-1E9BC4A6CD06}.Release|x86.Build.0 = Release|Any CPU {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|x64.Build.0 = Debug|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Debug|x86.Build.0 = Debug|Any CPU {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|Any CPU.Build.0 = Release|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|x64.ActiveCfg = Release|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|x64.Build.0 = Release|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|x86.ActiveCfg = Release|Any CPU + {B0EE3DF4-34E1-4C69-836E-B8911192D3FE}.Release|x86.Build.0 = Release|Any CPU {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|x64.ActiveCfg = Debug|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|x64.Build.0 = Debug|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|x86.ActiveCfg = Debug|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Debug|x86.Build.0 = Debug|Any CPU {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|Any CPU.Build.0 = Release|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|x64.ActiveCfg = Release|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|x64.Build.0 = Release|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|x86.ActiveCfg = Release|Any CPU + {8F4002CD-E002-4C61-9E7A-0D78875C4767}.Release|x86.Build.0 = Release|Any CPU {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|x64.ActiveCfg = Debug|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|x64.Build.0 = Debug|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|x86.ActiveCfg = Debug|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Debug|x86.Build.0 = Debug|Any CPU {76959A2A-8113-430B-8272-DD37F17F9305}.Release|Any CPU.ActiveCfg = Release|Any CPU {76959A2A-8113-430B-8272-DD37F17F9305}.Release|Any CPU.Build.0 = Release|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Release|x64.ActiveCfg = Release|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Release|x64.Build.0 = Release|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Release|x86.ActiveCfg = Release|Any CPU + {76959A2A-8113-430B-8272-DD37F17F9305}.Release|x86.Build.0 = Release|Any CPU {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|x64.ActiveCfg = Debug|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|x64.Build.0 = Debug|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|x86.ActiveCfg = Debug|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Debug|x86.Build.0 = Debug|Any CPU {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|Any CPU.Build.0 = Release|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|x64.ActiveCfg = Release|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|x64.Build.0 = Release|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|x86.ActiveCfg = Release|Any CPU + {E19EF259-4C5F-4967-867C-EF3936B264C4}.Release|x86.Build.0 = Release|Any CPU {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|x64.Build.0 = Debug|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Debug|x86.Build.0 = Debug|Any CPU {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|Any CPU.ActiveCfg = Release|Any CPU {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|Any CPU.Build.0 = Release|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|x64.ActiveCfg = Release|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|x64.Build.0 = Release|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|x86.ActiveCfg = Release|Any CPU + {ECCE20D4-000F-4D15-87B5-0335C7B3163A}.Release|x86.Build.0 = Release|Any CPU {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|x64.Build.0 = Debug|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Debug|x86.Build.0 = Debug|Any CPU {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|Any CPU.Build.0 = Release|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|x64.ActiveCfg = Release|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|x64.Build.0 = Release|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|x86.ActiveCfg = Release|Any CPU + {2E3778BB-E153-47C6-AD2C-E69F0B242578}.Release|x86.Build.0 = Release|Any CPU {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|x64.ActiveCfg = Debug|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|x64.Build.0 = Debug|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|x86.ActiveCfg = Debug|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Debug|x86.Build.0 = Debug|Any CPU {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|Any CPU.ActiveCfg = Release|Any CPU {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|Any CPU.Build.0 = Release|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|x64.ActiveCfg = Release|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|x64.Build.0 = Release|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|x86.ActiveCfg = Release|Any CPU + {1A8CCCAA-4F2B-4D19-AB33-4696345DD200}.Release|x86.Build.0 = Release|Any CPU {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|x64.ActiveCfg = Debug|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|x64.Build.0 = Debug|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|x86.ActiveCfg = Debug|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Debug|x86.Build.0 = Debug|Any CPU {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|Any CPU.ActiveCfg = Release|Any CPU {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|Any CPU.Build.0 = Release|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|x64.ActiveCfg = Release|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|x64.Build.0 = Release|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|x86.ActiveCfg = Release|Any CPU + {A774F1FD-6E4E-41E3-A288-C0EBF54B9CF2}.Release|x86.Build.0 = Release|Any CPU {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|x64.ActiveCfg = Debug|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|x64.Build.0 = Debug|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|x86.ActiveCfg = Debug|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Debug|x86.Build.0 = Debug|Any CPU {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|Any CPU.ActiveCfg = Release|Any CPU {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|Any CPU.Build.0 = Release|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|x64.ActiveCfg = Release|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|x64.Build.0 = Release|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|x86.ActiveCfg = Release|Any CPU + {7DF6A8E0-AF4B-4A05-98CF-472D8252F95C}.Release|x86.Build.0 = Release|Any CPU {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|x64.Build.0 = Debug|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Debug|x86.Build.0 = Debug|Any CPU {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|Any CPU.Build.0 = Release|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|x64.ActiveCfg = Release|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|x64.Build.0 = Release|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|x86.ActiveCfg = Release|Any CPU + {9C72352F-3DB2-4ACE-A961-5466FEDB88A8}.Release|x86.Build.0 = Release|Any CPU {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|x64.Build.0 = Debug|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Debug|x86.Build.0 = Debug|Any CPU {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|Any CPU.ActiveCfg = Release|Any CPU {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|Any CPU.Build.0 = Release|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|x64.ActiveCfg = Release|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|x64.Build.0 = Release|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|x86.ActiveCfg = Release|Any CPU + {CAC67B89-6F71-4E85-A0D9-18C7655D0F24}.Release|x86.Build.0 = Release|Any CPU {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|x64.ActiveCfg = Debug|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|x64.Build.0 = Debug|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|x86.ActiveCfg = Debug|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Debug|x86.Build.0 = Debug|Any CPU {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|Any CPU.Build.0 = Release|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|x64.ActiveCfg = Release|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|x64.Build.0 = Release|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|x86.ActiveCfg = Release|Any CPU + {453E50A2-AABE-4FC8-B112-DC58B482AE1E}.Release|x86.Build.0 = Release|Any CPU {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|x64.ActiveCfg = Debug|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|x64.Build.0 = Debug|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|x86.ActiveCfg = Debug|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Debug|x86.Build.0 = Debug|Any CPU {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|Any CPU.ActiveCfg = Release|Any CPU {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|Any CPU.Build.0 = Release|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|x64.ActiveCfg = Release|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|x64.Build.0 = Release|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|x86.ActiveCfg = Release|Any CPU + {12368073-65E0-44E8-B081-A91EE0B45D99}.Release|x86.Build.0 = Release|Any CPU {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|x64.ActiveCfg = Debug|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|x64.Build.0 = Debug|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|x86.ActiveCfg = Debug|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Debug|x86.Build.0 = Debug|Any CPU {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|Any CPU.ActiveCfg = Release|Any CPU {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|Any CPU.Build.0 = Release|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|x64.ActiveCfg = Release|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|x64.Build.0 = Release|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|x86.ActiveCfg = Release|Any CPU + {35BBDAE9-8F1D-4A5F-AC79-63B29AC47B96}.Release|x86.Build.0 = Release|Any CPU {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|x64.ActiveCfg = Debug|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|x64.Build.0 = Debug|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|x86.ActiveCfg = Debug|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Debug|x86.Build.0 = Debug|Any CPU {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|Any CPU.ActiveCfg = Release|Any CPU {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|Any CPU.Build.0 = Release|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|x64.ActiveCfg = Release|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|x64.Build.0 = Release|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|x86.ActiveCfg = Release|Any CPU + {E8BF997F-41DE-4B3B-ADE9-BE707F5EED74}.Release|x86.Build.0 = Release|Any CPU {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|x64.ActiveCfg = Debug|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|x64.Build.0 = Debug|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|x86.ActiveCfg = Debug|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Debug|x86.Build.0 = Debug|Any CPU {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|Any CPU.ActiveCfg = Release|Any CPU {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|Any CPU.Build.0 = Release|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|x64.ActiveCfg = Release|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|x64.Build.0 = Release|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|x86.ActiveCfg = Release|Any CPU + {EF9642AB-5FE2-47D6-8AD4-5C4C2AA43E63}.Release|x86.Build.0 = Release|Any CPU {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|x64.Build.0 = Debug|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Debug|x86.Build.0 = Debug|Any CPU {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|Any CPU.Build.0 = Release|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|x64.ActiveCfg = Release|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|x64.Build.0 = Release|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|x86.ActiveCfg = Release|Any CPU + {B884855F-CE2B-4955-A3FD-581006313B8D}.Release|x86.Build.0 = Release|Any CPU {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|x64.Build.0 = Debug|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Debug|x86.Build.0 = Debug|Any CPU {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|Any CPU.Build.0 = Release|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|x64.ActiveCfg = Release|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|x64.Build.0 = Release|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|x86.ActiveCfg = Release|Any CPU + {2D422E30-B119-440A-93B2-98F85BDC7371}.Release|x86.Build.0 = Release|Any CPU {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|x64.ActiveCfg = Debug|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|x64.Build.0 = Debug|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Debug|x86.Build.0 = Debug|Any CPU {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|Any CPU.Build.0 = Release|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|x64.ActiveCfg = Release|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|x64.Build.0 = Release|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|x86.ActiveCfg = Release|Any CPU + {8C2CE2C8-8F3F-4A94-B83E-FAA89E000B10}.Release|x86.Build.0 = Release|Any CPU {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|x64.ActiveCfg = Debug|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|x64.Build.0 = Debug|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|x86.ActiveCfg = Debug|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Debug|x86.Build.0 = Debug|Any CPU {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|Any CPU.ActiveCfg = Release|Any CPU {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|Any CPU.Build.0 = Release|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|x64.ActiveCfg = Release|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|x64.Build.0 = Release|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|x86.ActiveCfg = Release|Any CPU + {ECB8DEC8-B84E-4912-9BDA-49F1255ABD1F}.Release|x86.Build.0 = Release|Any CPU {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|x64.ActiveCfg = Debug|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|x64.Build.0 = Debug|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|x86.ActiveCfg = Debug|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Debug|x86.Build.0 = Debug|Any CPU {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|Any CPU.ActiveCfg = Release|Any CPU {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|Any CPU.Build.0 = Release|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|x64.ActiveCfg = Release|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|x64.Build.0 = Release|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|x86.ActiveCfg = Release|Any CPU + {3EFAC271-74B1-495E-BAAB-AD32BAE7C32F}.Release|x86.Build.0 = Release|Any CPU {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|x64.Build.0 = Debug|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Debug|x86.Build.0 = Debug|Any CPU {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|Any CPU.Build.0 = Release|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|x64.ActiveCfg = Release|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|x64.Build.0 = Release|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|x86.ActiveCfg = Release|Any CPU + {6B0693F0-A1C2-4D40-B76D-AB1BE47CAC30}.Release|x86.Build.0 = Release|Any CPU {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|x64.ActiveCfg = Debug|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|x64.Build.0 = Debug|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Debug|x86.Build.0 = Debug|Any CPU {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|Any CPU.ActiveCfg = Release|Any CPU {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|x64.ActiveCfg = Release|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|x64.Build.0 = Release|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|x86.ActiveCfg = Release|Any CPU + {BCF6255A-FAF1-4465-B315-D1223F010DEB}.Release|x86.Build.0 = Release|Any CPU {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|x64.Build.0 = Debug|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Debug|x86.Build.0 = Debug|Any CPU {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|Any CPU.Build.0 = Release|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|x64.ActiveCfg = Release|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|x64.Build.0 = Release|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|x86.ActiveCfg = Release|Any CPU + {D3F1FC74-9C81-48F2-912F-7EC1B8FF812F}.Release|x86.Build.0 = Release|Any CPU {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|x64.ActiveCfg = Debug|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|x64.Build.0 = Debug|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|x86.ActiveCfg = Debug|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Debug|x86.Build.0 = Debug|Any CPU {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|Any CPU.Build.0 = Release|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|x64.ActiveCfg = Release|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|x64.Build.0 = Release|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|x86.ActiveCfg = Release|Any CPU + {20DEA7D4-1F92-4DEB-9841-3CF9FC6CFC5F}.Release|x86.Build.0 = Release|Any CPU {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|x64.ActiveCfg = Debug|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|x64.Build.0 = Debug|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|x86.ActiveCfg = Debug|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Debug|x86.Build.0 = Debug|Any CPU {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|Any CPU.ActiveCfg = Release|Any CPU {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|Any CPU.Build.0 = Release|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|x64.ActiveCfg = Release|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|x64.Build.0 = Release|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|x86.ActiveCfg = Release|Any CPU + {A98A1979-883D-463F-9461-FAFFCA97B48A}.Release|x86.Build.0 = Release|Any CPU {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|x64.ActiveCfg = Debug|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|x64.Build.0 = Debug|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|x86.ActiveCfg = Debug|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Debug|x86.Build.0 = Debug|Any CPU {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|Any CPU.ActiveCfg = Release|Any CPU {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|Any CPU.Build.0 = Release|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|x64.ActiveCfg = Release|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|x64.Build.0 = Release|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|x86.ActiveCfg = Release|Any CPU + {38E7DA8B-3016-49FA-8FDA-FE4CE347E40E}.Release|x86.Build.0 = Release|Any CPU {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|x64.Build.0 = Debug|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Debug|x86.Build.0 = Debug|Any CPU {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|Any CPU.Build.0 = Release|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|x64.ActiveCfg = Release|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|x64.Build.0 = Release|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|x86.ActiveCfg = Release|Any CPU + {B980F83A-592E-4CCB-AC71-7787D1B6A2F8}.Release|x86.Build.0 = Release|Any CPU {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|x64.ActiveCfg = Debug|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|x64.Build.0 = Debug|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Debug|x86.Build.0 = Debug|Any CPU {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|Any CPU.ActiveCfg = Release|Any CPU {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|Any CPU.Build.0 = Release|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|x64.ActiveCfg = Release|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|x64.Build.0 = Release|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|x86.ActiveCfg = Release|Any CPU + {1C25A0CD-7A57-434F-8B0C-06F4B2D25CBC}.Release|x86.Build.0 = Release|Any CPU {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|x64.Build.0 = Debug|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Debug|x86.Build.0 = Debug|Any CPU {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|Any CPU.ActiveCfg = Release|Any CPU {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|Any CPU.Build.0 = Release|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|x64.ActiveCfg = Release|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|x64.Build.0 = Release|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|x86.ActiveCfg = Release|Any CPU + {BEC08304-9DA2-44FC-BBC3-F432A48CE83C}.Release|x86.Build.0 = Release|Any CPU {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|x64.ActiveCfg = Debug|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|x64.Build.0 = Debug|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|x86.ActiveCfg = Debug|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Debug|x86.Build.0 = Debug|Any CPU {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|Any CPU.ActiveCfg = Release|Any CPU {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|Any CPU.Build.0 = Release|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|x64.ActiveCfg = Release|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|x64.Build.0 = Release|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|x86.ActiveCfg = Release|Any CPU + {C550C547-CC8A-471A-925F-DF1CD3FA6F50}.Release|x86.Build.0 = Release|Any CPU {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|x64.Build.0 = Debug|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Debug|x86.Build.0 = Debug|Any CPU {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|Any CPU.Build.0 = Release|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|x64.ActiveCfg = Release|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|x64.Build.0 = Release|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|x86.ActiveCfg = Release|Any CPU + {4EEE7867-461B-49EC-9450-3973B932A5C8}.Release|x86.Build.0 = Release|Any CPU {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|Any CPU.Build.0 = Debug|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|x64.ActiveCfg = Debug|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|x64.Build.0 = Debug|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|x86.ActiveCfg = Debug|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Debug|x86.Build.0 = Debug|Any CPU {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|Any CPU.ActiveCfg = Release|Any CPU {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|Any CPU.Build.0 = Release|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|x64.ActiveCfg = Release|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|x64.Build.0 = Release|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|x86.ActiveCfg = Release|Any CPU + {823A4ABD-43F0-4BE9-9DD6-722A84497432}.Release|x86.Build.0 = Release|Any CPU {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|x64.ActiveCfg = Debug|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|x64.Build.0 = Debug|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|x86.ActiveCfg = Debug|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Debug|x86.Build.0 = Debug|Any CPU {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|Any CPU.ActiveCfg = Release|Any CPU {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|Any CPU.Build.0 = Release|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|x64.ActiveCfg = Release|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|x64.Build.0 = Release|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|x86.ActiveCfg = Release|Any CPU + {9AFE8A79-333C-414C-A12B-A2201EC211E8}.Release|x86.Build.0 = Release|Any CPU {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|x64.ActiveCfg = Debug|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|x64.Build.0 = Debug|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Debug|x86.Build.0 = Debug|Any CPU {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|Any CPU.Build.0 = Release|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|x64.ActiveCfg = Release|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|x64.Build.0 = Release|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|x86.ActiveCfg = Release|Any CPU + {BA04FBE0-6B97-4D21-9561-91F12906A5F9}.Release|x86.Build.0 = Release|Any CPU {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|x64.ActiveCfg = Debug|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|x64.Build.0 = Debug|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|x86.ActiveCfg = Debug|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Debug|x86.Build.0 = Debug|Any CPU {380C02B5-94DC-491C-9458-6F5287698C77}.Release|Any CPU.ActiveCfg = Release|Any CPU {380C02B5-94DC-491C-9458-6F5287698C77}.Release|Any CPU.Build.0 = Release|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Release|x64.ActiveCfg = Release|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Release|x64.Build.0 = Release|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Release|x86.ActiveCfg = Release|Any CPU + {380C02B5-94DC-491C-9458-6F5287698C77}.Release|x86.Build.0 = Release|Any CPU {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|x64.ActiveCfg = Debug|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|x64.Build.0 = Debug|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|x86.ActiveCfg = Debug|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Debug|x86.Build.0 = Debug|Any CPU {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|Any CPU.Build.0 = Release|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|x64.ActiveCfg = Release|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|x64.Build.0 = Release|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|x86.ActiveCfg = Release|Any CPU + {D0CD20C3-C06B-436E-8C88-E5A608C74AB2}.Release|x86.Build.0 = Release|Any CPU {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|x64.ActiveCfg = Debug|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|x64.Build.0 = Debug|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Debug|x86.Build.0 = Debug|Any CPU {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|Any CPU.Build.0 = Release|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|x64.ActiveCfg = Release|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|x64.Build.0 = Release|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|x86.ActiveCfg = Release|Any CPU + {32402A03-34B2-4DA8-8A55-A4E0FCA4C3B2}.Release|x86.Build.0 = Release|Any CPU {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|x64.Build.0 = Debug|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Debug|x86.Build.0 = Debug|Any CPU {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|Any CPU.ActiveCfg = Release|Any CPU {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|Any CPU.Build.0 = Release|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|x64.ActiveCfg = Release|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|x64.Build.0 = Release|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|x86.ActiveCfg = Release|Any CPU + {AE89ED51-5A8A-4663-ABBE-2D399C8528F4}.Release|x86.Build.0 = Release|Any CPU {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|x64.ActiveCfg = Debug|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|x64.Build.0 = Debug|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|x86.ActiveCfg = Debug|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Debug|x86.Build.0 = Debug|Any CPU {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|Any CPU.ActiveCfg = Release|Any CPU {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|Any CPU.Build.0 = Release|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|x64.ActiveCfg = Release|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|x64.Build.0 = Release|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|x86.ActiveCfg = Release|Any CPU + {6B5BAD8B-F029-452D-A721-0CF5F95DA1DC}.Release|x86.Build.0 = Release|Any CPU {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|x64.Build.0 = Debug|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Debug|x86.Build.0 = Debug|Any CPU {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|Any CPU.ActiveCfg = Release|Any CPU {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|Any CPU.Build.0 = Release|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|x64.ActiveCfg = Release|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|x64.Build.0 = Release|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|x86.ActiveCfg = Release|Any CPU + {6E63D5DF-CADA-4AD5-8824-F1FB97185A49}.Release|x86.Build.0 = Release|Any CPU {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|x64.ActiveCfg = Debug|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|x64.Build.0 = Debug|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|x86.ActiveCfg = Debug|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Debug|x86.Build.0 = Debug|Any CPU {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|Any CPU.ActiveCfg = Release|Any CPU {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|Any CPU.Build.0 = Release|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|x64.ActiveCfg = Release|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|x64.Build.0 = Release|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|x86.ActiveCfg = Release|Any CPU + {284F0281-F283-4EC3-BD60-DD0CD5A5442F}.Release|x86.Build.0 = Release|Any CPU {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|x64.Build.0 = Debug|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Debug|x86.Build.0 = Debug|Any CPU {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|Any CPU.Build.0 = Release|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|x64.ActiveCfg = Release|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|x64.Build.0 = Release|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|x86.ActiveCfg = Release|Any CPU + {9EC27C83-FCD6-44B8-9BC6-9F270DD58C8E}.Release|x86.Build.0 = Release|Any CPU {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|x64.Build.0 = Debug|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Debug|x86.Build.0 = Debug|Any CPU {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|Any CPU.Build.0 = Release|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|x64.ActiveCfg = Release|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|x64.Build.0 = Release|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|x86.ActiveCfg = Release|Any CPU + {2D32A2B9-CE4E-4F0D-9A76-1578FC3F4776}.Release|x86.Build.0 = Release|Any CPU {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|x64.ActiveCfg = Debug|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|x64.Build.0 = Debug|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|x86.ActiveCfg = Debug|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Debug|x86.Build.0 = Debug|Any CPU {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|Any CPU.ActiveCfg = Release|Any CPU {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|Any CPU.Build.0 = Release|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|x64.ActiveCfg = Release|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|x64.Build.0 = Release|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|x86.ActiveCfg = Release|Any CPU + {D17FA884-98B9-41E2-AB27-2603F79000F5}.Release|x86.Build.0 = Release|Any CPU {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|x64.ActiveCfg = Debug|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|x64.Build.0 = Debug|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|x86.ActiveCfg = Debug|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Debug|x86.Build.0 = Debug|Any CPU {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|Any CPU.ActiveCfg = Release|Any CPU {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|Any CPU.Build.0 = Release|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|x64.ActiveCfg = Release|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|x64.Build.0 = Release|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|x86.ActiveCfg = Release|Any CPU + {C7CCB288-8372-41AD-9F65-6224CE0D6358}.Release|x86.Build.0 = Release|Any CPU {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|x64.Build.0 = Debug|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Debug|x86.Build.0 = Debug|Any CPU {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|Any CPU.Build.0 = Release|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|x64.ActiveCfg = Release|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|x64.Build.0 = Release|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|x86.ActiveCfg = Release|Any CPU + {1F9EE0B3-4BA1-4CE4-9301-1735732B61B6}.Release|x86.Build.0 = Release|Any CPU {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|x64.ActiveCfg = Debug|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|x64.Build.0 = Debug|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|x86.ActiveCfg = Debug|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Debug|x86.Build.0 = Debug|Any CPU {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|Any CPU.ActiveCfg = Release|Any CPU {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|Any CPU.Build.0 = Release|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|x64.ActiveCfg = Release|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|x64.Build.0 = Release|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|x86.ActiveCfg = Release|Any CPU + {60D307AC-D7D6-4AA4-BF9F-DDC6809CBCC7}.Release|x86.Build.0 = Release|Any CPU {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|x64.ActiveCfg = Debug|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|x64.Build.0 = Debug|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Debug|x86.Build.0 = Debug|Any CPU {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|Any CPU.Build.0 = Release|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|x64.ActiveCfg = Release|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|x64.Build.0 = Release|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|x86.ActiveCfg = Release|Any CPU + {8C20115B-AA17-41A7-837D-F5CFD286DFC9}.Release|x86.Build.0 = Release|Any CPU {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|x64.ActiveCfg = Debug|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|x64.Build.0 = Debug|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Debug|x86.Build.0 = Debug|Any CPU {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|Any CPU.Build.0 = Release|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|x64.ActiveCfg = Release|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|x64.Build.0 = Release|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|x86.ActiveCfg = Release|Any CPU + {E6E3A838-95C6-462D-84E4-FAFF69DA95C0}.Release|x86.Build.0 = Release|Any CPU {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|x64.ActiveCfg = Debug|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|x64.Build.0 = Debug|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|x86.ActiveCfg = Debug|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Debug|x86.Build.0 = Debug|Any CPU {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|Any CPU.ActiveCfg = Release|Any CPU {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|Any CPU.Build.0 = Release|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|x64.ActiveCfg = Release|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|x64.Build.0 = Release|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|x86.ActiveCfg = Release|Any CPU + {4CBBAD35-0D01-4BDD-8BDF-B6022497938E}.Release|x86.Build.0 = Release|Any CPU {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|x64.ActiveCfg = Debug|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|x64.Build.0 = Debug|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|x86.ActiveCfg = Debug|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Debug|x86.Build.0 = Debug|Any CPU {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|Any CPU.ActiveCfg = Release|Any CPU {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|Any CPU.Build.0 = Release|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|x64.ActiveCfg = Release|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|x64.Build.0 = Release|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|x86.ActiveCfg = Release|Any CPU + {F4AB506C-AD13-4383-9AF9-48D74085ECC1}.Release|x86.Build.0 = Release|Any CPU {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|x64.ActiveCfg = Debug|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|x64.Build.0 = Debug|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|x86.ActiveCfg = Debug|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Debug|x86.Build.0 = Debug|Any CPU {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|Any CPU.ActiveCfg = Release|Any CPU {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|Any CPU.Build.0 = Release|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|x64.ActiveCfg = Release|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|x64.Build.0 = Release|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|x86.ActiveCfg = Release|Any CPU + {769ED050-15AF-4EB5-A89F-D7123EE5AA95}.Release|x86.Build.0 = Release|Any CPU {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|x64.ActiveCfg = Debug|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|x64.Build.0 = Debug|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Debug|x86.Build.0 = Debug|Any CPU {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|Any CPU.ActiveCfg = Release|Any CPU {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|Any CPU.Build.0 = Release|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|x64.ActiveCfg = Release|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|x64.Build.0 = Release|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|x86.ActiveCfg = Release|Any CPU + {2D10539B-9BEC-4D75-980B-B1D4FDFEAB8D}.Release|x86.Build.0 = Release|Any CPU {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|x64.ActiveCfg = Debug|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|x64.Build.0 = Debug|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|x86.ActiveCfg = Debug|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Debug|x86.Build.0 = Debug|Any CPU {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|Any CPU.ActiveCfg = Release|Any CPU {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|Any CPU.Build.0 = Release|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|x64.ActiveCfg = Release|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|x64.Build.0 = Release|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|x86.ActiveCfg = Release|Any CPU + {7680C9FD-3FC5-F4CE-1EE4-5E2DB977FAAD}.Release|x86.Build.0 = Release|Any CPU {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|x64.ActiveCfg = Debug|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|x64.Build.0 = Debug|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|x86.ActiveCfg = Debug|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Debug|x86.Build.0 = Debug|Any CPU {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|Any CPU.ActiveCfg = Release|Any CPU {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|Any CPU.Build.0 = Release|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|x64.ActiveCfg = Release|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|x64.Build.0 = Release|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|x86.ActiveCfg = Release|Any CPU + {59171DE5-B6A9-CE9A-7CCA-976878FDAEBD}.Release|x86.Build.0 = Release|Any CPU {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|x64.ActiveCfg = Debug|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|x64.Build.0 = Debug|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|x86.ActiveCfg = Debug|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Debug|x86.Build.0 = Debug|Any CPU {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|Any CPU.ActiveCfg = Release|Any CPU {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|Any CPU.Build.0 = Release|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|x64.ActiveCfg = Release|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|x64.Build.0 = Release|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|x86.ActiveCfg = Release|Any CPU + {22EFBF71-31C3-ACEE-ACDB-F2D9C5EAF958}.Release|x86.Build.0 = Release|Any CPU {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|x64.Build.0 = Debug|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Debug|x86.Build.0 = Debug|Any CPU {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|Any CPU.Build.0 = Release|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|x64.ActiveCfg = Release|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|x64.Build.0 = Release|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|x86.ActiveCfg = Release|Any CPU + {08CB46DA-52D2-AB40-1E42-A8FC799565F8}.Release|x86.Build.0 = Release|Any CPU {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|x64.Build.0 = Debug|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Debug|x86.Build.0 = Debug|Any CPU {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|Any CPU.Build.0 = Release|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|x64.ActiveCfg = Release|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|x64.Build.0 = Release|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|x86.ActiveCfg = Release|Any CPU + {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D}.Release|x86.Build.0 = Release|Any CPU {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|x64.Build.0 = Debug|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Debug|x86.Build.0 = Debug|Any CPU {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|Any CPU.Build.0 = Release|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|x64.ActiveCfg = Release|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|x64.Build.0 = Release|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|x86.ActiveCfg = Release|Any CPU + {A7A57937-E309-9E58-A3B4-6B268E6933E7}.Release|x86.Build.0 = Release|Any CPU {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|x64.ActiveCfg = Debug|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|x64.Build.0 = Debug|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|x86.ActiveCfg = Debug|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Debug|x86.Build.0 = Debug|Any CPU {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|Any CPU.ActiveCfg = Release|Any CPU {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|Any CPU.Build.0 = Release|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|x64.ActiveCfg = Release|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|x64.Build.0 = Release|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|x86.ActiveCfg = Release|Any CPU + {B75C5BBF-4110-E576-C755-66CBF94A4CD9}.Release|x86.Build.0 = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|x64.Build.0 = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Debug|x86.Build.0 = Debug|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|Any CPU.Build.0 = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|x64.ActiveCfg = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|x64.Build.0 = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|x86.ActiveCfg = Release|Any CPU + {4A6FAC63-5329-44D4-A215-FA5CD30244FA}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -751,6 +1393,7 @@ Global {2F7D4DC3-BD6A-F9B0-D972-02784FEF887D} = {A1AE894D-9061-44F0-8268-328AC41F403A} {A7A57937-E309-9E58-A3B4-6B268E6933E7} = {A1AE894D-9061-44F0-8268-328AC41F403A} {B75C5BBF-4110-E576-C755-66CBF94A4CD9} = {76BA9372-65AE-479C-AEF7-D50E6B486CEF} + {4A6FAC63-5329-44D4-A215-FA5CD30244FA} = {62D00D8A-4171-4103-A5A4-A49212E0F7B3} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {D5FF5562-3C79-434B-B951-B84542D01625} diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index dcb63a2f..2333e7ae 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -40,5 +40,7 @@ + + \ No newline at end of file diff --git a/src/foundation/src/PDFsharp/src/PdfSharp-gdi/PdfSharp-gdi.csproj b/src/foundation/src/PDFsharp/src/PdfSharp-gdi/PdfSharp-gdi.csproj index f35d5caa..2ee59ab7 100644 --- a/src/foundation/src/PDFsharp/src/PdfSharp-gdi/PdfSharp-gdi.csproj +++ b/src/foundation/src/PDFsharp/src/PdfSharp-gdi/PdfSharp-gdi.csproj @@ -264,6 +264,8 @@ + + diff --git a/src/foundation/src/PDFsharp/src/PdfSharp-wpf/PdfSharp-wpf.csproj b/src/foundation/src/PDFsharp/src/PdfSharp-wpf/PdfSharp-wpf.csproj index be90e4ec..e7bf1b7c 100644 --- a/src/foundation/src/PDFsharp/src/PdfSharp-wpf/PdfSharp-wpf.csproj +++ b/src/foundation/src/PDFsharp/src/PdfSharp-wpf/PdfSharp-wpf.csproj @@ -259,6 +259,8 @@ + + diff --git a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.Attachments/PdfAFRelationship.cs b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.Attachments/PdfAFRelationship.cs index 9bf17473..d764d636 100644 --- a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.Attachments/PdfAFRelationship.cs +++ b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.Attachments/PdfAFRelationship.cs @@ -53,6 +53,11 @@ public static class PdfAFRelationship // TODO: clean up #US322 /// shall be used if this file specification is a schema definition for the associated object (e.g. an XML schema associated with a metadata stream). /// public const string Schema = nameof(Schema); + + /// + /// shall be used if this file specification denotes a C2PA manifest (content credentials) associated with this PDF document. + /// + public const string C2paManifest = "C2PA_Manifest"; } } diff --git a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManager.cs b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManager.cs new file mode 100644 index 00000000..a70d9ab3 --- /dev/null +++ b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManager.cs @@ -0,0 +1,125 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using PdfSharp.Pdf.Advanced; +using PdfSharp.Pdf.Attachments; +using PdfSharp.Pdf.Internal; + +namespace PdfSharp.Pdf.C2pa +{ + /// + /// Provides functionality to read C2PA content credentials manifests embedded in a PDF document. + /// + public class C2paManager : ManagerBase + { + C2paManager(PdfDocument document) : base(document) + { } + + /// + /// Gets a value indicating whether the document contains at least one C2PA manifest. + /// + public bool HasManifests => Manifests.Count > 0; + + /// + /// Gets the number of C2PA manifests found in the document. + /// + public int ManifestCount => Manifests.Count; + + /// + /// Gets information about all C2PA manifests embedded in the document. + /// + public IReadOnlyList Manifests => _manifests ??= ScanManifests(); + + List? _manifests; + + List ScanManifests() + { + var result = new List(); + var seen = new HashSet(); + var catalog = Document.Catalog; + + // The C2PA spec requires the manifest to be listed in the catalog's /AF array, but some + // producers only add it to the /Names/EmbeddedFiles name tree. The name tree is the only + // place we can get the /Names key from, so scan it first. + if (catalog.HasNames) + { + var names = catalog.Names; + if (names.HasEmbeddedFiles) + { + var namesNode = names.GetEmbeddedFiles()?.Names; + if (namesNode != null) + { + var count = namesNode.Count; + for (var idx = 0; idx < count; idx++) + { + var entry = namesNode[idx]; + TryAddManifest(entry.Value, entry.Key.Value, result, seen); + } + } + } + } + + // Scan /AF as well to catch manifests that are not listed in the name tree. + if (catalog.Elements.TryGetArray(PdfCatalog.Keys.AF, out var afArray)) + { + var count = afArray.Elements.Count; + for (var idx = 0; idx < count; idx++) + TryAddManifest(afArray.Elements[idx], "", result, seen); + } + + return result; + } + + static void TryAddManifest(PdfItem item, string namesKey, List result, HashSet seen) + { + PdfReference.Dereference(ref item); + if (item is not PdfDictionary fileSpec) + return; + + if (!fileSpec.Elements.TryGetString(PdfFileSpecification.Keys.AFRelationship, out var relationship)) + return; + // /AFRelationship is written as a PDF name, whose value includes the leading slash. + var relationshipName = relationship.Length > 0 && relationship[0] == '/' ? relationship[1..] : relationship; + if (relationshipName != PdfAFRelationship.C2paManifest) + return; + + var ef = fileSpec.Elements.GetDictionary(PdfFileSpecification.Keys.EF); + var stream = ef?.Elements.GetDictionary("/F") ?? ef?.Elements.GetDictionary("/UF"); + if (stream?.Stream == null) + return; + + // The same manifest can be reachable through both the name tree and /AF. + if (!seen.Add(stream.ObjectID)) + return; + + if (!fileSpec.Elements.TryGetString(PdfFileSpecification.Keys.UF, out var fileName) || fileName.Length == 0) + fileSpec.Elements.TryGetString(PdfFileSpecification.Keys.F, out fileName); + fileName ??= ""; + + fileSpec.Elements.TryGetString(PdfFileSpecification.Keys.Desc, out var description); + description ??= ""; + + // /Subtype is not a defined file specification key, but producers put the mime type here anyway. + if (!fileSpec.Elements.TryGetString("/Subtype", out var mimeType) || mimeType.Length == 0) + stream.Elements.TryGetString("/Subtype", out mimeType); + mimeType ??= ""; + + result.Add(new C2paManifestInfo + { + NamesKey = namesKey, + FileName = fileName, + Description = description, + MimeType = mimeType, + AFRelationship = relationshipName, + Data = stream.Stream.UnfilteredValue, + ObjectID = stream.ObjectID + }); + } + + /// + /// Gets or creates the C2paManager for the specified document. + /// + public static C2paManager ForDocument(PdfDocument document) + => document.C2paManager ??= new(document); + } +} diff --git a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManifestInfo.cs b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManifestInfo.cs new file mode 100644 index 00000000..555b637d --- /dev/null +++ b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.C2pa/C2paManifestInfo.cs @@ -0,0 +1,51 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +namespace PdfSharp.Pdf.C2pa +{ + /// + /// Sums up all relevant information of a C2PA content credentials manifest embedded in a PDF file. + /// + public class C2paManifestInfo + { + /// + /// The key of the file specification in the /Names array of the /EmbeddedFiles name tree, + /// or the empty string if the manifest was only found via the catalog's /AF array. + /// + public string NamesKey { get; internal set; } = ""; + + /// + /// Gets the name of the file, taken from the file specification's /UF entry, falling back to /F. + /// + public string FileName { get; internal set; } = ""; + + /// + /// Gets the optional description of the file specification. + /// + public string Description { get; internal set; } = ""; + + /// + /// Gets the mime type of the manifest, taken from the file specification's /Subtype entry, + /// falling back to the /Subtype entry of the embedded file stream. + /// + public string MimeType { get; internal set; } = ""; + + /// + /// Gets the /AFRelationship value of the file specification. + /// + // ReSharper disable once InconsistentNaming + public string AFRelationship { get; internal set; } = ""; + + /// + /// Gets the raw bytes of the C2PA manifest (JUMBF box), i.e. the unfiltered content + /// of the embedded file stream. + /// + public byte[] Data { get; internal set; } = []; + + /// + /// The object ID of the embedded file stream, used to detect duplicates when the + /// same manifest is referenced from both the name tree and the /AF array. + /// + internal PdfObjectID ObjectID { get; init; } + } +} diff --git a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.IO/Parser.cs b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.IO/Parser.cs index 64fe1c92..252ccd87 100644 --- a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.IO/Parser.cs +++ b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf.IO/Parser.cs @@ -422,7 +422,7 @@ void ReadDictionaryStream(PdfDictionary dict, SuppressExceptions? suppressObject int GetStreamLength(PdfDictionary dict, SuppressExceptions? suppressObjectOrderExceptions) { //if (dict.Elements["/F"] != null) // TODO #US373 Just a null check. - if (dict.Elements.HasValue("/F")) // #US373 + if (IsExternalFileStream(dict)) // #US373 throw new NotImplementedException("File streams are not yet implemented."); #if TEST_CODE_ // By uncommenting this and the label below, @@ -528,6 +528,51 @@ int GetStreamLength(PdfDictionary dict, SuppressExceptions? suppressObjectOrderE return lenStream; } + /// + /// Determines whether the stream dictionary's /F entry denotes an external file stream + /// (PDF 2.0 §7.3.8.2), i.e. the stream data is stored outside the PDF file and the bytes + /// between 'stream' and 'endstream' must be ignored. + /// Some producers misuse /F for unrelated purposes (e.g. embedded file parameters), so we + /// only treat it as an external file stream if its value actually looks like a file specification. + /// + static bool IsExternalFileStream(PdfDictionary dict) + { + switch (dict.Elements["/F"]) + { + case null: + return false; + + // A file specification can be a simple string containing the file name. + case PdfString or PdfStringObject: + return true; + + // A dictionary is only a file specification if it looks like one. + case PdfDictionary fileSpec: + return IsFileSpecificationDictionary(fileSpec); + + case PdfReference { Value: PdfDictionary fileSpec }: + return IsFileSpecificationDictionary(fileSpec); + + // An indirect object not yet read. We assume it is a file specification. + case PdfReference: + return true; + + default: + return false; + } + } + + static bool IsFileSpecificationDictionary(PdfDictionary dict) + { + if (dict.Elements.TryGetName("/Type", out var type) && type == "/Filespec") + return true; + + // The /Type entry is only required if /EF or /RF is present, so we also check + // for the entries a file specification dictionary is made of. + return dict.Elements.HasValue("/FS") || dict.Elements.HasValue("/F") || dict.Elements.HasValue("/UF") + || dict.Elements.HasValue("/DOS") || dict.Elements.HasValue("/Mac") || dict.Elements.HasValue("/Unix"); + } + /// /// Try to read 'endstream' after reading the stream content. Sometimes the Length is not exact /// and ReadSymbol fails. In this case we search the token 'endstream' in the diff --git a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf/PdfDocument.cs b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf/PdfDocument.cs index 777f441f..792a18c2 100644 --- a/src/foundation/src/PDFsharp/src/PdfSharp/Pdf/PdfDocument.cs +++ b/src/foundation/src/PDFsharp/src/PdfSharp/Pdf/PdfDocument.cs @@ -9,6 +9,7 @@ using PdfSharp.Logging; using PdfSharp.Pdf.Advanced; using PdfSharp.Pdf.Attachments; +using PdfSharp.Pdf.C2pa; using PdfSharp.Pdf.Filters; using PdfSharp.Pdf.Forms; using PdfSharp.Pdf.Internal; @@ -884,6 +885,11 @@ internal EmbeddedFilesManager GetEmbeddedFilesManager() internal PdfAManager GetPdfAManager() => PdfAManager ??= PdfAManager.ForDocument(this); + internal C2paManager? C2paManager { get; set; } + + internal C2paManager GetC2paManager() + => C2paManager ??= C2paManager.ForDocument(this); + // ReSharper disable once InconsistentNaming internal UAManager? UAManager { get; set; } diff --git a/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/C2paTests.cs b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/C2paTests.cs new file mode 100644 index 00000000..334ab0c5 --- /dev/null +++ b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/C2paTests.cs @@ -0,0 +1,191 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using System.Text; +using PdfSharp.Diagnostics; +using PdfSharp.Fonts; +using PdfSharp.Pdf; +using PdfSharp.Pdf.Advanced; +using PdfSharp.Pdf.Attachments; +using PdfSharp.Pdf.C2pa; +using PdfSharp.Pdf.IO; +using PdfSharp.Quality; +using Xunit; +using FluentAssertions; + +namespace PdfSharp.Tests.Pdf.C2pa +{ + [Collection("PDFsharp")] + public class C2paTests : IDisposable + { + public C2paTests() + { + PdfSharpCore.ResetAll(); +#if CORE + GlobalFontSettings.FontResolver = new UnitTestFontResolver(); +#endif + } + + public void Dispose() + { + PdfSharpCore.ResetAll(); + } + + static string DuckPdfPath => Path.Combine(AppContext.BaseDirectory, "Pdf.C2pa", "testdata", "duck.pdf"); + + /// + /// Builds a minimal document with an /EmbeddedFiles name tree entry whose file specification + /// points to a stream that carries the embedded file parameters under the (wrong) /F key + /// instead of /Params, reproducing the structure reported in issue #389. + /// + static PdfDocument BuildDocumentWithC2paManifest(byte[] manifestBytes) + { + var document = new PdfDocument(); + document.AddPage(); + + var manifestStream = new PdfDictionary(document); + document.Internals.AddObject(manifestStream); + manifestStream.CreateStream(manifestBytes); + // Misplaced key: a real embedded file stream would use /Params here, not /F. + var badParams = new PdfDictionary(document); + badParams.Elements.SetString("/Subtype", "application/c2pa"); + manifestStream.Elements.SetObject("/F", badParams); + + var ef = new PdfDictionary(document); + ef.Elements.SetReference("/F", manifestStream.Reference!); + + var fileSpec = new PdfDictionary(document); + document.Internals.AddObject(fileSpec); + fileSpec.Elements.SetName("/Type", "/Filespec"); + fileSpec.Elements.SetString("/F", "Content Credentials"); + fileSpec.Elements.SetString("/UF", "Content Credentials"); + fileSpec.Elements.SetString("/Desc", "Content Credentials"); + fileSpec.Elements.SetString("/Subtype", "application/c2pa"); + fileSpec.Elements.SetName("/AFRelationship", "/" + PdfAFRelationship.C2paManifest); + fileSpec.Elements.SetObject("/EF", ef); + + var embeddedFiles = document.Catalog.Names.GetEmbeddedFiles(true)!; + embeddedFiles.AddName("Content Credentials", fileSpec.Reference!); + + var af = document.Catalog.Elements.GetRequiredArray(PdfCatalog.Keys.AF, VCF.Create); + af.AddDictionary(fileSpec); + + return document; + } + + static PdfDocument SaveAndReopen(PdfDocument document, PdfDocumentOpenMode openMode) + { + using var stream = new MemoryStream(); + document.Save(stream); + stream.Position = 0; + return PdfReader.Open(stream, openMode); + } + + [Fact] + public void Open_document_with_C2PA_manifest() + { + var manifestBytes = Encoding.ASCII.GetBytes("dummy JUMBF content"); + using var document = BuildDocumentWithC2paManifest(manifestBytes); + + var action = () => SaveAndReopen(document, PdfDocumentOpenMode.Import); + + action.Should().NotThrow(); + } + + [Fact] + public void Get_C2PA_manifest_info() + { + var manifestBytes = Encoding.ASCII.GetBytes("dummy JUMBF content"); + using var document = BuildDocumentWithC2paManifest(manifestBytes); + using var reopened = SaveAndReopen(document, PdfDocumentOpenMode.Import); + + var c2pa = C2paManager.ForDocument(reopened); + + c2pa.HasManifests.Should().BeTrue(); + c2pa.ManifestCount.Should().Be(1); + + var info = c2pa.Manifests[0]; + info.NamesKey.Should().Be("Content Credentials"); + info.FileName.Should().Be("Content Credentials"); + info.Description.Should().Be("Content Credentials"); + info.MimeType.Should().Be("application/c2pa"); + info.AFRelationship.Should().Be(PdfAFRelationship.C2paManifest); + info.Data.Should().Equal(manifestBytes); + } + + [Fact] + public void Get_C2PA_manifest_info_from_document_without_manifest() + { + using var document = new PdfDocument(); + document.AddPage(); + using var reopened = SaveAndReopen(document, PdfDocumentOpenMode.Import); + + var c2pa = C2paManager.ForDocument(reopened); + + c2pa.HasManifests.Should().BeFalse(); + c2pa.ManifestCount.Should().Be(0); + c2pa.Manifests.Should().BeEmpty(); + } + + [Fact] + public void Open_document_with_external_file_stream() + { + using var document = new PdfDocument(); + document.AddPage(); + + var externalStream = new PdfDictionary(document); + document.Internals.AddObject(externalStream); + externalStream.CreateStream([1, 2, 3, 4]); + + var fileSpec = new PdfDictionary(document); + fileSpec.Elements.SetName("/Type", "/Filespec"); + fileSpec.Elements.SetString("/F", "some/external/file.bin"); + externalStream.Elements.SetObject("/F", fileSpec); + + // Attach the stream to the catalog so it survives object compaction on save. + document.Catalog.Elements.SetReference("/Test389ExternalFile", externalStream.Reference!); + + using var stream = new MemoryStream(); + document.Save(stream); + stream.Position = 0; + + var action = () => PdfReader.Open(stream, PdfDocumentOpenMode.Import); + + action.Should().Throw().WithMessage("File streams are not yet implemented."); + } + + [Theory] + [InlineData(PdfDocumentOpenMode.Import)] + [InlineData(PdfDocumentOpenMode.Modify)] + public void Open_duck_pdf(PdfDocumentOpenMode openMode) + { + var action = () => PdfReader.Open(DuckPdfPath, openMode); + + action.Should().NotThrow(); + } + + [Fact] + public void Get_C2PA_manifest_info_from_duck_pdf() + { + using var document = PdfReader.Open(DuckPdfPath, PdfDocumentOpenMode.Import); + + var c2pa = C2paManager.ForDocument(document); + + c2pa.HasManifests.Should().BeTrue(); + c2pa.ManifestCount.Should().Be(1); + + var info = c2pa.Manifests[0]; + info.NamesKey.Should().Be("Content Credentials"); + info.FileName.Should().Be("Content Credentials"); + info.Description.Should().Be("Content Credentials"); + info.MimeType.Should().Be("application/c2pa"); + info.AFRelationship.Should().Be(PdfAFRelationship.C2paManifest); + info.Data.Length.Should().Be(20166); + + // The manifest must be a valid JUMBF superbox: 4-byte big-endian length, followed by the "jumb" type. + var length = (info.Data[0] << 24) | (info.Data[1] << 16) | (info.Data[2] << 8) | info.Data[3]; + length.Should().Be(info.Data.Length); + Encoding.ASCII.GetString(info.Data, 4, 4).Should().Be("jumb"); + } + } +} diff --git a/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/testdata/duck.pdf b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/testdata/duck.pdf new file mode 100644 index 00000000..09762389 Binary files /dev/null and b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/Pdf.C2pa/testdata/duck.pdf differ diff --git a/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/PdfSharp.Tests.csproj b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/PdfSharp.Tests.csproj index 4286a509..f006c270 100644 --- a/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/PdfSharp.Tests.csproj +++ b/src/foundation/src/PDFsharp/tests/PdfSharp.Tests/PdfSharp.Tests.csproj @@ -36,6 +36,11 @@ + + + + + diff --git a/src/samples/src/PDFsharp/src/ReadC2paInfo/Cbor.cs b/src/samples/src/PDFsharp/src/ReadC2paInfo/Cbor.cs new file mode 100644 index 00000000..92fba49e --- /dev/null +++ b/src/samples/src/PDFsharp/src/ReadC2paInfo/Cbor.cs @@ -0,0 +1,173 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using System.Formats.Cbor; +using System.Text; + +namespace ReadC2paInfo +{ + /// + /// A CBOR value tagged with a semantic tag number (RFC 8949 §3.4), e.g. tag 18 for COSE_Sign1. + /// + record CborTagged(ulong Tag, object? Value); + + /// + /// Minimal CBOR decoder that turns a CBOR byte sequence into a generic, inspectable .NET object + /// tree: maps become List<KeyValuePair<object?, object?>> (order preserved, keys are + /// not required to be strings), arrays become List<object?>, and scalars become + /// string/byte[]/long/bool/double/null. Good enough to explore or pull specific fields out of a + /// C2PA claim/assertion/COSE structure without depending on the exact schema. + /// + static class Cbor + { + public static object? Decode(ReadOnlyMemory data) + { + var reader = new CborReader(data, CborConformanceMode.Lax); + return ReadValue(reader); + } + + static object? ReadValue(CborReader reader) + { + var state = reader.PeekState(); + switch (state) + { + case CborReaderState.UnsignedInteger: + case CborReaderState.NegativeInteger: + return reader.ReadInt64(); + case CborReaderState.ByteString: + return reader.ReadByteString(); + case CborReaderState.TextString: + return reader.ReadTextString(); + case CborReaderState.StartArray: + { + reader.ReadStartArray(); + var list = new List(); + while (reader.PeekState() != CborReaderState.EndArray) + list.Add(ReadValue(reader)); + reader.ReadEndArray(); + return list; + } + case CborReaderState.StartMap: + { + reader.ReadStartMap(); + var map = new List>(); + while (reader.PeekState() != CborReaderState.EndMap) + { + var key = ReadValue(reader); + var value = ReadValue(reader); + map.Add(new(key, value)); + } + reader.ReadEndMap(); + return map; + } + case CborReaderState.Boolean: + return reader.ReadBoolean(); + case CborReaderState.Null: + reader.ReadNull(); + return null; + case CborReaderState.Tag: + { + var tag = reader.ReadTag(); + return new CborTagged((ulong)tag, ReadValue(reader)); + } + case CborReaderState.SimpleValue: + return reader.ReadSimpleValue(); + case CborReaderState.HalfPrecisionFloat: + case CborReaderState.SinglePrecisionFloat: + case CborReaderState.DoublePrecisionFloat: + return reader.ReadDouble(); + default: + throw new NotSupportedException($"Unsupported CBOR state: {state}"); + } + } + + /// + /// Looks up a value in a decoded CBOR map by a text-string key. + /// + public static object? GetMapValue(object? map, string key) + { + if (map is List> pairs) + { + foreach (var kv in pairs) + { + if (kv.Key is string s && s == key) + return kv.Value; + } + } + return null; + } + + /// + /// Looks up a value in a decoded CBOR map by an integer key (used by COSE headers). + /// + public static object? GetMapValueByIntKey(object? map, long key) + { + if (map is List> pairs) + { + foreach (var kv in pairs) + { + if (kv.Key is long l && l == key) + return kv.Value; + } + } + return null; + } + + /// + /// Renders a decoded CBOR value tree as an indented, human-readable dump. + /// + public static string Dump(object? value) + { + var sb = new StringBuilder(); + DumpInto(sb, value, 0); + return sb.ToString(); + } + + static void DumpInto(StringBuilder sb, object? value, int indent) + { + var pad = new string(' ', indent * 2); + switch (value) + { + case List> map: + foreach (var kv in map) + { + var keyText = FormatScalar(kv.Key); + if (IsComposite(kv.Value)) + { + sb.AppendLine($"{pad}{keyText}:"); + DumpInto(sb, kv.Value, indent + 1); + } + else + sb.AppendLine($"{pad}{keyText}: {FormatScalar(kv.Value)}"); + } + break; + case List list: + for (var i = 0; i < list.Count; i++) + { + var item = list[i]; + if (IsComposite(item)) + { + sb.AppendLine($"{pad}[{i}]:"); + DumpInto(sb, item, indent + 1); + } + else + sb.AppendLine($"{pad}[{i}]: {FormatScalar(item)}"); + } + break; + default: + sb.AppendLine($"{pad}{FormatScalar(value)}"); + break; + } + } + + static bool IsComposite(object? value) => value is List> or List; + + static string FormatScalar(object? value) => value switch + { + null => "null", + byte[] bytes => $"<{bytes.Length} bytes: {Convert.ToHexString(bytes.AsSpan(0, Math.Min(bytes.Length, 16)))}{(bytes.Length > 16 ? "…" : "")}>", + CborTagged tagged => $"tag({tagged.Tag}) {FormatScalar(tagged.Value)}", + _ => value.ToString() ?? "", + }; + } +} diff --git a/src/samples/src/PDFsharp/src/ReadC2paInfo/CoseSignature.cs b/src/samples/src/PDFsharp/src/ReadC2paInfo/CoseSignature.cs new file mode 100644 index 00000000..d9dc0aa5 --- /dev/null +++ b/src/samples/src/PDFsharp/src/ReadC2paInfo/CoseSignature.cs @@ -0,0 +1,77 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using System.Security.Cryptography.X509Certificates; + +namespace ReadC2paInfo +{ + /// + /// Result of parsing a COSE_Sign1 structure (RFC 9052 §4.2): the signature algorithm and the + /// certificate chain carried in the protected header's x5chain (COSE header parameter 33). + /// + record CoseSignatureInfo(string Algorithm, List Certificates); + + /// + /// Extracts the algorithm and certificate chain from a COSE_Sign1 CBOR structure, as used by + /// the "c2pa.signature" JUMBF box. + /// + static class CoseSignature + { + // IANA COSE Algorithms registry (the ones relevant to C2PA signing). + static readonly Dictionary KnownAlgorithms = new() + { + [-7] = "ES256", + [-35] = "ES384", + [-36] = "ES512", + [-37] = "PS256", + [-38] = "PS384", + [-39] = "PS512", + [-257] = "RS256", + [-258] = "RS384", + [-259] = "RS512", + [-8] = "EdDSA", + }; + + public static CoseSignatureInfo Parse(object? decoded) + { + // COSE_Sign1 = [protected: bstr, unprotected: map, payload: bstr / nil, signature: bstr] + // Some encoders wrap this in CBOR tag 18; unwrap it if present. + var array = decoded switch + { + CborTagged { Value: List arr } => arr, + List arr => arr, + _ => throw new InvalidOperationException("Not a COSE_Sign1 structure (expected a 4-element array)."), + }; + + if (array.Count != 4 || array[0] is not byte[] protectedHeaderBytes) + throw new InvalidOperationException("Unexpected COSE_Sign1 layout."); + + var protectedHeader = Cbor.Decode(protectedHeaderBytes); + + var algorithm = "unknown"; + if (Cbor.GetMapValueByIntKey(protectedHeader, 1) is long algCode) + algorithm = KnownAlgorithms.GetValueOrDefault(algCode, $"alg({algCode})"); + + var certificates = new List(); + switch (Cbor.GetMapValueByIntKey(protectedHeader, 33)) + { + case byte[] singleCert: + certificates.Add(LoadCertificate(singleCert)); + break; + case List chain: + foreach (var item in chain) + { + if (item is byte[] der) + certificates.Add(LoadCertificate(der)); + } + break; + } + + return new CoseSignatureInfo(algorithm, certificates); + } + +#pragma warning disable SYSLIB0057 // X509Certificate2(byte[]) is obsolete since .NET 9, but still the only ctor available on all our target frameworks. + static X509Certificate2 LoadCertificate(byte[] der) => new(der); +#pragma warning restore SYSLIB0057 + } +} diff --git a/src/samples/src/PDFsharp/src/ReadC2paInfo/JumbfBox.cs b/src/samples/src/PDFsharp/src/ReadC2paInfo/JumbfBox.cs new file mode 100644 index 00000000..e09a57f0 --- /dev/null +++ b/src/samples/src/PDFsharp/src/ReadC2paInfo/JumbfBox.cs @@ -0,0 +1,100 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using System.Text; + +namespace ReadC2paInfo +{ + /// + /// Minimal recursive reader for JUMBF boxes (ISO/IEC 19566-5), the container format used + /// to store a C2PA manifest store. Only what is needed to navigate a C2PA manifest is + /// implemented: box type, label (taken from the box's 'jumd' description box), and payload. + /// + class JumbfBox + { + public required string Type { get; init; } + public string? Label { get; set; } + public ReadOnlyMemory Payload { get; init; } + public List Children { get; } = []; + + /// + /// Finds the first descendant (or this box) whose label equals the given label. + /// + public JumbfBox? FindByLabel(string label) + { + if (Label == label) + return this; + foreach (var child in Children) + { + var found = child.FindByLabel(label); + if (found is not null) + return found; + } + return null; + } + + /// + /// Returns the first child box of the given type (e.g. "cbor", "json"), or null. + /// + public JumbfBox? FirstChildOfType(string type) => Children.FirstOrDefault(c => c.Type == type); + + public static List Parse(ReadOnlyMemory data) + { + var boxes = new List(); + var offset = 0; + while (data.Length - offset >= 8) + { + var span = data.Span; + var length = (uint)((span[offset] << 24) | (span[offset + 1] << 16) | (span[offset + 2] << 8) | span[offset + 3]); + var type = Encoding.ASCII.GetString(span.Slice(offset + 4, 4)); + + var headerSize = 8; + var boxLength = (long)length; + if (length == 1) + { + // 64-bit extended length box (not expected for the manifests we deal with here). + var hi = span.Slice(offset + 8, 8); + boxLength = ((long)hi[0] << 56) | ((long)hi[1] << 48) | ((long)hi[2] << 40) | ((long)hi[3] << 32) + | ((long)hi[4] << 24) | ((long)hi[5] << 16) | ((long)hi[6] << 8) | hi[7]; + headerSize = 16; + } + + if (boxLength < headerSize || offset + boxLength > data.Length) + break; + + var payload = data.Slice(offset + headerSize, (int)boxLength - headerSize); + var box = new JumbfBox { Type = type, Payload = payload }; + + if (type == "jumb") + { + box.Children.AddRange(Parse(payload)); + box.Label = box.FirstChildOfType("jumd")?.Label; + } + else if (type == "jumd") + { + box.Label = ExtractJumdLabel(payload.Span); + } + + boxes.Add(box); + offset += (int)boxLength; + } + return boxes; + } + + // jumd payload: 16-byte UUID, 1-byte toggles, then (if a label is present) a + // null-terminated UTF-8 label string. + static string? ExtractJumdLabel(ReadOnlySpan payload) + { + const int uuidAndTogglesSize = 17; + if (payload.Length <= uuidAndTogglesSize) + return null; + + var rest = payload[uuidAndTogglesSize..]; + var nullIndex = rest.IndexOf((byte)0); + if (nullIndex < 0) + return null; + + return Encoding.UTF8.GetString(rest[..nullIndex]); + } + } +} diff --git a/src/samples/src/PDFsharp/src/ReadC2paInfo/Program.cs b/src/samples/src/PDFsharp/src/ReadC2paInfo/Program.cs new file mode 100644 index 00000000..45db9095 --- /dev/null +++ b/src/samples/src/PDFsharp/src/ReadC2paInfo/Program.cs @@ -0,0 +1,145 @@ +// PDFsharp - A .NET library for processing PDF +// See the LICENSE file in the solution root for more information. + +using System.Numerics; +using System.Text; +using PdfSharp.Pdf.C2pa; +using PdfSharp.Pdf.IO; + +namespace ReadC2paInfo +{ + /// + /// Demonstrates the fix for issue #389: opens a PDF containing a C2PA content credentials + /// manifest (a case that used to throw NotImplementedException) and reads the manifest via + /// the new C2paManager API. Also decodes the JUMBF/CBOR/COSE structures inside the manifest + /// so the claim, actions, and signature data can be cross-checked independently of PDFsharp. + /// + class Program + { + static int Main(string[] args) + { + var path = args.Length > 0 ? args[0] : FindDefaultDuckPdf(); + if (path is null || !File.Exists(path)) + { + Console.Error.WriteLine("Could not find 'duck.pdf'. Pass the path to a PDF file as argument."); + return 1; + } + + Console.WriteLine($"Opening '{path}'..."); + using var document = PdfReader.Open(path, PdfDocumentOpenMode.Import); + Console.WriteLine("Document opened successfully (this used to throw NotImplementedException before the issue #389 fix)."); + + var c2pa = C2paManager.ForDocument(document); + if (!c2pa.HasManifests) + { + Console.WriteLine("No C2PA manifests found in this document."); + return 0; + } + + Console.WriteLine(); + Console.WriteLine($"Found {c2pa.ManifestCount} C2PA manifest(s):"); + foreach (var info in c2pa.Manifests) + { + Console.WriteLine(); + Console.WriteLine($" Names key : {info.NamesKey}"); + Console.WriteLine($" File name : {info.FileName}"); + Console.WriteLine($" Description : {info.Description}"); + Console.WriteLine($" MIME type : {info.MimeType}"); + Console.WriteLine($" AFRelationship : {info.AFRelationship}"); + Console.WriteLine($" Manifest size : {info.Data.Length} bytes"); + + // A valid JUMBF manifest store starts with a "jumb" superbox: 4-byte length + 4-byte type. + if (info.Data.Length >= 8) + { + var boxLength = (info.Data[0] << 24) | (info.Data[1] << 16) | (info.Data[2] << 8) | info.Data[3]; + var boxType = Encoding.ASCII.GetString(info.Data, 4, 4); + Console.WriteLine($" JUMBF box : type='{boxType}', length={boxLength} (matches manifest size: {boxLength == info.Data.Length})"); + } + + DumpManifestContents(info.Data); + } + + return 0; + } + + /// + /// Parses the JUMBF box tree of a manifest and prints the claim, actions, and signature + /// content it finds, decoded from CBOR/COSE, so the values can be verified independently. + /// + static void DumpManifestContents(byte[] manifestData) + { + var store = JumbfBox.Parse(manifestData).FirstOrDefault(); + if (store is null) + { + Console.WriteLine(" (could not parse JUMBF box tree)"); + return; + } + + // The manifest store's first 'jumb' child is the manifest itself; its label is the manifest ID. + var manifestBox = store.Children.FirstOrDefault(c => c.Type == "jumb"); + Console.WriteLine(); + Console.WriteLine($" Manifest ID : {manifestBox?.Label}"); + if (manifestBox is null) + return; + + var claimBox = manifestBox.FindByLabel("c2pa.claim.v2") ?? manifestBox.FindByLabel("c2pa.claim"); + var claimCbor = claimBox?.FirstChildOfType("cbor"); + if (claimCbor is not null) + { + Console.WriteLine(); + Console.WriteLine($" --- {claimBox!.Label} (raw CBOR dump) ---"); + Console.Write(Indent(Cbor.Dump(Cbor.Decode(claimCbor.Payload)))); + } + + var actionsBox = manifestBox.FindByLabel("c2pa.actions.v2") ?? manifestBox.FindByLabel("c2pa.actions"); + var actionsCbor = actionsBox?.FirstChildOfType("cbor"); + if (actionsCbor is not null) + { + Console.WriteLine(); + Console.WriteLine($" --- {actionsBox!.Label} (raw CBOR dump) ---"); + Console.Write(Indent(Cbor.Dump(Cbor.Decode(actionsCbor.Payload)))); + } + + var signatureBox = manifestBox.FindByLabel("c2pa.signature"); + var signatureCbor = signatureBox?.FirstChildOfType("cbor"); + if (signatureCbor is not null) + { + var cose = CoseSignature.Parse(Cbor.Decode(signatureCbor.Payload)); + Console.WriteLine(); + Console.WriteLine(" --- c2pa.signature (COSE_Sign1) ---"); + Console.WriteLine($" Algorithm : {cose.Algorithm}"); + for (var i = 0; i < cose.Certificates.Count; i++) + { + var cert = cose.Certificates[i]; + var serialBigEndian = cert.GetSerialNumber().Reverse().ToArray(); + var serialDecimal = new BigInteger(serialBigEndian, isUnsigned: true, isBigEndian: true); + Console.WriteLine($" Certificate[{i}]:"); + Console.WriteLine($" Subject : {cert.Subject}"); + Console.WriteLine($" Issuer : {cert.Issuer}"); + Console.WriteLine($" Serial number : {serialDecimal}"); + } + } + } + + static string Indent(string text) => + string.Join(Environment.NewLine, text.TrimEnd('\r', '\n').Split('\n').Select(line => " " + line.TrimEnd('\r'))) + Environment.NewLine; + + /// + /// Walks up from the executable directory to find the duck.pdf test asset that ships with PdfSharp.Tests. + /// + static string? FindDefaultDuckPdf() + { + DirectoryInfo? dir = new(AppContext.BaseDirectory); + for (var i = 0; i < 12 && dir is not null; i++) + { + var candidate = Path.Combine(dir.FullName, "src", "foundation", "src", "PDFsharp", "tests", + "PdfSharp.Tests", "Pdf.C2pa", "testdata", "duck.pdf"); + if (File.Exists(candidate)) + return candidate; + dir = dir.Parent; + } + return null; + } + } +} + diff --git a/src/samples/src/PDFsharp/src/ReadC2paInfo/ReadC2paInfo,PDFsharp.csproj b/src/samples/src/PDFsharp/src/ReadC2paInfo/ReadC2paInfo,PDFsharp.csproj new file mode 100644 index 00000000..e3635757 --- /dev/null +++ b/src/samples/src/PDFsharp/src/ReadC2paInfo/ReadC2paInfo,PDFsharp.csproj @@ -0,0 +1,17 @@ + + + + Exe + $(PDFsharpTargetFrameworks_Exe) + ReadC2paInfo,PDFsharp + + + + + + + + + + +