From d770f699aaf09711a93b65930e91c6f0bb3b6243 Mon Sep 17 00:00:00 2001 From: N2614 Date: Wed, 15 Feb 2012 06:50:21 +0000 Subject: [PATCH] =?UTF-8?q?BGS=E3=81=A8=E3=81=AE=E9=80=9A=E4=BF=A1?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@634 385bec56-5757-e545-9c3a-d8741f4650f1 --- .../ConsoleRestore/BgsCommunicator.cpp | 808 ------------------ .../sources/ConsoleRestore/BgsCommunicator.h | 56 -- .../sources/ConsoleRestore/Controller.cpp | 5 +- .../sources/ConsoleRestore/OMakefile | 3 - .../ConsoleRestore/PreinstallImporter.cpp | 174 ---- .../ConsoleRestore/PreinstallImporter.h | 23 - .../ConsoleRestore/SimpleXmlPreprocessor.cpp | 180 ---- .../ConsoleRestore/SimpleXmlPreprocessor.h | 52 -- .../ConsoleRestore/TitleDownloader.cpp | 4 +- .../sources/ConsoleRestore/TitleDownloader.h | 6 +- .../sources/ConsoleRestore/XmlCreator.cpp | 84 -- .../sources/ConsoleRestore/XmlCreator.h | 51 -- .../ConsoleRestore/BgsCommunicator/OMakefile | 72 -- .../BgsCommunicator/test_BgsCommunicator.cpp | 153 ---- .../PreinstallImporter/OMakefile | 3 - .../test_PreinstallImporter.cpp | 30 - .../ConsoleRestore/SimpleXmlParser/OMakefile | 49 -- .../SimpleXmlParser/test_SimpleXmlParser.cpp | 211 ----- .../ConsoleRestore/TitleDownloader/OMakefile | 3 - .../TitleDownloader/test_TitleDownloader.cpp | 2 +- .../SimpleXmlPreprocessor/OMakefile | 22 - .../googletest/SimpleXmlPreprocessor/stub.h | 21 - .../testSimpleXmlPreprocessor.cpp | 23 - .../tests/googletest/XmlCreator/OMakefile | 19 - .../googletest/XmlCreator/testXmlCreator.cpp | 33 - .../tools/PreinstallListUp/AutoBoot.bsf | Bin 2302 -> 0 bytes .../sources/tools/PreinstallListUp/OMakefile | 70 -- .../PreinstallListUp/PreinstallListUp.rsf | 47 - .../tools/PreinstallListUp/banner/model.cbmd | Bin 198785 -> 0 bytes .../tools/PreinstallListUp/banner/sound.cbsd | Bin 198785 -> 0 bytes .../PreinstallListUp/banner/unknown24x24.ctpk | 1 - .../PreinstallListUp/banner/unknown48x48.ctpk | 1 - .../sources/tools/PreinstallListUp/main.cpp | 232 ----- 33 files changed, 4 insertions(+), 2434 deletions(-) delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.h delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.h delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.h delete mode 100644 trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/OMakefile delete mode 100644 trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/test_BgsCommunicator.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/OMakefile delete mode 100644 trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/test_SimpleXmlParser.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/OMakefile delete mode 100644 trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/stub.h delete mode 100644 trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/testSimpleXmlPreprocessor.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/OMakefile delete mode 100644 trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/testXmlCreator.cpp delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/AutoBoot.bsf delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/OMakefile delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/PreinstallListUp.rsf delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/banner/model.cbmd delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/banner/sound.cbsd delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/banner/unknown24x24.ctpk delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/banner/unknown48x48.ctpk delete mode 100644 trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/main.cpp diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.cpp deleted file mode 100644 index 04eec8f..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.cpp +++ /dev/null @@ -1,808 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: BgsCommunicator.cpp - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "BgsCommunicator.h" -#include "Util.h" -#include "CommonLogger.h" - -#include -#include -#include -#include - -namespace ConsoleRestore -{ - -namespace -{ -// Buffer for POST data must be 4096-byte aligned, and a multiple of 4096 bytes. -static unsigned char s_PostBuffer[4096] NN_ATTRIBUTE_ALIGN(4096); - -// DEV6接続用証明書 -u8 USER_ORIGIN_CLIENT_CERT_DATA[] = -{ -#ifndef BUILD_FOR_PROD_BGS - #ifndef BUILD_FOR_TEST_BGS - // DEV6 -0x30, 0x82, 0x03, 0xef, 0x30, 0x82, 0x02, 0xd7, 0xa0, 0x03, 0x02, -0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, -0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x81, -0x93, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, -0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, -0x08, 0x13, 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, -0x69, 0x61, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x07, -0x13, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, -0x56, 0x69, 0x65, 0x77, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, -0x04, 0x0a, 0x13, 0x0b, 0x69, 0x47, 0x77, 0x61, 0x72, 0x65, 0x20, -0x49, 0x6e, 0x63, 0x2e, 0x31, 0x23, 0x30, 0x21, 0x06, 0x03, 0x55, -0x04, 0x0b, 0x13, 0x1a, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x53, -0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x75, -0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1c, 0x30, -0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x49, 0x6e, 0x74, -0x65, 0x72, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, -0x75, 0x62, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, -0x31, 0x30, 0x31, 0x31, 0x32, 0x31, 0x35, 0x33, 0x32, 0x36, 0x5a, -0x17, 0x0d, 0x33, 0x36, 0x30, 0x31, 0x31, 0x35, 0x32, 0x31, 0x35, -0x33, 0x32, 0x36, 0x5a, 0x30, 0x81, 0x8c, 0x31, 0x0b, 0x30, 0x09, -0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, -0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x43, 0x61, -0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16, 0x30, -0x14, 0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x4d, 0x6f, 0x75, -0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, 0x31, -0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x69, -0x47, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, -0x1d, 0x30, 0x1b, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x14, 0x41, -0x67, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, -0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x31, 0x1b, 0x30, -0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x14, 0x12, 0x4e, 0x69, 0x6e, -0x74, 0x65, 0x6e, 0x64, 0x6f, 0x5f, 0x45, 0x43, 0x49, 0x5f, 0x61, -0x67, 0x65, 0x6e, 0x74, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, -0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, -0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, -0xee, 0x37, 0xef, 0xbb, 0x29, 0x54, 0x42, 0x3b, 0x21, 0x08, 0xe3, -0x77, 0x82, 0x12, 0x85, 0xc7, 0x3b, 0x58, 0x6f, 0x72, 0x6f, 0x3f, -0x11, 0x13, 0x49, 0x40, 0xac, 0xe2, 0x26, 0x71, 0xf2, 0xd2, 0xa4, -0xa6, 0x92, 0xfb, 0xcb, 0xc9, 0x6c, 0x45, 0xe4, 0xff, 0xbe, 0xd6, -0x65, 0xd9, 0x71, 0x7a, 0x21, 0x4b, 0x12, 0xf5, 0xa1, 0x11, 0xe0, -0x32, 0xd9, 0x42, 0x92, 0x39, 0x47, 0x36, 0x1a, 0x83, 0xc3, 0x62, -0xd5, 0xda, 0x7d, 0xc0, 0x10, 0xbd, 0x75, 0x43, 0x42, 0x04, 0x49, -0x72, 0x52, 0xaa, 0xc1, 0x72, 0x63, 0xbc, 0x16, 0x77, 0x76, 0x72, -0x86, 0x55, 0xac, 0x9a, 0x68, 0x15, 0x58, 0x51, 0xaf, 0xb2, 0xa0, -0xc8, 0x1b, 0xd1, 0x18, 0xad, 0x49, 0x6d, 0x16, 0x19, 0xa1, 0xfb, -0xee, 0x7c, 0x4c, 0x74, 0x7e, 0xc7, 0xfa, 0x08, 0x23, 0x80, 0xb9, -0xef, 0x2f, 0x6f, 0x3d, 0xaf, 0x96, 0xd1, 0x02, 0x03, 0x01, 0x00, -0x01, 0xa3, 0x81, 0xd6, 0x30, 0x81, 0xd3, 0x30, 0x1d, 0x06, 0x03, -0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x73, 0x9c, 0x63, 0x4b, -0x0b, 0xcc, 0x6c, 0x5b, 0xcc, 0x60, 0x3c, 0x51, 0x87, 0x4a, 0x41, -0x1c, 0x8a, 0x0b, 0x1a, 0x0f, 0x30, 0x81, 0xb1, 0x06, 0x03, 0x55, -0x1d, 0x23, 0x04, 0x81, 0xa9, 0x30, 0x81, 0xa6, 0x80, 0x14, 0xb1, -0x08, 0x84, 0xa7, 0xe2, 0xe6, 0xa8, 0x53, 0x0f, 0x4c, 0x50, 0x0f, -0xbb, 0x7d, 0x3e, 0x68, 0xa7, 0x98, 0x5c, 0x13, 0xa1, 0x81, 0x8a, -0xa4, 0x81, 0x87, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, -0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, -0x11, 0x06, 0x03, 0x55, 0x04, 0x08, 0x13, 0x0a, 0x43, 0x61, 0x6c, -0x69, 0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x31, 0x16, 0x30, 0x14, -0x06, 0x03, 0x55, 0x04, 0x07, 0x13, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, -0x74, 0x61, 0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, 0x31, 0x14, -0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0b, 0x69, 0x47, -0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1e, -0x30, 0x1c, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x15, 0x43, 0x65, -0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x41, -0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x31, 0x12, 0x30, -0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x09, 0x69, 0x47, 0x77, -0x61, 0x72, 0x65, 0x20, 0x43, 0x41, 0x82, 0x01, 0x0d, 0x30, 0x0d, -0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, -0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa8, 0x03, 0xa4, 0xa0, -0x91, 0x40, 0x4c, 0x08, 0xf1, 0x54, 0x01, 0x1c, 0xe3, 0x45, 0x3c, -0x79, 0xb9, 0x16, 0xf9, 0xc9, 0x58, 0x2d, 0xb3, 0x23, 0x26, 0x50, -0x18, 0x5f, 0x13, 0x56, 0xa9, 0x9f, 0x0e, 0xc1, 0xa9, 0xb9, 0x7c, -0xb1, 0xe9, 0x5d, 0x74, 0x60, 0x6c, 0x3b, 0x1c, 0xf6, 0x03, 0xc7, -0x5f, 0x08, 0x65, 0xc8, 0xcf, 0xf3, 0x71, 0xac, 0x96, 0xb2, 0xf2, -0x92, 0x44, 0xd4, 0x03, 0x80, 0x3c, 0x83, 0x52, 0x96, 0x90, 0x1c, -0x17, 0xa7, 0x9c, 0x05, 0xb2, 0x9e, 0xaa, 0xa7, 0x4a, 0xec, 0xf1, -0x3e, 0x8e, 0xc9, 0x7c, 0x7e, 0x81, 0x58, 0x88, 0x2e, 0x9c, 0x44, -0x04, 0xe7, 0x16, 0xf4, 0xa8, 0x00, 0xf1, 0xf3, 0x32, 0x11, 0x23, -0x57, 0x85, 0x65, 0xd0, 0x6c, 0x1d, 0x29, 0xb8, 0x4a, 0xeb, 0x22, -0xff, 0x11, 0x30, 0x92, 0x7a, 0xb1, 0x4b, 0x19, 0x71, 0xc4, 0xbb, -0xf8, 0x75, 0xaa, 0x54, 0xe7, 0xe9, 0x31, 0xfa, 0xad, 0xb1, 0xb6, -0x8c, 0xae, 0xbe, 0xb3, 0x7f, 0x9a, 0x8b, 0x0d, 0x3a, 0xef, 0x2d, -0xb6, 0xec, 0x9d, 0x3e, 0x7d, 0x3a, 0xb9, 0x76, 0xf0, 0x3c, 0x64, -0x4b, 0xa8, 0x48, 0x58, 0x89, 0x5a, 0x28, 0x36, 0x86, 0x75, 0xe3, -0x70, 0xb3, 0xd4, 0x5a, 0xff, 0x2e, 0xe5, 0xc6, 0x5c, 0xfd, 0xa8, -0xcf, 0x23, 0x5e, 0xa2, 0x96, 0x20, 0x18, 0xc4, 0x3e, 0x6e, 0x2d, -0xe1, 0xcb, 0x47, 0x3a, 0x67, 0x04, 0xd2, 0xb3, 0xbe, 0x38, 0x13, -0xf1, 0x88, 0x0e, 0x5c, 0x18, 0xd5, 0x22, 0xd7, 0x8d, 0x14, 0x3e, -0xa7, 0xcf, 0x20, 0x62, 0x28, 0x1f, 0x31, 0x62, 0x98, 0x8c, 0xe3, -0xb0, 0xdc, 0x47, 0xee, 0x80, 0x76, 0xa3, 0x23, 0x11, 0xba, 0xe3, -0x87, 0xac, 0x85, 0xdb, 0x25, 0xe8, 0x9a, 0x4e, 0x23, 0x0b, 0xe7, -0xe2, 0x51, 0xa0, 0x1d, 0x87, 0xf1, 0xe9, 0x13, 0x9f, 0x1d - #else - // TEST -0x42, 0x61, 0x67, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, -0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x69, -0x65, 0x6e, 0x64, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x20, -0x65, 0x63, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, -0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x49, 0x44, -0x3a, 0x20, 0x46, 0x44, 0x20, 0x38, 0x41, 0x20, 0x39, 0x31, 0x20, -0x32, 0x41, 0x20, 0x43, 0x46, 0x20, 0x43, 0x41, 0x20, 0x36, 0x33, -0x20, 0x44, 0x45, 0x20, 0x31, 0x32, 0x20, 0x42, 0x32, 0x20, 0x31, -0x31, 0x20, 0x32, 0x35, 0x20, 0x46, 0x46, 0x20, 0x39, 0x31, 0x20, -0x38, 0x44, 0x20, 0x42, 0x34, 0x20, 0x35, 0x39, 0x20, 0x42, 0x35, -0x20, 0x42, 0x45, 0x20, 0x43, 0x34, 0x20, 0x0a, 0x73, 0x75, 0x62, -0x6a, 0x65, 0x63, 0x74, 0x3d, 0x2f, 0x43, 0x3d, 0x55, 0x53, 0x2f, -0x53, 0x54, 0x3d, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e, -0x69, 0x61, 0x2f, 0x4c, 0x3d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, -0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, 0x2f, 0x4f, 0x3d, 0x69, -0x47, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x2f, -0x4f, 0x55, 0x3d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x41, 0x75, -0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, -0x6e, 0x2f, 0x43, 0x4e, 0x3d, 0x4e, 0x69, 0x6e, 0x74, 0x65, 0x6e, -0x64, 0x6f, 0x5f, 0x45, 0x43, 0x49, 0x5f, 0x61, 0x67, 0x65, 0x6e, -0x74, 0x0a, 0x69, 0x73, 0x73, 0x75, 0x65, 0x72, 0x3d, 0x2f, 0x43, -0x3d, 0x55, 0x53, 0x2f, 0x53, 0x54, 0x3d, 0x43, 0x61, 0x6c, 0x69, -0x66, 0x6f, 0x72, 0x6e, 0x69, 0x61, 0x2f, 0x4c, 0x3d, 0x4d, 0x6f, -0x75, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, -0x2f, 0x4f, 0x3d, 0x69, 0x47, 0x77, 0x61, 0x72, 0x65, 0x20, 0x49, -0x6e, 0x63, 0x2e, 0x2f, 0x4f, 0x55, 0x3d, 0x49, 0x6e, 0x74, 0x65, -0x72, 0x2d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x6f, -0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, -0x2f, 0x43, 0x4e, 0x3d, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x2d, 0x53, -0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x53, 0x75, 0x62, 0x20, 0x43, -0x41, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, -0x4e, 0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, -0x54, 0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, -0x44, 0x37, 0x7a, 0x43, 0x43, 0x41, 0x74, 0x65, 0x67, 0x41, 0x77, -0x49, 0x42, 0x41, 0x67, 0x49, 0x42, 0x41, 0x6a, 0x41, 0x4e, 0x42, -0x67, 0x6b, 0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, -0x41, 0x51, 0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x6b, 0x7a, 0x45, -0x4c, 0x4d, 0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, -0x4d, 0x43, 0x56, 0x56, 0x4d, 0x78, 0x0a, 0x45, 0x7a, 0x41, 0x52, -0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6b, 0x4e, -0x68, 0x62, 0x47, 0x6c, 0x6d, 0x62, 0x33, 0x4a, 0x75, 0x61, 0x57, -0x45, 0x78, 0x46, 0x6a, 0x41, 0x55, 0x42, 0x67, 0x4e, 0x56, 0x42, -0x41, 0x63, 0x54, 0x44, 0x55, 0x31, 0x76, 0x64, 0x57, 0x35, 0x30, -0x59, 0x57, 0x6c, 0x75, 0x49, 0x46, 0x5a, 0x70, 0x5a, 0x58, 0x63, -0x78, 0x46, 0x44, 0x41, 0x53, 0x0a, 0x42, 0x67, 0x4e, 0x56, 0x42, -0x41, 0x6f, 0x54, 0x43, 0x32, 0x6c, 0x48, 0x64, 0x32, 0x46, 0x79, -0x5a, 0x53, 0x42, 0x4a, 0x62, 0x6d, 0x4d, 0x75, 0x4d, 0x53, 0x4d, -0x77, 0x49, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4c, 0x45, 0x78, -0x70, 0x4a, 0x62, 0x6e, 0x52, 0x6c, 0x63, 0x69, 0x31, 0x54, 0x5a, -0x58, 0x4a, 0x32, 0x5a, 0x58, 0x49, 0x67, 0x51, 0x32, 0x39, 0x74, -0x62, 0x58, 0x56, 0x75, 0x0a, 0x61, 0x57, 0x4e, 0x68, 0x64, 0x47, -0x6c, 0x76, 0x62, 0x6a, 0x45, 0x63, 0x4d, 0x42, 0x6f, 0x47, 0x41, -0x31, 0x55, 0x45, 0x41, 0x78, 0x4d, 0x54, 0x53, 0x57, 0x35, 0x30, -0x5a, 0x58, 0x49, 0x74, 0x55, 0x32, 0x56, 0x79, 0x64, 0x6d, 0x56, -0x79, 0x49, 0x46, 0x4e, 0x31, 0x59, 0x69, 0x42, 0x44, 0x51, 0x54, -0x41, 0x65, 0x46, 0x77, 0x30, 0x78, 0x4d, 0x44, 0x45, 0x77, 0x4d, -0x54, 0x45, 0x79, 0x0a, 0x4d, 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x5a, -0x61, 0x46, 0x77, 0x30, 0x7a, 0x4e, 0x6a, 0x41, 0x78, 0x4d, 0x54, -0x55, 0x79, 0x4d, 0x54, 0x55, 0x7a, 0x4d, 0x6a, 0x5a, 0x61, 0x4d, -0x49, 0x47, 0x4d, 0x4d, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, -0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, 0x55, 0x7a, 0x45, -0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, -0x4d, 0x4b, 0x0a, 0x51, 0x32, 0x46, 0x73, 0x61, 0x57, 0x5a, 0x76, -0x63, 0x6d, 0x35, 0x70, 0x59, 0x54, 0x45, 0x57, 0x4d, 0x42, 0x51, -0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4d, 0x4e, 0x54, 0x57, -0x39, 0x31, 0x62, 0x6e, 0x52, 0x68, 0x61, 0x57, 0x34, 0x67, 0x56, -0x6d, 0x6c, 0x6c, 0x64, 0x7a, 0x45, 0x55, 0x4d, 0x42, 0x49, 0x47, -0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4d, 0x4c, 0x61, 0x55, 0x64, -0x33, 0x0a, 0x59, 0x58, 0x4a, 0x6c, 0x49, 0x45, 0x6c, 0x75, 0x59, -0x79, 0x34, 0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4e, 0x56, -0x42, 0x41, 0x73, 0x54, 0x46, 0x45, 0x46, 0x6e, 0x5a, 0x57, 0x35, -0x30, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x6c, 0x62, 0x6e, -0x52, 0x70, 0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4d, -0x52, 0x73, 0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, -0x0a, 0x46, 0x42, 0x4a, 0x4f, 0x61, 0x57, 0x35, 0x30, 0x5a, 0x57, -0x35, 0x6b, 0x62, 0x31, 0x39, 0x46, 0x51, 0x30, 0x6c, 0x66, 0x59, -0x57, 0x64, 0x6c, 0x62, 0x6e, 0x51, 0x77, 0x67, 0x5a, 0x38, 0x77, -0x44, 0x51, 0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, -0x4e, 0x41, 0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x59, -0x30, 0x41, 0x4d, 0x49, 0x47, 0x4a, 0x41, 0x6f, 0x47, 0x42, 0x0a, -0x41, 0x4f, 0x34, 0x33, 0x37, 0x37, 0x73, 0x70, 0x56, 0x45, 0x49, -0x37, 0x49, 0x51, 0x6a, 0x6a, 0x64, 0x34, 0x49, 0x53, 0x68, 0x63, -0x63, 0x37, 0x57, 0x47, 0x39, 0x79, 0x62, 0x7a, 0x38, 0x52, 0x45, -0x30, 0x6c, 0x41, 0x72, 0x4f, 0x49, 0x6d, 0x63, 0x66, 0x4c, 0x53, -0x70, 0x4b, 0x61, 0x53, 0x2b, 0x38, 0x76, 0x4a, 0x62, 0x45, 0x58, -0x6b, 0x2f, 0x37, 0x37, 0x57, 0x5a, 0x64, 0x6c, 0x78, 0x0a, 0x65, -0x69, 0x46, 0x4c, 0x45, 0x76, 0x57, 0x68, 0x45, 0x65, 0x41, 0x79, -0x32, 0x55, 0x4b, 0x53, 0x4f, 0x55, 0x63, 0x32, 0x47, 0x6f, 0x50, -0x44, 0x59, 0x74, 0x58, 0x61, 0x66, 0x63, 0x41, 0x51, 0x76, 0x58, -0x56, 0x44, 0x51, 0x67, 0x52, 0x4a, 0x63, 0x6c, 0x4b, 0x71, 0x77, -0x58, 0x4a, 0x6a, 0x76, 0x42, 0x5a, 0x33, 0x64, 0x6e, 0x4b, 0x47, -0x56, 0x61, 0x79, 0x61, 0x61, 0x42, 0x56, 0x59, 0x0a, 0x55, 0x61, -0x2b, 0x79, 0x6f, 0x4d, 0x67, 0x62, 0x30, 0x52, 0x69, 0x74, 0x53, -0x57, 0x30, 0x57, 0x47, 0x61, 0x48, 0x37, 0x37, 0x6e, 0x78, 0x4d, -0x64, 0x48, 0x37, 0x48, 0x2b, 0x67, 0x67, 0x6a, 0x67, 0x4c, 0x6e, -0x76, 0x4c, 0x32, 0x38, 0x39, 0x72, 0x35, 0x62, 0x52, 0x41, 0x67, -0x4d, 0x42, 0x41, 0x41, 0x47, 0x6a, 0x67, 0x64, 0x59, 0x77, 0x67, -0x64, 0x4d, 0x77, 0x48, 0x51, 0x59, 0x44, 0x0a, 0x56, 0x52, 0x30, -0x4f, 0x42, 0x42, 0x59, 0x45, 0x46, 0x48, 0x4f, 0x63, 0x59, 0x30, -0x73, 0x4c, 0x7a, 0x47, 0x78, 0x62, 0x7a, 0x47, 0x41, 0x38, 0x55, -0x59, 0x64, 0x4b, 0x51, 0x52, 0x79, 0x4b, 0x43, 0x78, 0x6f, 0x50, -0x4d, 0x49, 0x47, 0x78, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x53, 0x4d, -0x45, 0x67, 0x61, 0x6b, 0x77, 0x67, 0x61, 0x61, 0x41, 0x46, 0x4c, -0x45, 0x49, 0x68, 0x4b, 0x66, 0x69, 0x0a, 0x35, 0x71, 0x68, 0x54, -0x44, 0x30, 0x78, 0x51, 0x44, 0x37, 0x74, 0x39, 0x50, 0x6d, 0x69, -0x6e, 0x6d, 0x46, 0x77, 0x54, 0x6f, 0x59, 0x47, 0x4b, 0x70, 0x49, -0x47, 0x48, 0x4d, 0x49, 0x47, 0x45, 0x4d, 0x51, 0x73, 0x77, 0x43, -0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, -0x55, 0x7a, 0x45, 0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, -0x45, 0x43, 0x42, 0x4d, 0x4b, 0x0a, 0x51, 0x32, 0x46, 0x73, 0x61, -0x57, 0x5a, 0x76, 0x63, 0x6d, 0x35, 0x70, 0x59, 0x54, 0x45, 0x57, -0x4d, 0x42, 0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4d, -0x4e, 0x54, 0x57, 0x39, 0x31, 0x62, 0x6e, 0x52, 0x68, 0x61, 0x57, -0x34, 0x67, 0x56, 0x6d, 0x6c, 0x6c, 0x64, 0x7a, 0x45, 0x55, 0x4d, -0x42, 0x49, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4d, 0x4c, -0x61, 0x55, 0x64, 0x33, 0x0a, 0x59, 0x58, 0x4a, 0x6c, 0x49, 0x45, -0x6c, 0x75, 0x59, 0x79, 0x34, 0x78, 0x48, 0x6a, 0x41, 0x63, 0x42, -0x67, 0x4e, 0x56, 0x42, 0x41, 0x73, 0x54, 0x46, 0x55, 0x4e, 0x6c, -0x63, 0x6e, 0x52, 0x70, 0x5a, 0x6d, 0x6c, 0x6a, 0x59, 0x58, 0x52, -0x6c, 0x49, 0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6d, -0x6c, 0x30, 0x65, 0x54, 0x45, 0x53, 0x4d, 0x42, 0x41, 0x47, 0x41, -0x31, 0x55, 0x45, 0x0a, 0x41, 0x78, 0x4d, 0x4a, 0x61, 0x55, 0x64, -0x33, 0x59, 0x58, 0x4a, 0x6c, 0x49, 0x45, 0x4e, 0x42, 0x67, 0x67, -0x45, 0x4e, 0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, -0x49, 0x62, 0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, -0x41, 0x34, 0x49, 0x42, 0x41, 0x51, 0x43, 0x6f, 0x41, 0x36, 0x53, -0x67, 0x6b, 0x55, 0x42, 0x4d, 0x43, 0x50, 0x46, 0x55, 0x41, 0x52, -0x7a, 0x6a, 0x0a, 0x52, 0x54, 0x78, 0x35, 0x75, 0x52, 0x62, 0x35, -0x79, 0x56, 0x67, 0x74, 0x73, 0x79, 0x4d, 0x6d, 0x55, 0x42, 0x68, -0x66, 0x45, 0x31, 0x61, 0x70, 0x6e, 0x77, 0x37, 0x42, 0x71, 0x62, -0x6c, 0x38, 0x73, 0x65, 0x6c, 0x64, 0x64, 0x47, 0x42, 0x73, 0x4f, -0x78, 0x7a, 0x32, 0x41, 0x38, 0x64, 0x66, 0x43, 0x47, 0x58, 0x49, -0x7a, 0x2f, 0x4e, 0x78, 0x72, 0x4a, 0x61, 0x79, 0x38, 0x70, 0x4a, -0x45, 0x0a, 0x31, 0x41, 0x4f, 0x41, 0x50, 0x49, 0x4e, 0x53, 0x6c, -0x70, 0x41, 0x63, 0x46, 0x36, 0x65, 0x63, 0x42, 0x62, 0x4b, 0x65, -0x71, 0x71, 0x64, 0x4b, 0x37, 0x50, 0x45, 0x2b, 0x6a, 0x73, 0x6c, -0x38, 0x66, 0x6f, 0x46, 0x59, 0x69, 0x43, 0x36, 0x63, 0x52, 0x41, -0x54, 0x6e, 0x46, 0x76, 0x53, 0x6f, 0x41, 0x50, 0x48, 0x7a, 0x4d, -0x68, 0x45, 0x6a, 0x56, 0x34, 0x56, 0x6c, 0x30, 0x47, 0x77, 0x64, -0x0a, 0x4b, 0x62, 0x68, 0x4b, 0x36, 0x79, 0x4c, 0x2f, 0x45, 0x54, -0x43, 0x53, 0x65, 0x72, 0x46, 0x4c, 0x47, 0x58, 0x48, 0x45, 0x75, -0x2f, 0x68, 0x31, 0x71, 0x6c, 0x54, 0x6e, 0x36, 0x54, 0x48, 0x36, -0x72, 0x62, 0x47, 0x32, 0x6a, 0x4b, 0x36, 0x2b, 0x73, 0x33, 0x2b, -0x61, 0x69, 0x77, 0x30, 0x36, 0x37, 0x79, 0x32, 0x32, 0x37, 0x4a, -0x30, 0x2b, 0x66, 0x54, 0x71, 0x35, 0x64, 0x76, 0x41, 0x38, 0x0a, -0x5a, 0x45, 0x75, 0x6f, 0x53, 0x46, 0x69, 0x4a, 0x57, 0x69, 0x67, -0x32, 0x68, 0x6e, 0x58, 0x6a, 0x63, 0x4c, 0x50, 0x55, 0x57, 0x76, -0x38, 0x75, 0x35, 0x63, 0x5a, 0x63, 0x2f, 0x61, 0x6a, 0x50, 0x49, -0x31, 0x36, 0x69, 0x6c, 0x69, 0x41, 0x59, 0x78, 0x44, 0x35, 0x75, -0x4c, 0x65, 0x48, 0x4c, 0x52, 0x7a, 0x70, 0x6e, 0x42, 0x4e, 0x4b, -0x7a, 0x76, 0x6a, 0x67, 0x54, 0x38, 0x59, 0x67, 0x4f, 0x0a, 0x58, -0x42, 0x6a, 0x56, 0x49, 0x74, 0x65, 0x4e, 0x46, 0x44, 0x36, 0x6e, -0x7a, 0x79, 0x42, 0x69, 0x4b, 0x42, 0x38, 0x78, 0x59, 0x70, 0x69, -0x4d, 0x34, 0x37, 0x44, 0x63, 0x52, 0x2b, 0x36, 0x41, 0x64, 0x71, -0x4d, 0x6a, 0x45, 0x62, 0x72, 0x6a, 0x68, 0x36, 0x79, 0x46, 0x32, -0x79, 0x58, 0x6f, 0x6d, 0x6b, 0x34, 0x6a, 0x43, 0x2b, 0x66, 0x69, -0x55, 0x61, 0x41, 0x64, 0x68, 0x2f, 0x48, 0x70, 0x0a, 0x45, 0x35, -0x38, 0x64, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, -0x20, 0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, -0x45, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a - #endif -#else -// PROD -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, -0x43, 0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x44, 0x37, -0x7a, 0x43, 0x43, 0x41, 0x74, 0x65, 0x67, 0x41, 0x77, 0x49, 0x42, -0x41, 0x67, 0x49, 0x42, 0x41, 0x6a, 0x41, 0x4e, 0x42, 0x67, 0x6b, -0x71, 0x68, 0x6b, 0x69, 0x47, 0x39, 0x77, 0x30, 0x42, 0x41, 0x51, -0x73, 0x46, 0x41, 0x44, 0x43, 0x42, 0x6b, 0x7a, 0x45, 0x4c, 0x4d, -0x41, 0x6b, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x68, 0x4d, 0x43, -0x56, 0x56, 0x4d, 0x78, 0x0a, 0x45, 0x7a, 0x41, 0x52, 0x42, 0x67, -0x4e, 0x56, 0x42, 0x41, 0x67, 0x54, 0x43, 0x6b, 0x4e, 0x68, 0x62, -0x47, 0x6c, 0x6d, 0x62, 0x33, 0x4a, 0x75, 0x61, 0x57, 0x45, 0x78, -0x46, 0x6a, 0x41, 0x55, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x63, -0x54, 0x44, 0x55, 0x31, 0x76, 0x64, 0x57, 0x35, 0x30, 0x59, 0x57, -0x6c, 0x75, 0x49, 0x46, 0x5a, 0x70, 0x5a, 0x58, 0x63, 0x78, 0x46, -0x44, 0x41, 0x53, 0x0a, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, 0x6f, -0x54, 0x43, 0x32, 0x6c, 0x48, 0x64, 0x32, 0x46, 0x79, 0x5a, 0x53, -0x42, 0x4a, 0x62, 0x6d, 0x4d, 0x75, 0x4d, 0x53, 0x4d, 0x77, 0x49, -0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x4a, -0x62, 0x6e, 0x52, 0x6c, 0x63, 0x69, 0x31, 0x54, 0x5a, 0x58, 0x4a, -0x32, 0x5a, 0x58, 0x49, 0x67, 0x51, 0x32, 0x39, 0x74, 0x62, 0x58, -0x56, 0x75, 0x0a, 0x61, 0x57, 0x4e, 0x68, 0x64, 0x47, 0x6c, 0x76, -0x62, 0x6a, 0x45, 0x63, 0x4d, 0x42, 0x6f, 0x47, 0x41, 0x31, 0x55, -0x45, 0x41, 0x78, 0x4d, 0x54, 0x53, 0x57, 0x35, 0x30, 0x5a, 0x58, -0x49, 0x74, 0x55, 0x32, 0x56, 0x79, 0x64, 0x6d, 0x56, 0x79, 0x49, -0x46, 0x4e, 0x31, 0x59, 0x69, 0x42, 0x44, 0x51, 0x54, 0x41, 0x65, -0x46, 0x77, 0x30, 0x78, 0x4d, 0x44, 0x45, 0x77, 0x4d, 0x54, 0x45, -0x79, 0x0a, 0x4d, 0x7a, 0x41, 0x79, 0x4d, 0x7a, 0x6c, 0x61, 0x46, -0x77, 0x30, 0x7a, 0x4e, 0x6a, 0x41, 0x78, 0x4d, 0x54, 0x55, 0x79, -0x4d, 0x7a, 0x41, 0x79, 0x4d, 0x7a, 0x6c, 0x61, 0x4d, 0x49, 0x47, -0x4d, 0x4d, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, 0x44, 0x56, 0x51, -0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, 0x55, 0x7a, 0x45, 0x54, 0x4d, -0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x42, 0x4d, 0x4b, -0x0a, 0x51, 0x32, 0x46, 0x73, 0x61, 0x57, 0x5a, 0x76, 0x63, 0x6d, -0x35, 0x70, 0x59, 0x54, 0x45, 0x57, 0x4d, 0x42, 0x51, 0x47, 0x41, -0x31, 0x55, 0x45, 0x42, 0x78, 0x4d, 0x4e, 0x54, 0x57, 0x39, 0x31, -0x62, 0x6e, 0x52, 0x68, 0x61, 0x57, 0x34, 0x67, 0x56, 0x6d, 0x6c, -0x6c, 0x64, 0x7a, 0x45, 0x55, 0x4d, 0x42, 0x49, 0x47, 0x41, 0x31, -0x55, 0x45, 0x43, 0x68, 0x4d, 0x4c, 0x61, 0x55, 0x64, 0x33, 0x0a, -0x59, 0x58, 0x4a, 0x6c, 0x49, 0x45, 0x6c, 0x75, 0x59, 0x79, 0x34, -0x78, 0x48, 0x54, 0x41, 0x62, 0x42, 0x67, 0x4e, 0x56, 0x42, 0x41, -0x73, 0x54, 0x46, 0x45, 0x46, 0x6e, 0x5a, 0x57, 0x35, 0x30, 0x49, -0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x6c, 0x62, 0x6e, 0x52, 0x70, -0x59, 0x32, 0x46, 0x30, 0x61, 0x57, 0x39, 0x75, 0x4d, 0x52, 0x73, -0x77, 0x47, 0x51, 0x59, 0x44, 0x56, 0x51, 0x51, 0x44, 0x0a, 0x46, -0x42, 0x4a, 0x4f, 0x61, 0x57, 0x35, 0x30, 0x5a, 0x57, 0x35, 0x6b, -0x62, 0x31, 0x39, 0x46, 0x51, 0x30, 0x6c, 0x66, 0x59, 0x57, 0x64, -0x6c, 0x62, 0x6e, 0x51, 0x77, 0x67, 0x5a, 0x38, 0x77, 0x44, 0x51, -0x59, 0x4a, 0x4b, 0x6f, 0x5a, 0x49, 0x68, 0x76, 0x63, 0x4e, 0x41, -0x51, 0x45, 0x42, 0x42, 0x51, 0x41, 0x44, 0x67, 0x59, 0x30, 0x41, -0x4d, 0x49, 0x47, 0x4a, 0x41, 0x6f, 0x47, 0x42, 0x0a, 0x41, 0x4e, -0x4d, 0x39, 0x53, 0x6b, 0x31, 0x69, 0x47, 0x79, 0x6c, 0x79, 0x7a, -0x6e, 0x58, 0x37, 0x78, 0x7a, 0x59, 0x48, 0x46, 0x53, 0x61, 0x4f, -0x31, 0x67, 0x72, 0x43, 0x52, 0x2f, 0x36, 0x58, 0x46, 0x36, 0x58, -0x6a, 0x45, 0x79, 0x51, 0x67, 0x2b, 0x4f, 0x5a, 0x79, 0x72, 0x47, -0x4d, 0x57, 0x57, 0x57, 0x70, 0x56, 0x4c, 0x37, 0x65, 0x72, 0x72, -0x48, 0x66, 0x6d, 0x6c, 0x4d, 0x67, 0x64, 0x0a, 0x55, 0x6f, 0x61, -0x44, 0x4c, 0x72, 0x59, 0x71, 0x66, 0x46, 0x77, 0x30, 0x56, 0x39, -0x38, 0x7a, 0x6b, 0x55, 0x75, 0x45, 0x68, 0x51, 0x71, 0x79, 0x64, -0x51, 0x77, 0x62, 0x74, 0x31, 0x31, 0x44, 0x39, 0x57, 0x55, 0x4f, -0x32, 0x6a, 0x57, 0x6d, 0x30, 0x52, 0x55, 0x6e, 0x51, 0x43, 0x78, -0x2f, 0x36, 0x52, 0x6c, 0x54, 0x74, 0x75, 0x36, 0x58, 0x74, 0x57, -0x2f, 0x44, 0x7a, 0x6e, 0x52, 0x77, 0x0a, 0x38, 0x4d, 0x64, 0x74, -0x62, 0x4d, 0x6d, 0x6f, 0x70, 0x59, 0x5a, 0x76, 0x33, 0x6d, 0x33, -0x74, 0x65, 0x6c, 0x59, 0x4e, 0x72, 0x6f, 0x34, 0x5a, 0x75, 0x4b, -0x6c, 0x75, 0x52, 0x78, 0x58, 0x4f, 0x4f, 0x76, 0x6f, 0x69, 0x4a, -0x45, 0x6b, 0x32, 0x41, 0x2f, 0x38, 0x31, 0x41, 0x67, 0x4d, 0x42, -0x41, 0x41, 0x47, 0x6a, 0x67, 0x64, 0x59, 0x77, 0x67, 0x64, 0x4d, -0x77, 0x48, 0x51, 0x59, 0x44, 0x0a, 0x56, 0x52, 0x30, 0x4f, 0x42, -0x42, 0x59, 0x45, 0x46, 0x4f, 0x39, 0x63, 0x5a, 0x78, 0x45, 0x6e, -0x48, 0x4a, 0x4c, 0x53, 0x41, 0x35, 0x5a, 0x37, 0x67, 0x58, 0x4e, -0x49, 0x58, 0x73, 0x36, 0x69, 0x4e, 0x42, 0x4a, 0x2b, 0x4d, 0x49, -0x47, 0x78, 0x42, 0x67, 0x4e, 0x56, 0x48, 0x53, 0x4d, 0x45, 0x67, -0x61, 0x6b, 0x77, 0x67, 0x61, 0x61, 0x41, 0x46, 0x4a, 0x35, 0x62, -0x31, 0x57, 0x6a, 0x6c, 0x0a, 0x42, 0x65, 0x53, 0x33, 0x73, 0x75, -0x76, 0x72, 0x4e, 0x6a, 0x41, 0x37, 0x41, 0x61, 0x74, 0x31, 0x6a, -0x76, 0x64, 0x53, 0x6f, 0x59, 0x47, 0x4b, 0x70, 0x49, 0x47, 0x48, -0x4d, 0x49, 0x47, 0x45, 0x4d, 0x51, 0x73, 0x77, 0x43, 0x51, 0x59, -0x44, 0x56, 0x51, 0x51, 0x47, 0x45, 0x77, 0x4a, 0x56, 0x55, 0x7a, -0x45, 0x54, 0x4d, 0x42, 0x45, 0x47, 0x41, 0x31, 0x55, 0x45, 0x43, -0x42, 0x4d, 0x4b, 0x0a, 0x51, 0x32, 0x46, 0x73, 0x61, 0x57, 0x5a, -0x76, 0x63, 0x6d, 0x35, 0x70, 0x59, 0x54, 0x45, 0x57, 0x4d, 0x42, -0x51, 0x47, 0x41, 0x31, 0x55, 0x45, 0x42, 0x78, 0x4d, 0x4e, 0x54, -0x57, 0x39, 0x31, 0x62, 0x6e, 0x52, 0x68, 0x61, 0x57, 0x34, 0x67, -0x56, 0x6d, 0x6c, 0x6c, 0x64, 0x7a, 0x45, 0x55, 0x4d, 0x42, 0x49, -0x47, 0x41, 0x31, 0x55, 0x45, 0x43, 0x68, 0x4d, 0x4c, 0x61, 0x55, -0x64, 0x33, 0x0a, 0x59, 0x58, 0x4a, 0x6c, 0x49, 0x45, 0x6c, 0x75, -0x59, 0x79, 0x34, 0x78, 0x48, 0x6a, 0x41, 0x63, 0x42, 0x67, 0x4e, -0x56, 0x42, 0x41, 0x73, 0x54, 0x46, 0x55, 0x4e, 0x6c, 0x63, 0x6e, -0x52, 0x70, 0x5a, 0x6d, 0x6c, 0x6a, 0x59, 0x58, 0x52, 0x6c, 0x49, -0x45, 0x46, 0x31, 0x64, 0x47, 0x68, 0x76, 0x63, 0x6d, 0x6c, 0x30, -0x65, 0x54, 0x45, 0x53, 0x4d, 0x42, 0x41, 0x47, 0x41, 0x31, 0x55, -0x45, 0x0a, 0x41, 0x78, 0x4d, 0x4a, 0x61, 0x55, 0x64, 0x33, 0x59, -0x58, 0x4a, 0x6c, 0x49, 0x45, 0x4e, 0x42, 0x67, 0x67, 0x45, 0x4e, -0x4d, 0x41, 0x30, 0x47, 0x43, 0x53, 0x71, 0x47, 0x53, 0x49, 0x62, -0x33, 0x44, 0x51, 0x45, 0x42, 0x43, 0x77, 0x55, 0x41, 0x41, 0x34, -0x49, 0x42, 0x41, 0x51, 0x42, 0x6b, 0x58, 0x50, 0x70, 0x44, 0x58, -0x55, 0x38, 0x57, 0x36, 0x51, 0x66, 0x52, 0x39, 0x78, 0x4b, 0x63, -0x0a, 0x63, 0x77, 0x63, 0x5a, 0x4b, 0x58, 0x2b, 0x6d, 0x41, 0x4f, -0x49, 0x43, 0x2f, 0x6e, 0x4f, 0x69, 0x5a, 0x43, 0x37, 0x36, 0x55, -0x4e, 0x36, 0x6d, 0x53, 0x55, 0x5a, 0x36, 0x64, 0x79, 0x72, 0x7a, -0x55, 0x55, 0x63, 0x72, 0x34, 0x2f, 0x5a, 0x68, 0x65, 0x52, 0x68, -0x62, 0x76, 0x58, 0x6b, 0x30, 0x6d, 0x6c, 0x41, 0x64, 0x37, 0x2f, -0x38, 0x55, 0x51, 0x36, 0x68, 0x6d, 0x72, 0x48, 0x57, 0x37, 0x0a, -0x61, 0x44, 0x4d, 0x59, 0x30, 0x68, 0x4b, 0x67, 0x38, 0x48, 0x62, -0x2b, 0x44, 0x45, 0x42, 0x75, 0x6d, 0x4f, 0x31, 0x71, 0x7a, 0x4d, -0x59, 0x53, 0x5a, 0x7a, 0x2b, 0x78, 0x34, 0x67, 0x2f, 0x2b, 0x4f, -0x37, 0x4f, 0x5a, 0x74, 0x6a, 0x47, 0x62, 0x64, 0x62, 0x34, 0x65, -0x58, 0x71, 0x51, 0x33, 0x45, 0x58, 0x78, 0x34, 0x35, 0x75, 0x33, -0x33, 0x42, 0x6f, 0x6f, 0x52, 0x61, 0x65, 0x63, 0x49, 0x0a, 0x32, -0x4b, 0x74, 0x70, 0x30, 0x64, 0x78, 0x79, 0x45, 0x4f, 0x70, 0x4c, -0x2f, 0x39, 0x39, 0x68, 0x43, 0x66, 0x7a, 0x61, 0x6b, 0x72, 0x4c, -0x61, 0x5a, 0x2b, 0x47, 0x6e, 0x57, 0x63, 0x65, 0x77, 0x79, 0x74, -0x43, 0x30, 0x74, 0x75, 0x69, 0x4b, 0x33, 0x4a, 0x39, 0x6c, 0x47, -0x61, 0x30, 0x69, 0x45, 0x4c, 0x65, 0x71, 0x75, 0x70, 0x4b, 0x53, -0x79, 0x73, 0x78, 0x50, 0x63, 0x6b, 0x48, 0x64, 0x0a, 0x58, 0x56, -0x4b, 0x36, 0x38, 0x53, 0x37, 0x2b, 0x31, 0x4d, 0x57, 0x6d, 0x66, -0x56, 0x43, 0x41, 0x46, 0x4c, 0x56, 0x34, 0x63, 0x32, 0x58, 0x2b, -0x69, 0x57, 0x55, 0x46, 0x4a, 0x58, 0x72, 0x4e, 0x38, 0x53, 0x32, -0x4c, 0x43, 0x79, 0x68, 0x74, 0x6e, 0x41, 0x72, 0x4e, 0x34, 0x61, -0x45, 0x43, 0x31, 0x30, 0x55, 0x58, 0x59, 0x73, 0x32, 0x6d, 0x75, -0x30, 0x76, 0x32, 0x64, 0x47, 0x6c, 0x68, 0x0a, 0x76, 0x75, 0x65, -0x6e, 0x42, 0x70, 0x7a, 0x36, 0x44, 0x42, 0x38, 0x79, 0x7a, 0x4b, -0x66, 0x41, 0x75, 0x64, 0x6c, 0x69, 0x65, 0x69, 0x35, 0x73, 0x56, -0x4e, 0x35, 0x4b, 0x38, 0x70, 0x32, 0x77, 0x63, 0x58, 0x38, 0x66, -0x75, 0x43, 0x76, 0x63, 0x41, 0x56, 0x6d, 0x45, 0x41, 0x4d, 0x6d, -0x72, 0x6a, 0x68, 0x46, 0x53, 0x74, 0x59, 0x4d, 0x6d, 0x48, 0x2f, -0x71, 0x46, 0x78, 0x48, 0x7a, 0x7a, 0x0a, 0x70, 0x59, 0x32, 0x57, -0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x43, -0x45, 0x52, 0x54, 0x49, 0x46, 0x49, 0x43, 0x41, 0x54, 0x45, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x0a -#endif -}; - -// DEV6接続用秘密鍵 -u8 USER_ORIGIN_PRIVATE_KEY[] = -{ -#ifndef BUILD_FOR_PROD_BGS - #ifndef BUILD_FOR_TEST_BGS - // DEV6 -0x30, 0x82, 0x02, 0x5e, 0x02, 0x01, 0x00, 0x02, 0x81, 0x81, 0x00, -0xee, 0x37, 0xef, 0xbb, 0x29, 0x54, 0x42, 0x3b, 0x21, 0x08, 0xe3, -0x77, 0x82, 0x12, 0x85, 0xc7, 0x3b, 0x58, 0x6f, 0x72, 0x6f, 0x3f, -0x11, 0x13, 0x49, 0x40, 0xac, 0xe2, 0x26, 0x71, 0xf2, 0xd2, 0xa4, -0xa6, 0x92, 0xfb, 0xcb, 0xc9, 0x6c, 0x45, 0xe4, 0xff, 0xbe, 0xd6, -0x65, 0xd9, 0x71, 0x7a, 0x21, 0x4b, 0x12, 0xf5, 0xa1, 0x11, 0xe0, -0x32, 0xd9, 0x42, 0x92, 0x39, 0x47, 0x36, 0x1a, 0x83, 0xc3, 0x62, -0xd5, 0xda, 0x7d, 0xc0, 0x10, 0xbd, 0x75, 0x43, 0x42, 0x04, 0x49, -0x72, 0x52, 0xaa, 0xc1, 0x72, 0x63, 0xbc, 0x16, 0x77, 0x76, 0x72, -0x86, 0x55, 0xac, 0x9a, 0x68, 0x15, 0x58, 0x51, 0xaf, 0xb2, 0xa0, -0xc8, 0x1b, 0xd1, 0x18, 0xad, 0x49, 0x6d, 0x16, 0x19, 0xa1, 0xfb, -0xee, 0x7c, 0x4c, 0x74, 0x7e, 0xc7, 0xfa, 0x08, 0x23, 0x80, 0xb9, -0xef, 0x2f, 0x6f, 0x3d, 0xaf, 0x96, 0xd1, 0x02, 0x03, 0x01, 0x00, -0x01, 0x02, 0x81, 0x81, 0x00, 0x98, 0x91, 0x00, 0x9b, 0x98, 0xd3, -0x9a, 0xfb, 0x6d, 0xa3, 0xd8, 0xb2, 0xf0, 0x7e, 0x56, 0x69, 0x8c, -0x0b, 0x8e, 0x8c, 0xf6, 0xcc, 0xa8, 0x6d, 0xf6, 0xab, 0x52, 0x4e, -0x20, 0x9b, 0x38, 0x0e, 0x4a, 0x5f, 0x58, 0xa1, 0xa5, 0x19, 0xa2, -0x9b, 0x7d, 0x17, 0x82, 0x2c, 0xa3, 0xdc, 0x48, 0x7e, 0x14, 0x96, -0x95, 0x54, 0xf5, 0x4c, 0x92, 0x8f, 0x5e, 0x6f, 0xf1, 0x60, 0x77, -0xc8, 0x21, 0xdf, 0xe7, 0x45, 0x3c, 0x22, 0x22, 0xc7, 0xf8, 0x59, -0x88, 0x63, 0xf8, 0x46, 0xf8, 0xe4, 0x69, 0xa0, 0xa8, 0x36, 0xeb, -0x29, 0xbe, 0x39, 0x89, 0x57, 0x7d, 0x72, 0x6d, 0xd6, 0x42, 0x48, -0xde, 0x5a, 0xd5, 0xb8, 0xaa, 0x4e, 0xe0, 0xad, 0x25, 0x7e, 0xdd, -0xef, 0x5d, 0xad, 0xa5, 0x2c, 0x2f, 0xd8, 0x07, 0x85, 0x38, 0x82, -0x5b, 0xf6, 0xf1, 0xf2, 0xbe, 0x75, 0xc6, 0xcd, 0xdf, 0xf5, 0x07, -0x31, 0x02, 0x41, 0x00, 0xfa, 0xfc, 0x8f, 0xfb, 0x7a, 0x98, 0x88, -0x61, 0x90, 0x68, 0xda, 0x12, 0x09, 0x8f, 0xd3, 0x62, 0x56, 0x95, -0xc6, 0xc0, 0xd2, 0x50, 0xd5, 0x6d, 0xc6, 0x51, 0x9f, 0x1e, 0x5b, -0x10, 0x19, 0x07, 0xeb, 0x3c, 0xd8, 0xdc, 0xfc, 0x93, 0xbd, 0xd3, -0x6c, 0x02, 0x48, 0x79, 0xd5, 0xc7, 0xd7, 0x0e, 0xd4, 0x86, 0x5f, -0x8d, 0x33, 0xe1, 0x27, 0x12, 0xeb, 0x38, 0xe0, 0x1e, 0xff, 0xfb, -0x3d, 0xbd, 0x02, 0x41, 0x00, 0xf2, 0xfa, 0x15, 0x66, 0x1b, 0xf5, -0x84, 0xcc, 0xd2, 0x4b, 0xe3, 0x96, 0xbb, 0x0a, 0xf0, 0x03, 0x61, -0xcb, 0x7f, 0x25, 0x80, 0x22, 0x69, 0x37, 0x99, 0x9c, 0x23, 0xba, -0xe8, 0x76, 0x1b, 0xb6, 0xac, 0x6d, 0x24, 0xf3, 0xa2, 0xf4, 0xfb, -0x31, 0x16, 0x1b, 0x82, 0xaa, 0x5c, 0xc1, 0x2b, 0xca, 0x98, 0x24, -0xf7, 0x27, 0x92, 0x2c, 0x63, 0xf3, 0xac, 0xe8, 0x4d, 0x92, 0x3a, -0xb2, 0xbc, 0xa5, 0x02, 0x41, 0x00, 0x94, 0x16, 0x28, 0xad, 0xec, -0x6b, 0xcb, 0x2c, 0x25, 0x94, 0x77, 0xf6, 0x64, 0x85, 0xe3, 0xe7, -0x05, 0xc7, 0x61, 0x79, 0xab, 0x9d, 0xde, 0x0f, 0xe3, 0x0f, 0x8d, -0x9e, 0xcf, 0x83, 0xf4, 0x00, 0xe4, 0x1f, 0x06, 0xa5, 0x7c, 0xb1, -0x7f, 0x33, 0x1b, 0x6b, 0x4d, 0x6f, 0xf5, 0x5e, 0xef, 0xd8, 0xe4, -0x34, 0x54, 0x74, 0x6f, 0xc3, 0xcc, 0xd6, 0x30, 0xcb, 0x62, 0x11, -0x68, 0x5f, 0xc8, 0xd1, 0x02, 0x41, 0x00, 0xac, 0x46, 0x7a, 0xd3, -0xaa, 0x31, 0x3b, 0x56, 0x8a, 0x28, 0xba, 0x96, 0x4d, 0xca, 0x24, -0x81, 0x11, 0x5e, 0xda, 0xa8, 0xb9, 0x20, 0x2c, 0xdf, 0xfa, 0x2f, -0x05, 0xfa, 0x69, 0x06, 0x0d, 0x02, 0x49, 0x61, 0x1d, 0x99, 0x0d, -0x4a, 0x8b, 0xab, 0xb3, 0x14, 0x10, 0x62, 0x40, 0x5f, 0xca, 0x6f, -0xdb, 0xce, 0x21, 0xdb, 0x51, 0xbd, 0xdd, 0xa4, 0x91, 0x4d, 0x28, -0x6a, 0xec, 0xe9, 0x7b, 0xed, 0x02, 0x40, 0x62, 0xdb, 0x1b, 0x6a, -0x32, 0x30, 0x7b, 0xe8, 0xcf, 0xe7, 0xf8, 0x31, 0xab, 0x54, 0x57, -0x84, 0x27, 0x93, 0xcd, 0x02, 0xf5, 0x89, 0x61, 0xb6, 0x35, 0x87, -0x76, 0xb1, 0xa4, 0x11, 0x25, 0x4b, 0x4c, 0x5a, 0xc8, 0xae, 0x51, -0x94, 0x16, 0xec, 0x75, 0x7f, 0x77, 0xea, 0xad, 0x4d, 0xb9, 0x0b, -0x77, 0xc3, 0x18, 0xd7, 0xc7, 0x3a, 0xc8, 0x66, 0x6b, 0x3c, 0x61, -0xde, 0x23, 0xd8, 0xf0, 0x91 - #else - // TEST -0x42, 0x61, 0x67, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, -0x74, 0x65, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x72, 0x69, -0x65, 0x6e, 0x64, 0x6c, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x3a, 0x20, -0x65, 0x63, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x0a, 0x20, 0x20, 0x20, -0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x4b, 0x65, 0x79, 0x49, 0x44, -0x3a, 0x20, 0x46, 0x44, 0x20, 0x38, 0x41, 0x20, 0x39, 0x31, 0x20, -0x32, 0x41, 0x20, 0x43, 0x46, 0x20, 0x43, 0x41, 0x20, 0x36, 0x33, -0x20, 0x44, 0x45, 0x20, 0x31, 0x32, 0x20, 0x42, 0x32, 0x20, 0x31, -0x31, 0x20, 0x32, 0x35, 0x20, 0x46, 0x46, 0x20, 0x39, 0x31, 0x20, -0x38, 0x44, 0x20, 0x42, 0x34, 0x20, 0x35, 0x39, 0x20, 0x42, 0x35, -0x20, 0x42, 0x45, 0x20, 0x43, 0x34, 0x20, 0x0a, 0x4b, 0x65, 0x79, -0x20, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, -0x3a, 0x20, 0x3c, 0x4e, 0x6f, 0x20, 0x41, 0x74, 0x74, 0x72, 0x69, -0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, -0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, 0x52, 0x53, 0x41, 0x20, -0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, 0x59, -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, 0x49, 0x49, 0x43, 0x58, -0x67, 0x49, 0x42, 0x41, 0x41, 0x4b, 0x42, 0x67, 0x51, 0x44, 0x75, -0x4e, 0x2b, 0x2b, 0x37, 0x4b, 0x56, 0x52, 0x43, 0x4f, 0x79, 0x45, -0x49, 0x34, 0x33, 0x65, 0x43, 0x45, 0x6f, 0x58, 0x48, 0x4f, 0x31, -0x68, 0x76, 0x63, 0x6d, 0x38, 0x2f, 0x45, 0x52, 0x4e, 0x4a, 0x51, -0x4b, 0x7a, 0x69, 0x4a, 0x6e, 0x48, 0x79, 0x30, 0x71, 0x53, 0x6d, -0x6b, 0x76, 0x76, 0x4c, 0x0a, 0x79, 0x57, 0x78, 0x46, 0x35, 0x50, -0x2b, 0x2b, 0x31, 0x6d, 0x58, 0x5a, 0x63, 0x58, 0x6f, 0x68, 0x53, -0x78, 0x4c, 0x31, 0x6f, 0x52, 0x48, 0x67, 0x4d, 0x74, 0x6c, 0x43, -0x6b, 0x6a, 0x6c, 0x48, 0x4e, 0x68, 0x71, 0x44, 0x77, 0x32, 0x4c, -0x56, 0x32, 0x6e, 0x33, 0x41, 0x45, 0x4c, 0x31, 0x31, 0x51, 0x30, -0x49, 0x45, 0x53, 0x58, 0x4a, 0x53, 0x71, 0x73, 0x46, 0x79, 0x59, -0x37, 0x77, 0x57, 0x0a, 0x64, 0x33, 0x5a, 0x79, 0x68, 0x6c, 0x57, -0x73, 0x6d, 0x6d, 0x67, 0x56, 0x57, 0x46, 0x47, 0x76, 0x73, 0x71, -0x44, 0x49, 0x47, 0x39, 0x45, 0x59, 0x72, 0x55, 0x6c, 0x74, 0x46, -0x68, 0x6d, 0x68, 0x2b, 0x2b, 0x35, 0x38, 0x54, 0x48, 0x52, 0x2b, -0x78, 0x2f, 0x6f, 0x49, 0x49, 0x34, 0x43, 0x35, 0x37, 0x79, 0x39, -0x76, 0x50, 0x61, 0x2b, 0x57, 0x30, 0x51, 0x49, 0x44, 0x41, 0x51, -0x41, 0x42, 0x0a, 0x41, 0x6f, 0x47, 0x42, 0x41, 0x4a, 0x69, 0x52, -0x41, 0x4a, 0x75, 0x59, 0x30, 0x35, 0x72, 0x37, 0x62, 0x61, 0x50, -0x59, 0x73, 0x76, 0x42, 0x2b, 0x56, 0x6d, 0x6d, 0x4d, 0x43, 0x34, -0x36, 0x4d, 0x39, 0x73, 0x79, 0x6f, 0x62, 0x66, 0x61, 0x72, 0x55, -0x6b, 0x34, 0x67, 0x6d, 0x7a, 0x67, 0x4f, 0x53, 0x6c, 0x39, 0x59, -0x6f, 0x61, 0x55, 0x5a, 0x6f, 0x70, 0x74, 0x39, 0x46, 0x34, 0x49, -0x73, 0x0a, 0x6f, 0x39, 0x78, 0x49, 0x66, 0x68, 0x53, 0x57, 0x6c, -0x56, 0x54, 0x31, 0x54, 0x4a, 0x4b, 0x50, 0x58, 0x6d, 0x2f, 0x78, -0x59, 0x48, 0x66, 0x49, 0x49, 0x64, 0x2f, 0x6e, 0x52, 0x54, 0x77, -0x69, 0x49, 0x73, 0x66, 0x34, 0x57, 0x59, 0x68, 0x6a, 0x2b, 0x45, -0x62, 0x34, 0x35, 0x47, 0x6d, 0x67, 0x71, 0x44, 0x62, 0x72, 0x4b, -0x62, 0x34, 0x35, 0x69, 0x56, 0x64, 0x39, 0x63, 0x6d, 0x33, 0x57, -0x0a, 0x51, 0x6b, 0x6a, 0x65, 0x57, 0x74, 0x57, 0x34, 0x71, 0x6b, -0x37, 0x67, 0x72, 0x53, 0x56, 0x2b, 0x33, 0x65, 0x39, 0x64, 0x72, -0x61, 0x55, 0x73, 0x4c, 0x39, 0x67, 0x48, 0x68, 0x54, 0x69, 0x43, -0x57, 0x2f, 0x62, 0x78, 0x38, 0x72, 0x35, 0x31, 0x78, 0x73, 0x33, -0x66, 0x39, 0x51, 0x63, 0x78, 0x41, 0x6b, 0x45, 0x41, 0x2b, 0x76, -0x79, 0x50, 0x2b, 0x33, 0x71, 0x59, 0x69, 0x47, 0x47, 0x51, 0x0a, -0x61, 0x4e, 0x6f, 0x53, 0x43, 0x59, 0x2f, 0x54, 0x59, 0x6c, 0x61, -0x56, 0x78, 0x73, 0x44, 0x53, 0x55, 0x4e, 0x56, 0x74, 0x78, 0x6c, -0x47, 0x66, 0x48, 0x6c, 0x73, 0x51, 0x47, 0x51, 0x66, 0x72, 0x50, -0x4e, 0x6a, 0x63, 0x2f, 0x4a, 0x4f, 0x39, 0x30, 0x32, 0x77, 0x43, -0x53, 0x48, 0x6e, 0x56, 0x78, 0x39, 0x63, 0x4f, 0x31, 0x49, 0x5a, -0x66, 0x6a, 0x54, 0x50, 0x68, 0x4a, 0x78, 0x4c, 0x72, 0x0a, 0x4f, -0x4f, 0x41, 0x65, 0x2f, 0x2f, 0x73, 0x39, 0x76, 0x51, 0x4a, 0x42, -0x41, 0x50, 0x4c, 0x36, 0x46, 0x57, 0x59, 0x62, 0x39, 0x59, 0x54, -0x4d, 0x30, 0x6b, 0x76, 0x6a, 0x6c, 0x72, 0x73, 0x4b, 0x38, 0x41, -0x4e, 0x68, 0x79, 0x33, 0x38, 0x6c, 0x67, 0x43, 0x4a, 0x70, 0x4e, -0x35, 0x6d, 0x63, 0x49, 0x37, 0x72, 0x6f, 0x64, 0x68, 0x75, 0x32, -0x72, 0x47, 0x30, 0x6b, 0x38, 0x36, 0x4c, 0x30, 0x0a, 0x2b, 0x7a, -0x45, 0x57, 0x47, 0x34, 0x4b, 0x71, 0x58, 0x4d, 0x45, 0x72, 0x79, -0x70, 0x67, 0x6b, 0x39, 0x79, 0x65, 0x53, 0x4c, 0x47, 0x50, 0x7a, -0x72, 0x4f, 0x68, 0x4e, 0x6b, 0x6a, 0x71, 0x79, 0x76, 0x4b, 0x55, -0x43, 0x51, 0x51, 0x43, 0x55, 0x46, 0x69, 0x69, 0x74, 0x37, 0x47, -0x76, 0x4c, 0x4c, 0x43, 0x57, 0x55, 0x64, 0x2f, 0x5a, 0x6b, 0x68, -0x65, 0x50, 0x6e, 0x42, 0x63, 0x64, 0x68, 0x0a, 0x65, 0x61, 0x75, -0x64, 0x33, 0x67, 0x2f, 0x6a, 0x44, 0x34, 0x32, 0x65, 0x7a, 0x34, -0x50, 0x30, 0x41, 0x4f, 0x51, 0x66, 0x42, 0x71, 0x56, 0x38, 0x73, -0x58, 0x38, 0x7a, 0x47, 0x32, 0x74, 0x4e, 0x62, 0x2f, 0x56, 0x65, -0x37, 0x39, 0x6a, 0x6b, 0x4e, 0x46, 0x52, 0x30, 0x62, 0x38, 0x50, -0x4d, 0x31, 0x6a, 0x44, 0x4c, 0x59, 0x68, 0x46, 0x6f, 0x58, 0x38, -0x6a, 0x52, 0x41, 0x6b, 0x45, 0x41, 0x0a, 0x72, 0x45, 0x5a, 0x36, -0x30, 0x36, 0x6f, 0x78, 0x4f, 0x31, 0x61, 0x4b, 0x4b, 0x4c, 0x71, -0x57, 0x54, 0x63, 0x6f, 0x6b, 0x67, 0x52, 0x46, 0x65, 0x32, 0x71, -0x69, 0x35, 0x49, 0x43, 0x7a, 0x66, 0x2b, 0x69, 0x38, 0x46, 0x2b, -0x6d, 0x6b, 0x47, 0x44, 0x51, 0x4a, 0x4a, 0x59, 0x52, 0x32, 0x5a, -0x44, 0x55, 0x71, 0x4c, 0x71, 0x37, 0x4d, 0x55, 0x45, 0x47, 0x4a, -0x41, 0x58, 0x38, 0x70, 0x76, 0x0a, 0x32, 0x38, 0x34, 0x68, 0x32, -0x31, 0x47, 0x39, 0x33, 0x61, 0x53, 0x52, 0x54, 0x53, 0x68, 0x71, -0x37, 0x4f, 0x6c, 0x37, 0x37, 0x51, 0x4a, 0x41, 0x59, 0x74, 0x73, -0x62, 0x61, 0x6a, 0x49, 0x77, 0x65, 0x2b, 0x6a, 0x50, 0x35, 0x2f, -0x67, 0x78, 0x71, 0x31, 0x52, 0x58, 0x68, 0x43, 0x65, 0x54, 0x7a, -0x51, 0x4c, 0x31, 0x69, 0x57, 0x47, 0x32, 0x4e, 0x59, 0x64, 0x32, -0x73, 0x61, 0x51, 0x52, 0x0a, 0x4a, 0x55, 0x74, 0x4d, 0x57, 0x73, -0x69, 0x75, 0x55, 0x5a, 0x51, 0x57, 0x37, 0x48, 0x56, 0x2f, 0x64, -0x2b, 0x71, 0x74, 0x54, 0x62, 0x6b, 0x4c, 0x64, 0x38, 0x4d, 0x59, -0x31, 0x38, 0x63, 0x36, 0x79, 0x47, 0x5a, 0x72, 0x50, 0x47, 0x48, -0x65, 0x49, 0x39, 0x6a, 0x77, 0x6b, 0x51, 0x3d, 0x3d, 0x0a, 0x2d, -0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, 0x20, 0x52, 0x53, 0x41, -0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x20, 0x4b, 0x45, -0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a - #endif -#else -// PROD -0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x42, 0x45, 0x47, 0x49, 0x4e, 0x20, -0x52, 0x53, 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, -0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a, 0x4d, -0x49, 0x49, 0x43, 0x58, 0x67, 0x49, 0x42, 0x41, 0x41, 0x4b, 0x42, -0x67, 0x51, 0x44, 0x54, 0x50, 0x55, 0x70, 0x4e, 0x59, 0x68, 0x73, -0x70, 0x63, 0x73, 0x35, 0x31, 0x2b, 0x38, 0x63, 0x32, 0x42, 0x78, -0x55, 0x6d, 0x6a, 0x74, 0x59, 0x4b, 0x77, 0x6b, 0x66, 0x2b, 0x6c, -0x78, 0x65, 0x6c, 0x34, 0x78, 0x4d, 0x6b, 0x49, 0x50, 0x6a, 0x6d, -0x63, 0x71, 0x78, 0x6a, 0x46, 0x6c, 0x6c, 0x71, 0x0a, 0x56, 0x53, -0x2b, 0x33, 0x71, 0x36, 0x78, 0x33, 0x35, 0x70, 0x54, 0x49, 0x48, -0x56, 0x4b, 0x47, 0x67, 0x79, 0x36, 0x32, 0x4b, 0x6e, 0x78, 0x63, -0x4e, 0x46, 0x66, 0x66, 0x4d, 0x35, 0x46, 0x4c, 0x68, 0x49, 0x55, -0x4b, 0x73, 0x6e, 0x55, 0x4d, 0x47, 0x37, 0x64, 0x64, 0x51, 0x2f, -0x56, 0x6c, 0x44, 0x74, 0x6f, 0x31, 0x70, 0x74, 0x45, 0x56, 0x4a, -0x30, 0x41, 0x73, 0x66, 0x2b, 0x6b, 0x5a, 0x0a, 0x55, 0x37, 0x62, -0x75, 0x6c, 0x37, 0x56, 0x76, 0x77, 0x38, 0x35, 0x30, 0x63, 0x50, -0x44, 0x48, 0x62, 0x57, 0x7a, 0x4a, 0x71, 0x4b, 0x57, 0x47, 0x62, -0x39, 0x35, 0x74, 0x37, 0x58, 0x70, 0x57, 0x44, 0x61, 0x36, 0x4f, -0x47, 0x62, 0x69, 0x70, 0x62, 0x6b, 0x63, 0x56, 0x7a, 0x6a, 0x72, -0x36, 0x49, 0x69, 0x52, 0x4a, 0x4e, 0x67, 0x50, 0x2f, 0x4e, 0x51, -0x49, 0x44, 0x41, 0x51, 0x41, 0x42, 0x0a, 0x41, 0x6f, 0x47, 0x42, -0x41, 0x4c, 0x32, 0x35, 0x65, 0x4c, 0x6a, 0x54, 0x2b, 0x71, 0x31, -0x5a, 0x6a, 0x68, 0x48, 0x74, 0x31, 0x31, 0x69, 0x78, 0x4e, 0x38, -0x2f, 0x76, 0x7a, 0x6c, 0x4c, 0x50, 0x65, 0x44, 0x59, 0x7a, 0x6f, -0x6d, 0x75, 0x39, 0x37, 0x58, 0x30, 0x76, 0x6d, 0x42, 0x33, 0x79, -0x74, 0x4e, 0x34, 0x79, 0x50, 0x70, 0x45, 0x41, 0x66, 0x65, 0x45, -0x72, 0x63, 0x62, 0x59, 0x6e, 0x0a, 0x42, 0x55, 0x35, 0x4f, 0x39, -0x38, 0x59, 0x55, 0x6f, 0x4b, 0x6e, 0x41, 0x73, 0x76, 0x31, 0x6c, -0x6a, 0x64, 0x37, 0x4d, 0x78, 0x42, 0x7a, 0x64, 0x6f, 0x31, 0x62, -0x37, 0x34, 0x51, 0x45, 0x4d, 0x66, 0x4f, 0x55, 0x33, 0x53, 0x74, -0x77, 0x45, 0x4e, 0x65, 0x56, 0x2b, 0x53, 0x7a, 0x51, 0x56, 0x67, -0x7a, 0x32, 0x38, 0x61, 0x6e, 0x4b, 0x64, 0x57, 0x70, 0x69, 0x31, -0x46, 0x6f, 0x65, 0x2b, 0x0a, 0x37, 0x50, 0x36, 0x63, 0x41, 0x5a, -0x55, 0x44, 0x48, 0x6b, 0x36, 0x5a, 0x47, 0x6e, 0x39, 0x30, 0x43, -0x55, 0x59, 0x6a, 0x75, 0x4e, 0x4d, 0x65, 0x4d, 0x57, 0x58, 0x5a, -0x67, 0x6a, 0x41, 0x34, 0x61, 0x73, 0x78, 0x6a, 0x61, 0x6d, 0x5a, -0x4c, 0x45, 0x4c, 0x51, 0x4e, 0x72, 0x56, 0x30, 0x42, 0x41, 0x6b, -0x45, 0x41, 0x39, 0x62, 0x6c, 0x52, 0x54, 0x53, 0x4d, 0x51, 0x69, -0x69, 0x71, 0x75, 0x0a, 0x49, 0x33, 0x52, 0x64, 0x46, 0x69, 0x4c, -0x79, 0x36, 0x44, 0x56, 0x57, 0x71, 0x67, 0x62, 0x58, 0x70, 0x69, -0x5a, 0x57, 0x2f, 0x75, 0x31, 0x58, 0x49, 0x44, 0x69, 0x59, 0x44, -0x61, 0x68, 0x62, 0x4a, 0x46, 0x38, 0x6b, 0x57, 0x6d, 0x2f, 0x67, -0x50, 0x7a, 0x66, 0x39, 0x6a, 0x69, 0x4f, 0x74, 0x6c, 0x66, 0x35, -0x74, 0x4d, 0x7a, 0x50, 0x71, 0x62, 0x4d, 0x55, 0x35, 0x48, 0x57, -0x31, 0x79, 0x0a, 0x6d, 0x77, 0x2b, 0x6d, 0x57, 0x34, 0x6d, 0x33, -0x34, 0x51, 0x4a, 0x42, 0x41, 0x4e, 0x77, 0x53, 0x79, 0x58, 0x33, -0x74, 0x78, 0x5a, 0x61, 0x46, 0x46, 0x6d, 0x6e, 0x6a, 0x6d, 0x55, -0x61, 0x42, 0x74, 0x62, 0x6b, 0x58, 0x58, 0x54, 0x65, 0x74, 0x6d, -0x65, 0x66, 0x6a, 0x38, 0x71, 0x53, 0x31, 0x31, 0x2f, 0x4f, 0x34, -0x50, 0x31, 0x46, 0x73, 0x70, 0x39, 0x32, 0x68, 0x30, 0x70, 0x76, -0x66, 0x0a, 0x50, 0x4e, 0x77, 0x67, 0x49, 0x4b, 0x67, 0x68, 0x5a, -0x30, 0x4b, 0x30, 0x54, 0x2b, 0x32, 0x6b, 0x62, 0x54, 0x49, 0x56, -0x4f, 0x62, 0x45, 0x71, 0x4c, 0x53, 0x65, 0x50, 0x59, 0x2f, 0x72, -0x36, 0x49, 0x64, 0x55, 0x43, 0x51, 0x51, 0x43, 0x78, 0x44, 0x63, -0x54, 0x4e, 0x4a, 0x66, 0x54, 0x6d, 0x2b, 0x58, 0x58, 0x63, 0x53, -0x68, 0x35, 0x41, 0x73, 0x78, 0x48, 0x2f, 0x79, 0x31, 0x38, 0x55, -0x0a, 0x79, 0x44, 0x56, 0x65, 0x6e, 0x4d, 0x57, 0x57, 0x6a, 0x6f, -0x46, 0x32, 0x30, 0x42, 0x43, 0x50, 0x31, 0x72, 0x31, 0x46, 0x61, -0x65, 0x43, 0x52, 0x34, 0x59, 0x62, 0x64, 0x52, 0x6f, 0x54, 0x47, -0x68, 0x47, 0x4b, 0x78, 0x62, 0x31, 0x42, 0x54, 0x30, 0x70, 0x61, -0x5a, 0x70, 0x55, 0x70, 0x51, 0x4c, 0x2b, 0x71, 0x69, 0x58, 0x42, -0x5a, 0x73, 0x59, 0x73, 0x46, 0x42, 0x41, 0x6b, 0x41, 0x73, 0x0a, -0x73, 0x73, 0x67, 0x6f, 0x41, 0x71, 0x59, 0x79, 0x4a, 0x7a, 0x2f, -0x68, 0x4b, 0x2f, 0x41, 0x53, 0x79, 0x50, 0x2b, 0x65, 0x34, 0x32, -0x62, 0x30, 0x69, 0x78, 0x63, 0x4b, 0x61, 0x56, 0x72, 0x38, 0x4a, -0x30, 0x38, 0x41, 0x57, 0x6e, 0x6a, 0x4a, 0x30, 0x66, 0x62, 0x61, -0x5a, 0x69, 0x61, 0x2f, 0x72, 0x2f, 0x7a, 0x4e, 0x66, 0x4e, 0x30, -0x46, 0x4b, 0x52, 0x75, 0x76, 0x43, 0x61, 0x35, 0x2b, 0x0a, 0x52, -0x76, 0x70, 0x43, 0x78, 0x4e, 0x72, 0x64, 0x36, 0x41, 0x49, 0x5a, -0x32, 0x64, 0x37, 0x6c, 0x74, 0x2b, 0x34, 0x74, 0x41, 0x6b, 0x45, -0x41, 0x6f, 0x33, 0x65, 0x46, 0x2f, 0x36, 0x65, 0x69, 0x38, 0x44, -0x44, 0x70, 0x6e, 0x47, 0x4d, 0x68, 0x45, 0x69, 0x54, 0x58, 0x6f, -0x5a, 0x6a, 0x36, 0x35, 0x48, 0x6f, 0x73, 0x4a, 0x71, 0x61, 0x79, -0x42, 0x4c, 0x57, 0x47, 0x7a, 0x58, 0x69, 0x5a, 0x0a, 0x4f, 0x6c, -0x7a, 0x45, 0x54, 0x65, 0x48, 0x32, 0x79, 0x64, 0x6c, 0x57, 0x68, -0x48, 0x58, 0x47, 0x37, 0x50, 0x30, 0x68, 0x57, 0x51, 0x72, 0x57, -0x31, 0x6c, 0x42, 0x32, 0x65, 0x78, 0x4e, 0x76, 0x52, 0x75, 0x55, -0x4f, 0x30, 0x6d, 0x4d, 0x47, 0x33, 0x71, 0x54, 0x4d, 0x67, 0x77, -0x3d, 0x3d, 0x0a, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x45, 0x4e, 0x44, -0x20, 0x52, 0x53, 0x41, 0x20, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, -0x45, 0x20, 0x4b, 0x45, 0x59, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x0a -#endif -}; - -} - -BgsCommunicator::BgsCommunicator() : m_Result(nn::ResultSuccess()) -{ -} - -BgsCommunicator::~BgsCommunicator() -{ - // TODO Auto-generated destructor stub -} - -bool BgsCommunicator::Execute(const void* buf, size_t size) -{ - if(!nn::ac::IsConnected()) - { - m_Result = common::InitializeNetwork(); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - } - - /* ------------------------------------------------------------------------ - ライブラリの初期化(HTTPライブラリ使用前に、各プロセスで一度だけ実行する。) - ------------------------------------------------------------------------ */ - m_Result = nn::http::Initialize(reinterpret_cast(s_PostBuffer), sizeof(s_PostBuffer)); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - /* ------------------------------------------------------------------------ - 通信準備 - ------------------------------------------------------------------------ */ - - //通信先の設定 - //<>URLの先頭文字はhttpsとなります -#ifndef BUILD_FOR_PROD_BGS - #ifndef BUILD_FOR_TEST_BGS - // DEV6 - m_Result = m_HttpCon.Initialize("https://10.12.3.73/bgs/services/BusinessGatewaySOAP", nn::http::REQUEST_METHOD_POST); - #else - // TEST - m_Result = m_HttpCon.Initialize("https://10.12.3.77/bgs/services/BusinessGatewaySOAP", nn::http::REQUEST_METHOD_POST); - #endif -#else -// PROD - // TODO:PROD用URL -#endif - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - m_Result = m_HttpCon.AddHeaderField("Accept-Encoding", "identity"); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - m_Result = m_HttpCon.AddHeaderField("SOAPAction", "urn:bgs.wsapi.broadon.com/GetPreInstalledInfo"); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - m_Result = m_HttpCon.AddHeaderField("Content-Type", "text/xml; charset=utf-8"); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - // POSTデータの設定 - m_Result = m_HttpCon.AddPostDataRaw(buf, size); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - /* ------------------------------------------------------------------------ - <>SSL処理用設定 - ------------------------------------------------------------------------ */ - //ルート証明書の設定 - m_Result = m_HttpCon.SetRootCa(NNSSL_CACERT_PUBLIC_CA_1); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED( m_Result); - m_Result = m_HttpCon.SetRootCa(NNSSL_CACERT_PUBLIC_CA_2); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED( m_Result); - m_Result = m_HttpCon.SetRootCa(NNSSL_CACERT_PUBLIC_CA_3); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED( m_Result); - m_Result = m_HttpCon.SetRootCa(NNSSL_CACERT_PUBLIC_CA_4); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - m_Result = m_HttpCon.SetClientCert(USER_ORIGIN_CLIENT_CERT_DATA, sizeof(USER_ORIGIN_CLIENT_CERT_DATA), - USER_ORIGIN_PRIVATE_KEY, sizeof(USER_ORIGIN_PRIVATE_KEY)); //クライアント証明書を設定する。 - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - - // 証明書が適当?なので検証項目を減らす - m_Result = m_HttpCon.DisableVerifyOptionForDebug( - nn::ssl::VERIFY_COMMON_NAME | nn::ssl::VERIFY_SUBJECT_ALT_NAME | nn::ssl::VERIFY_ROOT_CA); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - /* ------------------------------------------------------------------------ - 通信実行 - ------------------------------------------------------------------------ */ - //通信の開始 - m_Result = m_HttpCon.Connect(); //リクエストの送信を開始する。機器が同時実行可能な最大個数のHTTP通信がすでに実行中の場合は、空きができるまでブロック - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - - return true; -} - -bool BgsCommunicator::GetBodySize(size_t* size) -{ - //HTTPヘッダの情報読み出し - s32 statusCode = 0; - m_Result = m_HttpCon.GetStatusCode(&statusCode); //Statusコードの取得 - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - NN_LOG("---HTTP ResultCode = %d---\n", statusCode); - - char headerFields[1024]; - std::memset(headerFields, 0, sizeof(headerFields)); - u32 fieldLen = sizeof(headerFields); - m_Result = m_HttpCon.GetHeaderField("Content-Length", headerFields, fieldLen, &fieldLen); //特定のヘッダフィールドをラベルから取得 - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - *size = std::strtol(headerFields, NULL, 10); - NN_LOG("---HTTP Content-Length = %d---\n", *size); - - return true; -} - -bool BgsCommunicator::GetBody(u8 *buf, size_t size) -{ - //HTTPレスポンスの取得 - std::memset(buf, 0, size); - m_Result = m_HttpCon.Read(buf, size); //読み取りが完了するまでブロック。Bodyの最後までの読み込みが成功した場合は、Successを表すResultが返る。バッファサイズが足りない場合は、エラー(Description==ER_RES_BODYBUF_SHORTAGEのResult)が返る*/ - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - return true; -} - -bool BgsCommunicator::Finalize() -{ - m_Result = m_HttpCon.Finalize(); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - m_Result = nn::http::Finalize(); - COMMON_LOGGER_RETURN_FALSE_IF_FAILED(m_Result); - return true; -} - -nn::Result BgsCommunicator::GetLastResult() -{ - return m_Result; -} - -} /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.h deleted file mode 100644 index ba054ad..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/BgsCommunicator.h +++ /dev/null @@ -1,56 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: BgsCommunicator.h - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef BGSCOMMUNICATOR_H_ -#define BGSCOMMUNICATOR_H_ - -#include -#include -namespace ConsoleRestore -{ - -class BgsCommunicator -{ -public: - BgsCommunicator(); - virtual ~BgsCommunicator(); - - //! @brief 構築したXMLを使ってBGSと通信します - //! @param[in] buf XMLデータへのポインタ - //! @param[in] size XMLデータのサイズ - bool Execute(const void* buf, size_t size); - - //! @brief 通信結果のサイズを取得します - //! @param[out] 通信結果を取得するのに必要なバッファサイズ - bool GetBodySize(size_t* size); - - //! @brief 通信結果をバッファに書き込みます。正しく結果を取得するには GetBodySizeで取得したサイズのバッファが必要です。 - //! @param[out] buf 通信結果を書き込むバッファ - //! @param[in] size バッファサイズ - bool GetBody(u8* buf, size_t size); - - bool Finalize(); - - nn::Result GetLastResult(); - -private: - nn::Result m_Result; - - //Connectionインスタンス - nn::http::Connection m_HttpCon; -}; - -} /* namespace ConsoleRestore */ -#endif /* BGSCOMMUNICATOR_H_ */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp index 366fc92..86d9be3 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/Controller.cpp @@ -1638,10 +1638,7 @@ void ControlState(common::HardwareStateManager& manager, common::OperationMessag { COMMON_LOGGER("Checking User's SD Card\n"); s_ExecutePreparePreinstallTitleDownload = true; - bit64 deviceId = manager.GetDeviceId() + 0x400000000; - u8 serial[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; - manager.GetSerialNumberWithoutCD(serial); - StartPreparePreinstallTitleDownload(deviceId, serial, s_ForceDownloadPreinstall); + StartPreparePreinstallTitleDownload(s_ForceDownloadPreinstall); } // 動いていることを表示 diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile index 1c3d87f..6d0c50d 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/OMakefile @@ -31,9 +31,6 @@ SOURCES[] = TitleDownloader.cpp Shop.cpp RegionIdModifier.cpp - SimpleXmlPreprocessor.cpp - XmlCreator.cpp - BgsCommunicator.cpp PreinstallImporter.cpp ../common/Util.cpp ../common/DrawSystemState.cpp diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp index 04febe4..ed8a2af 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.cpp @@ -16,9 +16,6 @@ #include "CommonLogger.h" #include "HeapManager.h" #include "PreinstallImporter.h" -#include "XmlCreator.h" -#include "SimpleXmlPreprocessor.h" -#include #include #include @@ -59,26 +56,6 @@ nn::Result PreinstallImporter::SetupSd(bool* isAlreadyAvailable, bool forcePrein return nn::ResultSuccess(); } -nn::Result PreinstallImporter::ListTitles(nn::ProgramId* list, size_t* num, bit64 deviceId, u8* serialNo) -{ - // 送信用のXMLデータを構築する - XmlCreator sendXml; - sendXml.Exec(deviceId, serialNo); - - // 構築したXMLデータを使ってBGSと通信する - BgsCommunicator comm; - if(!comm.Execute(sendXml.GetData().c_str(), sendXml.GetData().size())) - { - return comm.GetLastResult(); - } - - // 通信結果をパースしてタイトルリストを作成する - COMMON_LOGGER_RETURN_RESULT_IF_FAILED( - GetHtmlBodyAndParseXmlData(comm, list, num) - ); - return nn::ResultSuccess(); -} - nn::Result PreinstallImporter::ListTitlesBasedOnTickets(nn::ProgramId* list, size_t* num) { s32 personalizedTicketNum; @@ -97,155 +74,4 @@ nn::Result PreinstallImporter::ListTitlesBasedOnTickets(nn::ProgramId* list, siz return nn::ResultSuccess(); } -nn::Result PreinstallImporter::GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num) -{ - // 通信結果を取得する - size_t bodySize; - if(!comm.GetBodySize(&bodySize)) - { - return comm.GetLastResult(); - } - if(common::GetAllocatableSize() < bodySize + 1) - { - // 巨大な通信結果のためFATAL。1回で受信しきれるはず - return nn::Result(nn::Result::LEVEL_FATAL, nn::Result::SUMMARY_OUT_OF_RESOURCE, nn::Result::MODULE_COMMON, - nn::Result::DESCRIPTION_OUT_OF_MEMORY); - } - common::HeapManager heap(bodySize + 1); - void* buf = heap.GetAddr(); - if(!comm.GetBody(reinterpret_cast(buf), bodySize + 1)) - { - return comm.GetLastResult(); - } - // NULL終端する - reinterpret_cast(buf)[bodySize] = '\0'; - - if(!comm.Finalize()) - { - return comm.GetLastResult(); - } - - // XMLを解析してタイトルリストを設定する - COMMON_LOGGER_RETURN_RESULT_IF_FAILED(ParseXmlData(buf, list, num)); - - return nn::ResultSuccess(); -} - -nn::Result PreinstallImporter::ParseXmlData(void* buf, nn::ProgramId* list, size_t* num) -{ - // 通信結果をパースする - // SimpleXmlParserに食わせるために変換する - SimpleXmlPreprocessor pp; - // システムヒープ(8MB)を超えたら正常に動かない - std::string xmlResult(reinterpret_cast(buf)); - pp.Canonicalize(xmlResult); - - // XMLをパースしてタイトルリストを取得する - nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator(); - nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator); - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode; - - COMMON_LOGGER_RETURN_RESULT_IF_FAILED( - SetNodetoTitleIds(simpleXmlParser, xmlResult, &pTaskIdNode) - ); - - *num = 0; - // プリインストールタイトルが無ければ終了 - if(!pTaskIdNode) - { - return nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND, nn::Result::MODULE_APPLICATION, - nn::Result::DESCRIPTION_NOT_FOUND); - } - - // タイトルIDリストをコピーする - common::HeapManager xmlHeap(pTaskIdNode->contentSize); - void* titleIdBuffer = xmlHeap.GetAddr(); - std::memcpy(titleIdBuffer, pTaskIdNode->content, pTaskIdNode->contentSize); - - SplitTextAndSetupList(list, num, reinterpret_cast(titleIdBuffer)); - return nn::ResultSuccess(); -} - -nn::Result PreinstallImporter::SetNodetoTitleIds(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode) -{ - /* - * SimpleXmlPreprocessorを通したXMLデータはこんな形になっている - - - - - - - 1326939225587 - 0 - 1 - - 17179924184 - EJA20305940 - JPN - 1324339327000 - 000400000FEEB400,000400000FEEB000 - - - - - - */ - - parser.parse(reinterpret_cast(const_cast(xmlData.c_str())), xmlData.size()); - - if(parser.isError()) - { - COMMON_LOGGER("invalid xml Data\n"); - return nn::Result(nn::Result::LEVEL_STATUS, nn::Result::SUMMARY_INVALID_STATE, nn::Result::MODULE_COMMON, - nn::Result::DESCRIPTION_INVALID_RESULT_VALUE); - } - - // 欲しい情報がある場所まで階層を掘り下げる - const nn::xml::simple::SimpleXmlParser::Node* pRootNode = parser.getRootNode(); - const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = pRootNode->firstChild; - const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pTargetNode, "Body"); - pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, - "GetPreInstalledInfoResponse"); - pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, - "GetPreInstalledInfoResponse"); - pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "PreinstalledInfo"); - // テーブルを移行して空になっていた場合 - if(pPriorityNode == NULL) - { - *pNode = NULL; - return nn::ResultSuccess(); - } - - *pNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "TitleIds"); - - return nn::ResultSuccess(); -} - -void PreinstallImporter::SplitTextAndSetupList(nn::ProgramId* list, size_t* num, char* text) -{ - const char* token = ","; - char* cutout; - - cutout = std::strtok(text, token); - if(!cutout) - { - return; - } - - list[*num] = std::strtoll(cutout, NULL, 16); - (*num)++; - - while( cutout ) - { - cutout = std::strtok(NULL, token); - if(cutout) - { - list[*num] = std::strtoll(cutout, NULL, 16); - (*num)++; - } - } -} - } /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h index a7469e9..8156e05 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/PreinstallImporter.h @@ -18,7 +18,6 @@ #include #include -#include "BgsCommunicator.h" namespace ConsoleRestore { @@ -35,30 +34,8 @@ public: //! @param[in] forcePreinstall    SDカードが初期化済みでもプリインストールを書き込むかどうか nn::Result SetupSd(bool* isAlreadyAvailable, bool forcePreinstall); - //! @brief ダウンロードするプリインストールタイトルをBGS経由でリストアップする - //! @param[out] list    プリインストールタイトルの配列。十分に大きいものを渡すこと。 - //! @param[out] num プリインストールタイトルの数 - //! @param[in] deviceId デバイスID - //! @param[in] serialNo シリアルナンバー - nn::Result ListTitles(nn::ProgramId* list, size_t* num, bit64 deviceId, u8* serialNo); - //!@ brief プリインストールタイトルをeTicketに基づいてリストアップする nn::Result ListTitlesBasedOnTickets(nn::ProgramId* list, size_t* num); - -private: - //! @brief HTMLレスポンスを受信してXMLデータを解析します - nn::Result GetHtmlBodyAndParseXmlData(BgsCommunicator& comm, nn::ProgramId* list, size_t* num); - - //! @brief 受信したXMLデータを解析してタイトルIDリストを設定します - //! @return プリインストールアプリが存在しない場合、(Level=Status, Summary=NotFound, Module=Application, Description=NotFound)
- //! のResultを返します - nn::Result ParseXmlData(void* buf, nn::ProgramId* list, size_t* num); - - //! @brief SimpleXmlパーサの解析をTitleIdノードまで進めます - nn::Result SetNodetoTitleIds(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode); - - //! @brief カンマ区切りのプログラムIDのリストを分割して出力用のリストに設定します - void SplitTextAndSetupList(nn::ProgramId* list, size_t* num, char* text); }; } /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.cpp deleted file mode 100644 index 25f3d43..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SimpleXmlPreprocessor.cpp - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "SimpleXmlPreprocessor.h" -#if defined(__ARMCC_VERSION) -#include -#else -#include "test_common.h" -#endif - -namespace ConsoleRestore -{ - -bool SimpleXmlPreprocessor::Canonicalize(std::string& str) -{ - if(!EraseXmlDeclaration(str)) - { - NN_LOG("invalid xml!\n"); - return false; - } - - if(!EraseEmptyTag(str)) - { - NN_LOG("can't erase empty tag"); - return false; - } - - if(!EraseAttribute(str)) - { - NN_LOG("can't erase attribute\n"); - return false; - } - - if(!EraseNsTagEnd(str)) - { - NN_LOG("can't erase ns end\n"); - return false; - } - - if(!EraseNsTagStart(str)) - { - NN_LOG("can't erase ns start\n"); - return false; - } - - return true; -} - -bool SimpleXmlPreprocessor::EraseXmlDeclaration(std::string& str) -{ - std::string::size_type start = str.find(""); - if (end == std::string::npos) - { - return false; - } - - str.erase(start, end + 1 - start); - - return true; -} - -bool SimpleXmlPreprocessor::EraseEmptyTag(std::string& str) -{ - // XMLとしては正しい前提 - std::string::size_type end = str.find("/>"); - if (end == std::string::npos) - { - return true; - } - - std::string::size_type start = str.rfind("<", end); - if (start == std::string::npos) - { - return false; - } - - str.erase(start, end + 2 - start); - - return true; -} - -bool SimpleXmlPreprocessor::EraseNsTagEnd(std::string& str) -{ - std::string::size_type start = str.rfind("", start); - if (end == std::string::npos) - { - // 不正なXML - return false; - } - - std::string::size_type colon = str.substr(start, end - start).find(":"); - if (colon == std::string::npos) - { - // 名前空間無し - start = str.rfind("", start); - if (end == std::string::npos) - { - // 不正なXML - return false; - } - - std::string::size_type colon = str.substr(start, end - start).find(":"); - if (colon == std::string::npos) - { - // 名前空間無し - start = str.find("<", end); - continue; - } - - str.erase(start + 1, colon); - start = str.find("<", end - colon); - } - - return true; -} - -bool SimpleXmlPreprocessor::EraseAttribute(std::string& str) -{ - std::string::size_type start = str.find("<"); - while (start != std::string::npos) - { - std::string::size_type end = str.find(">", start); - if (end == std::string::npos) - { - // 不正なXML - return false; - } - - std::string::size_type space = str.substr(start, end - start).find(" "); - if (space == std::string::npos) - { - // 属性なし - start = str.find("<", end); - continue; - } - - str.erase(start + space, end - (start + space)); - start = str.find("<", start + space); - } - - return true; -} - -} /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.h deleted file mode 100644 index 7cf549b..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/SimpleXmlPreprocessor.h +++ /dev/null @@ -1,52 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: SimpleXmlPreprocessor.h - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef SIMPLEXMLPREPROCESSOR_H_ -#define SIMPLEXMLPREPROCESSOR_H_ - -#include - -namespace ConsoleRestore -{ - -class SimpleXmlPreprocessor -{ -public: - SimpleXmlPreprocessor() {}; - ~SimpleXmlPreprocessor() {}; - - // SimpleXmlParserで読めるように変換します - static bool Canonicalize(std::string& str); - -private: - // の除去 - static bool EraseXmlDeclaration(std::string& str); - - // 空タグの除去 - static bool EraseEmptyTag(std::string& str); - - // 属性の削除 - static bool EraseAttribute(std::string& str); - - // 終了タグの名前空間の削除 - static bool EraseNsTagEnd(std::string& str); - - // 開始タグの名前空間の削除 - static bool EraseNsTagStart(std::string& str); - -}; - -} /* namespace ConsoleRestore */ -#endif /* SIMPLEXMLPREPROCESSOR_H_ */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp index 08b5c10..3d0239f 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.cpp @@ -197,11 +197,9 @@ void PreparePreinstallTitleDownloadThreadFunc(PreinstallListupParam param) } -void StartPreparePreinstallTitleDownload(bit64 deviceId, u8* serialNo, bool forcePreinstall) +void StartPreparePreinstallTitleDownload(bool forcePreinstall) { PreinstallListupParam param; - param.deviceId = deviceId; - std::memcpy(param.serialNo, serialNo, nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN); param.forcePreinstall = forcePreinstall; s_TitleDownloaderThread.Start(PreparePreinstallTitleDownloadThreadFunc, param, s_TitleDownloaderThreadStack); diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.h index bb13cb5..b283d03 100644 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.h +++ b/trunk/ConsoleDataMigration/sources/ConsoleRestore/TitleDownloader.h @@ -26,11 +26,9 @@ void StartTwlTitleDownload(); //! @brief プリインストールタイトルをSDカードにインポート可能かどうかサイズを確認し、
//! 可能であればSDカードをインポート可能状態にします -//! @param[in] deviceId デバイスID -//! @param[in] serialNo シリアルナンバー //! @param[in] serialNo 強制的にプリインストールを書き込むかどうか //! @return 正常に初期化できたかどうか -void StartPreparePreinstallTitleDownload(bit64 deviceId, u8* serialNo, bool forcePreinstall); +void StartPreparePreinstallTitleDownload(bool forcePreinstall); //! @brief 新たにスレッドを立て、プリインストールタイトルのダウンロードを開始します
//! SDカードはインポート可能な状態にしておく必要があります。 @@ -40,8 +38,6 @@ void StartPreinstallTitleDownload(); // プリインストール情報取得に必要なパラメータをまとめた構造体 struct PreinstallListupParam { - bit64 deviceId; - u8 serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; bool forcePreinstall; }; diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.cpp b/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.cpp deleted file mode 100644 index 61721f0..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: XmlCreator.cpp - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include "XmlCreator.h" - -#include -#include - -namespace ConsoleRestore -{ - -namespace -{ -const char xmlDataPrefix[] = \ -"\n\ -\n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n"; -const char xmlDeviceIdPrefix[] = \ -" "; -const char xmlDeviceIdSuffix[] = "\n"; -const char xmlSerialNoPrefix[] = \ -" "; -const char xmlSerialNoSuffix[] = "\n"; -const char xmlDataSuffix[] = \ -" \n\ - \n\ - \n\ -"; - -} - - -XmlCreator::XmlCreator() -{ - // TODO 自動生成されたコンストラクター・スタブ - -} - -XmlCreator::~XmlCreator() -{ - // TODO Auto-generated destructor stub -} - -void XmlCreator::Exec(bit64 deviceId, u8* serialNo) -{ - m_Xml.append(xmlDataPrefix); - - m_Xml.append(xmlDeviceIdPrefix); - std::ostringstream oss; - oss << std::dec; - oss << deviceId; - m_Xml.append(oss.str()); - m_Xml.append(xmlDeviceIdSuffix); - - m_Xml.append(xmlSerialNoPrefix); - m_Xml.append(reinterpret_cast(serialNo)); - m_Xml.append(xmlSerialNoSuffix); - - m_Xml.append(xmlDataSuffix); -} - -std::string XmlCreator::GetData() -{ - return m_Xml; -} - -} /* namespace ConsoleRestore */ diff --git a/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.h b/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.h deleted file mode 100644 index 9649def..0000000 --- a/trunk/ConsoleDataMigration/sources/ConsoleRestore/XmlCreator.h +++ /dev/null @@ -1,51 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: XmlCreator.h - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef XMLCREATOR_H_ -#define XMLCREATOR_H_ - -#include - -#if defined(__ARMCC_VERSION) -#include -#else -#include "test_common.h" -#endif - - -namespace ConsoleRestore -{ - -class XmlCreator -{ -public: - XmlCreator(); - virtual ~XmlCreator(); - - //! @brief プリインストール情報を取得するためのXMLを構築します - //! @param[in] deviceId デバイスID - //! @param[in] serialNo シリアルNo. - void Exec(bit64 deviceId, u8* serialNo); - - //! @brief 構築したXMLデータを取得します - std::string GetData(); - -private: - std::string m_Xml; - -}; - -} /* namespace ConsoleRestore */ -#endif /* XMLCREATOR_H_ */ diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/OMakefile b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/OMakefile deleted file mode 100644 index 15541a4..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/OMakefile +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- -SUPPORTED_TARGETS = CTR-*.Process.MPCore.* - -include $(makePlatformDefsPath tests) - -SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/SampleDemos/common/include) -INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ - ../../../common \ - ../../../ConsoleRestore \ - - - -TEST_COMMON_SOURCES[] = - ../../../ConsoleRestore/Shop.cpp - ../../../ConsoleRestore/XmlCreator.cpp - ../../../ConsoleRestore/SimpleXmlPreprocessor.cpp - ../../../ConsoleRestore/BgsCommunicator.cpp - ../../../common/Util.cpp - ../../../common/HeapManager.cpp - ../../../common/SdLogger.cpp - ../../../common/LogConsole.cpp - ../../../common/CommonLogger.cpp - ../../../common/SdMountManager.cpp - ../../../common/VersionDetect.cpp - ../../../common/HardwareStateManager.cpp - ../../../common/FileTransfer.cpp - ../../../common/SdReaderWriter.cpp - -CCFLAGS += -DCOMMON_LOGGER_DETAIL_ENABLE -include $(ROOT)/common/BuildSwitch.om - -SOURCES_TEST[] = test_BgsCommunicator.cpp - -ROMFS_ROOT = ../../../common/romfiles - -TEST_ENVIRONMENT_PROCESSLIST = true -TEST_ENVIRONMENT_EMUMEM = true - -LIBS += libnn_test \ - libnn_mcu \ - libnn_ps \ - libnn_am \ - lib_demo \ - libnn_nim \ - libnn_xml_simple \ - -ROM_SPEC_FILE = ../../../ConsoleRestore/ConsoleRestore.rsf -DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/private/RepairTool.desc - - -DEPEND_PROCESSES[] = - test_BgsCommunicator>$(GetProcessCdiPathList http) - - -include $(makePlatformDefsPath build.tests) - - -tests: $(TEST_TARGETS) diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/test_BgsCommunicator.cpp b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/test_BgsCommunicator.cpp deleted file mode 100644 index ec8e13d..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/BgsCommunicator/test_BgsCommunicator.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: test_BgsCommunicator.cpp - - Copyright (C)2012 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "demo.h" - -#include "common_Types.h" -#include "CommonLogger.h" -#include "HeapManager.h" -#include "XmlCreator.h" -#include "BgsCommunicator.h" -#include "SimpleXmlPreprocessor.h" - -using namespace nn::test; - -class BgsCommunicatorTest : public Suite { -public: - virtual bool InitializeSuite(); - virtual void FinalizeSuite(); - - BgsCommunicatorTest() { - TEST_ADD(BgsCommunicatorTest::Exec); - } -private: - void Exec(); -}; - -namespace -{ -void PutString(std::string str) -{ - if (str.size() > 254) - { - for (size_t pos = 0; pos < str.size(); pos += 254) - { - NN_LOG("%s", str.substr(pos, nn::math::Min(static_cast(254), str.size() - pos)).c_str()); - } - } - else - { - NN_LOG("%s\n", str.c_str()); - } -} - -const size_t s_GxHeapSize = 0x800000; - -} - -//------------------------------------------------------------------ -// Initialize/Finalize -//------------------------------------------------------------------ - -bool BgsCommunicatorTest::InitializeSuite() -{ - // os の初期化 - nn::os::Initialize(); - - nn::fs::Initialize(); - - // amの初期化 - nn::am::InitializeForLocalImporter(); - - // cfgの初期化 - nn::cfg::init::Initialize(); - nn::cfg::system::Initialize(); - - // ヒープの確保 - common::InitializeHeap(); - common::HeapManager gxHeap(s_GxHeapSize); - - // RenderSystem の準備 - uptr heapForGx = reinterpret_cast(gxHeap.GetAddr()); - demo::RenderSystemDrawing renderSystem; - renderSystem.Initialize(heapForGx, s_GxHeapSize); - - // ログ描画の初期化 - common::Logger::GetLoggerInstance()->Initialize(common::CONSOLE_WIDTH, common::CONSOLE_HEIGHT, - common::CONSOLE_MAX_LINE, &renderSystem); - - return true; - -} - -void BgsCommunicatorTest::FinalizeSuite() -{ -} - -//------------------------------------------------------------------ -// Test Util -//------------------------------------------------------------------ - - -//------------------------------------------------------------------ -// Test Functions -//------------------------------------------------------------------ - -void BgsCommunicatorTest::Exec() -{ - NN_LOG("BgsCommunicator Exec\n"); - ConsoleRestore::BgsCommunicator comm; - - ConsoleRestore::XmlCreator xml; - xml.Exec(17179924184, reinterpret_cast(const_cast("EJA20305940"))); - - comm.Execute(xml.GetData().c_str(), xml.GetData().size()); - size_t bufSize; - comm.GetBodySize(&bufSize); - common::HeapManager heap(bufSize + 1); - void* buf = heap.GetAddr(); - comm.GetBody(reinterpret_cast(buf), bufSize + 1); - comm.Finalize(); - - // NULL終端する - reinterpret_cast(buf)[bufSize] = '\0'; - - // 変換前 - std::string before(reinterpret_cast(buf)); - PutString(before); - - // simpleXMLに変換します - ConsoleRestore::SimpleXmlPreprocessor pp; - std::string xmlData(reinterpret_cast(buf)); - pp.Canonicalize(xmlData); - - PutString(xmlData); -} - -NN_TEST_DEFINE_MAIN(BgsCommunicatorTest) - -/*---------------------------------------------------------------------------* - End of file - *---------------------------------------------------------------------------*/ diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/OMakefile b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/OMakefile index 9968bf5..ca31e96 100644 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/OMakefile +++ b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/OMakefile @@ -26,9 +26,6 @@ INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ TEST_COMMON_SOURCES[] = ../../../ConsoleRestore/Shop.cpp - ../../../ConsoleRestore/XmlCreator.cpp - ../../../ConsoleRestore/SimpleXmlPreprocessor.cpp - ../../../ConsoleRestore/BgsCommunicator.cpp ../../../ConsoleRestore/PreinstallImporter.cpp ../../../common/Util.cpp ../../../common/HeapManager.cpp diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/test_PreinstallImporter.cpp b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/test_PreinstallImporter.cpp index b00c5ad..40149ef 100644 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/test_PreinstallImporter.cpp +++ b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/PreinstallImporter/test_PreinstallImporter.cpp @@ -26,9 +26,6 @@ #include "common_Types.h" #include "CommonLogger.h" #include "HeapManager.h" -#include "XmlCreator.h" -#include "BgsCommunicator.h" -#include "SimpleXmlPreprocessor.h" #include "PreinstallImporter.h" using namespace nn::test; @@ -39,12 +36,10 @@ public: virtual void FinalizeSuite(); PreinstallImporterTest() { - TEST_ADD(PreinstallImporterTest::ListUp); TEST_ADD(PreinstallImporterTest::SetupSd); TEST_ADD(PreinstallImporterTest::ListUpBasedOnTicket); } private: - void ListUp(); void SetupSd(); void ListUpBasedOnTicket(); }; @@ -99,31 +94,6 @@ void PreinstallImporterTest::FinalizeSuite() // Test Functions //------------------------------------------------------------------ -void PreinstallImporterTest::ListUp() -{ - ConsoleRestore::PreinstallImporter importer; - - size_t num; - nn::ProgramId list[256]; - nn::Result result; - result = importer.ListTitles(list, &num, 17179924184, reinterpret_cast(const_cast("EJA20305940"))); - - if(result == nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND, - nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_NOT_FOUND)) - { - NN_LOG("No PreInstalled Application found\n"); - NN_TEST_ASSERT(num == 0); - } - else - { - NN_LOG("Preinstalled num = %d\n", num); - for (u32 i = 0; i < num; i++) - { - NN_LOG("%016llx\n", list[i]); - } - } -} - void PreinstallImporterTest::SetupSd() { ConsoleRestore::PreinstallImporter importer; diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/OMakefile b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/OMakefile deleted file mode 100644 index 3b704c6..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/OMakefile +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env omake -#---------------------------------------------------------------------------- -# Project: Horizon -# File: OMakefile -# -# Copyright (C)2009 Nintendo Co., Ltd. All rights reserved. -# -# These coded instructions, statements, and computer programs contain -# proprietary information of Nintendo of America Inc. and/or Nintendo -# Company Ltd., and are protected by Federal copyright law. They may -# not be disclosed to third parties or copied or duplicated in any form, -# in whole or in part, without the prior written consent of Nintendo. -# -# $Rev$ -#---------------------------------------------------------------------------- -SUPPORTED_TARGETS = CTR-*.Process.MPCore.* - -include $(makePlatformDefsPath tests) - -SAMPLED_DEMOS_COMMON_INCLUDE_DIR = $(dir $(HORIZON_ROOT)/../CTR/SampleDemos/common/include) -INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ - ../../../common \ - ../../../ConsoleRestore \ - - - -TEST_COMMON_SOURCES[] = - ../../../ConsoleRestore/SimpleXmlPreprocessor.cpp - -CCFLAGS += -DCOMMON_LOGGER_DETAIL_ENABLE -include $(ROOT)/common/BuildSwitch.om - -SOURCES_TEST[] = test_SimpleXmlParser.cpp - -ROMFS_ROOT = ../../../common/romfiles - -TEST_ENVIRONMENT_PROCESSLIST = true -TEST_ENVIRONMENT_EMUMEM = true - -LIBS += libnn_test \ - libnn_xml_simple \ - -ROM_SPEC_FILE = ../../../ConsoleRestore/ConsoleRestore.rsf -DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/private/RepairTool.desc - -include $(makePlatformDefsPath build.tests) - - -tests: $(TEST_TARGETS) diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/test_SimpleXmlParser.cpp b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/test_SimpleXmlParser.cpp deleted file mode 100644 index 6a46918..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/SimpleXmlParser/test_SimpleXmlParser.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: test_SimpleXmlParser.cpp - - Copyright (C)2011 Nintendo Co., Ltd. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "demo.h" - -#include "common_Types.h" -#include "CommonLogger.h" -#include "HeapManager.h" -#include "XmlCreator.h" -#include "SimpleXmlPreprocessor.h" - -using namespace nn::test; - -class SimpleXmlParserTest : public Suite { -public: - SimpleXmlParserTest() { - TEST_ADD(SimpleXmlParserTest::Find); - TEST_ADD(SimpleXmlParserTest::NotFound); - } -private: - void Find(); - void NotFound(); -}; - -namespace -{ - -class SimpleXmlParserGetter -{ -public: - static const char* GetName(const nn::xml::simple::SimpleXmlParser::Node* pNode); - static const char* GetContent(const nn::xml::simple::SimpleXmlParser::Node* pNode); - - static const size_t BUF_SIZE = 1024; - -private: - static char m_Buf[BUF_SIZE]; - -}; - -const char* SimpleXmlParserGetter::GetName(const nn::xml::simple::SimpleXmlParser::Node* pNode) -{ - if(!pNode) - { - return NULL; - } - std::memset(m_Buf, 0, sizeof(m_Buf)); - std::memcpy(m_Buf, pNode->name, pNode->nameSize); - return m_Buf; -} - -const char* SimpleXmlParserGetter::GetContent(const nn::xml::simple::SimpleXmlParser::Node* pNode) -{ - if(!pNode) - { - return NULL; - } - std::memset(m_Buf, 0, sizeof(m_Buf)); - std::memcpy(m_Buf, pNode->content, pNode->contentSize); - return m_Buf; -} - -char SimpleXmlParserGetter::m_Buf[SimpleXmlParserGetter::BUF_SIZE]; - -nn::Result SetNodetoPreinstalledInfo(nn::xml::simple::SimpleXmlParser& parser, std::string& xmlData, const nn::xml::simple::SimpleXmlParser::Node** pNode) -{ - parser.parse(reinterpret_cast(const_cast(xmlData.c_str())), xmlData.size()); - - NN_TEST_ASSERT(!parser.isError()); - const nn::xml::simple::SimpleXmlParser::Node* pRootNode = parser.getRootNode(); - const nn::xml::simple::SimpleXmlParser::Node* pTargetNode = pRootNode->firstChild; - // 欲しい情報がある場所まで階層を掘り下げる - const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pTargetNode, "Body"); - pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, - "GetPreInstalledInfoResponse"); - pPriorityNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, - "GetPreInstalledInfoResponse"); - *pNode = nn::xml::simple::SimpleXmlParser::FindNextNode(pPriorityNode->firstChild, "PreinstalledInfo"); - - return nn::ResultSuccess(); -} - -} - -//------------------------------------------------------------------ -// Test Functions -//------------------------------------------------------------------ - -void SimpleXmlParserTest::Find() -{ -const char testText[] = "\ -\ -\ -\ -\ -\ -\ -1326939225587\ -0\ -1\ -\ -17179924184\ -EJA20305940\ -JPN\ -1324339327000\ -000400000FEEB400,000400000FEEB000\ -\ -\ -\ -\ -\ -"; - - nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator(); - nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator); - const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode; - std::string xmlData(testText); - SetNodetoPreinstalledInfo(simpleXmlParser, xmlData, &pPriorityNode); - - { - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pPriorityNode->firstChild, "DeviceId"); - NN_TEST_ASSERT(pTaskIdNode); - NN_TEST_ASSERT_EQUAL(std::strcmp("DeviceId", SimpleXmlParserGetter::GetName(pTaskIdNode)), 0); - NN_TEST_ASSERT_EQUAL(std::strcmp("17179924184", SimpleXmlParserGetter::GetContent(pTaskIdNode)), 0); - } - - { - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pPriorityNode->firstChild, "SerialNo"); - NN_TEST_ASSERT(pTaskIdNode); - NN_TEST_ASSERT_EQUAL(std::strcmp("SerialNo", SimpleXmlParserGetter::GetName(pTaskIdNode)), 0); - NN_TEST_ASSERT_EQUAL(std::strcmp("EJA20305940", SimpleXmlParserGetter::GetContent(pTaskIdNode)), 0); - } - - { - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pPriorityNode->firstChild, "TitleIds"); - NN_TEST_ASSERT(pTaskIdNode); - NN_TEST_ASSERT_EQUAL(std::strcmp("TitleIds", SimpleXmlParserGetter::GetName(pTaskIdNode)), 0); - NN_TEST_ASSERT_EQUAL(std::strcmp("000400000FEEB400,000400000FEEB000", SimpleXmlParserGetter::GetContent(pTaskIdNode)), 0); - } - -} - -void SimpleXmlParserTest::NotFound() -{ -const char testText[] = \ -"\ -\ -\ -\ -\ -\ -1327551124393\ -0\ -1\ -\ -17179924184\ -EJA20305940\ -JPN\ -1327545997000\ -\ -\ -\ -\ -"; - - nn::fnd::IAllocator* pAllocator = nn::init::GetAllocator(); - nn::xml::simple::SimpleXmlParser simpleXmlParser(pAllocator); - const nn::xml::simple::SimpleXmlParser::Node* pPriorityNode; - std::string xmlData(testText); - SetNodetoPreinstalledInfo(simpleXmlParser, xmlData, &pPriorityNode); - - { - const nn::xml::simple::SimpleXmlParser::Node* pTaskIdNode = nn::xml::simple::SimpleXmlParser::FindNextNode( - pPriorityNode->firstChild, "TitleIds"); - NN_TEST_ASSERT(!pTaskIdNode); - } -} - -NN_TEST_DEFINE_MAIN(SimpleXmlParserTest) - -/*---------------------------------------------------------------------------* - End of file - *---------------------------------------------------------------------------*/ diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/OMakefile b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/OMakefile index e8961ca..be42b06 100644 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/OMakefile +++ b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/OMakefile @@ -27,9 +27,6 @@ INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR) \ TEST_COMMON_SOURCES[] = ../../../ConsoleRestore/TitleDownloader.cpp ../../../ConsoleRestore/Shop.cpp - ../../../ConsoleRestore/BgsCommunicator.cpp - ../../../ConsoleRestore/SimpleXmlPreprocessor.cpp - ../../../ConsoleRestore/XmlCreator.cpp ../../../ConsoleRestore/PreinstallImporter.cpp ../../../common/Util.cpp ../../../common/HeapManager.cpp diff --git a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/test_TitleDownloader.cpp b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/test_TitleDownloader.cpp index 649acc9..851b0e8 100644 --- a/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/test_TitleDownloader.cpp +++ b/trunk/ConsoleDataMigration/sources/tests/ConsoleRestore/TitleDownloader/test_TitleDownloader.cpp @@ -116,7 +116,7 @@ void TitleDownloaderTest::ListUp() void TitleDownloaderTest::DownloadPreinstall() { - ConsoleRestore::StartPreparePreinstallTitleDownload(17179924184, reinterpret_cast(const_cast("EJA20305940")), false); + ConsoleRestore::StartPreparePreinstallTitleDownload(false); while(!ConsoleRestore::IsDownloadTitleFinished()) { diff --git a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/OMakefile b/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/OMakefile deleted file mode 100644 index 5e43c31..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/OMakefile +++ /dev/null @@ -1,22 +0,0 @@ -INCLUDES[] += - ./ - ../common - ../../../ConsoleRestore - -TARGET = testSimpleXmlPreprocessor -TEST_TARGET = SimpleXmlPreprocessor - -SRC_FILES[] = - testSimpleXmlPreprocessor - SimpleXmlPreprocessor - -# テスト独自のスタブを使用する場合に定義する -CXXFLAGS += -DPCTEST_USE_STUB - -# テストディレクトリ外にあるので独自ルールでビルド -$(TEST_TARGET)$(EXT_OBJ): ../../../ConsoleRestore/$(TEST_TARGET).cpp - $(CXX) $(CXXFLAGS) $(PREFIXED_INCLUDES) -c $< - -.DEFAULT: $(TEST_TARGET)$(EXT_OBJ) $(TARGET)$(EXE) - -include $(COMMON_BUILD) \ No newline at end of file diff --git a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/stub.h b/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/stub.h deleted file mode 100644 index f364cfc..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/stub.h +++ /dev/null @@ -1,21 +0,0 @@ -/*---------------------------------------------------------------------------* - Project: Horizon - File: stub.h - - Copyright 2009-2011 Nintendo. All rights reserved. - - These coded instructions, statements, and computer programs contain - proprietary information of Nintendo of America Inc. and/or Nintendo - Company Ltd., and are protected by Federal copyright law. They may - not be disclosed to third parties or copied or duplicated in any form, - in whole or in part, without the prior written consent of Nintendo. - - $Rev$ - *---------------------------------------------------------------------------*/ - -#ifndef STUB_H_ -#define STUB_H_ - -#define NN_LOG(...) (void)0 - -#endif /* STUB_H_ */ diff --git a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/testSimpleXmlPreprocessor.cpp b/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/testSimpleXmlPreprocessor.cpp deleted file mode 100644 index 8c27146..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/googletest/SimpleXmlPreprocessor/testSimpleXmlPreprocessor.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include - -#include "SimpleXmlPreprocessor.h" - -using namespace ConsoleRestore; - -namespace -{ - -const char testStr[] = "13269392255870117179924184EJA20305940JPN1324339327000000400000FEEB400,000400000FEEB000"; -const char resultStr[] = "13269392255870117179924184EJA20305940JPN1324339327000000400000FEEB400,000400000FEEB000"; - -} - -TEST(testSimpleXmlPreprocessor, Canonicalize) -{ - SimpleXmlPreprocessor pp; - - std::string str(testStr); - pp.Canonicalize(str); - ASSERT_STREQ(resultStr, str.c_str()); -} diff --git a/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/OMakefile b/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/OMakefile deleted file mode 100644 index 8d94881..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/OMakefile +++ /dev/null @@ -1,19 +0,0 @@ -INCLUDES[] += - ./ - ../common - ../../../ConsoleRestore - -TARGET = testXmlCreator -TEST_TARGET = XmlCreator - -SRC_FILES[] = - testXmlCreator - XmlCreator - -# テストディレクトリ外にあるので独自ルールでビルド -$(TEST_TARGET)$(EXT_OBJ): ../../../ConsoleRestore/$(TEST_TARGET).cpp - $(CXX) $(CXXFLAGS) $(PREFIXED_INCLUDES) -c $< - -.DEFAULT: $(TEST_TARGET)$(EXT_OBJ) $(TARGET)$(EXE) - -include $(COMMON_BUILD) \ No newline at end of file diff --git a/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/testXmlCreator.cpp b/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/testXmlCreator.cpp deleted file mode 100644 index 2c422b4..0000000 --- a/trunk/ConsoleDataMigration/sources/tests/googletest/XmlCreator/testXmlCreator.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include -#include - -#include "XmlCreator.h" - -using namespace ConsoleRestore; - -namespace -{ - -const char testStr[] = \ -"\n\ -\n\ - \n\ - \n\ - \n\ - \n\ - \n\ - \n\ - 17179924184\n\ - EJA20305940\n\ - \n\ - \n\ - \n\ -"; -} - -TEST(testXmlCreator, Exec) -{ - XmlCreator xml; - xml.Exec(17179924184, reinterpret_cast(const_cast("EJA20305940"))); - ASSERT_STREQ(testStr, xml.GetData().c_str()); -} diff --git a/trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/AutoBoot.bsf b/trunk/ConsoleDataMigration/sources/tools/PreinstallListUp/AutoBoot.bsf deleted file mode 100644 index 104a94da96cd5d963d349ca5c6fcce26ae7e3cbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2302 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 MDvwobWH -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "Aes_define.h" -#include "FileTransfer.h" -#include "CommonLogger.h" - -#include "demo.h" - -#include -#include - -#include "DrawSystemState.h" -#include "FileName.h" -#include "SimplePlayer.h" -#include "CommonLogger.h" -#include "SDMountManager.h" -#include "HeapManager.h" -#include "common_Types.h" -#include "VersionDetect.h" -#include "Util.h" -#include "CommonLogger.h" -#include "SdReaderWriter.h" -#include "../ConsoleRestore/PreinstallImporter.h" - -namespace -{ - -// グラフィックスに割り当てるメモリ -const size_t s_GxHeapSize = 0x800000; - -const u32 CONSOLE_WIDTH = 38; -const u32 CONSOLE_HEIGHT = 24; -const u32 CONSOLE_MAX_LINE = 1000; - -const size_t THREAD_STACK_SIZE = 0x2000; -nn::os::Thread s_Thread; -nn::os::StackBuffer s_ThreadStack; -demo::RenderSystemDrawing s_RenderSystem; - -} - -namespace PreinstallListUp -{ - -void ThreadFunc() -{ - COMMON_LOGGER("GetPreinstalledInfo\n"); - nn::Result result; - - // シリアルナンバーの取得 - u8 serialNo[nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN]; - std::memset(serialNo, '\0', - nn::cfg::CTR::CFG_SECURE_INFO_SERIAL_NO_LEN); - result = nn::cfg::CTR::system::GetSerialNo(serialNo); - COMMON_LOGGER_RETURN_VOID_IF_FAILED(result); - - // デバイスIDの取得 - bit32 deviceId; - result = nn::ps::CTR::GetDeviceId(&deviceId); - COMMON_LOGGER_RETURN_VOID_IF_FAILED(result); - const bit64 infraDeviceId = deviceId + common::INFRA_DEVICE_ID_OFFSET; - - ConsoleRestore::PreinstallImporter importer; - - size_t num; - nn::ProgramId list[256]; - result = importer.ListTitles(list, &num, infraDeviceId, serialNo); - if(result == nn::MakePermanentResult(nn::Result::SUMMARY_NOT_FOUND, - nn::Result::MODULE_APPLICATION, nn::Result::DESCRIPTION_NOT_FOUND)) - { - COMMON_LOGGER("No PreInstalled Application found\n"); - } - else - { - COMMON_LOGGER("Preinstalled num = %d\n", num); - for (u32 i = 0; i < num; i++) - { - COMMON_LOGGER("%016llx\n", list[i]); - } - } - COMMON_LOGGER_RETURN_VOID_IF_FAILED(result); -} - -void FinalizeAll() -{ - common::Logger::GetLoggerInstance()->Finalize(); - // アンマウント - nn::fs::Unmount("nand:"); - nn::fs::Unmount("sdmc:"); - s_RenderSystem.Finalize(); - - nn::ps::Finalize(); - nn::cfg::CTR::system::Finalize(); - nn::cfg::CTR::init::Finalize(); - nn::hid::Finalize(); - nn::fs::Finalize(); - - nn::applet::PrepareToCloseApplication(); - nn::applet::CloseApplication(); -} - -extern "C" void nninitSetupDaemons(void) -{ -} - - -extern "C" void nnMain(void) -{ - nn::Result result; - - // os の初期化 - nn::os::Initialize(); - - // fs の初期化 - nn::fs::Initialize(); - - // appletの初期化 - nn::applet::Enable( false ); - - // cfgの初期化 - nn::cfg::CTR::init::Initialize(); - nn::cfg::CTR::system::Initialize(); - - // hid の初期化 - result = nn::hid::Initialize(); - NN_ERR_THROW_FATAL_IF_FATAL_ONLY(result); - - // ps の初期化 - nn::ps::Initialize(); - - // ヒープの確保 - common::InitializeHeap(); - - // RenderSystem の準備 - common::HeapManager gxHeap(s_GxHeapSize); - uptr heapForGx = reinterpret_cast(gxHeap.GetAddr()); - s_RenderSystem.Initialize(heapForGx, s_GxHeapSize); - - // ログ描画の初期化 - common::Logger::GetLoggerInstance()->Initialize(CONSOLE_WIDTH, CONSOLE_HEIGHT, CONSOLE_MAX_LINE, &s_RenderSystem); - - // RenderSystemを作ってからログが出せる - common::Logger::InitializeEjectThread(); - - s_Thread.Start(ThreadFunc, s_ThreadStack); - - // ボタン入力 - nn::hid::PadReader s_PadReader; - nn::hid::PadStatus padStatus; - - for(;;) - { - s_PadReader.ReadLatest(&padStatus); - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_UP) - { - common::Logger::GetLoggerInstance()->ScrollUp(); - } - - // コンソールスクロール - if(padStatus.hold & nn::hid::BUTTON_DOWN) - { - common::Logger::GetLoggerInstance()->ScrollDown(); - } - - if(padStatus.hold & nn::hid::BUTTON_LEFT) - { - common::Logger::GetLoggerInstance()->ScrollToBegin(); - } - - if(padStatus.hold & nn::hid::BUTTON_RIGHT) - { - common::Logger::GetLoggerInstance()->ScrollToEnd(); - } - - s_RenderSystem.SetRenderTarget(NN_GX_DISPLAY0); - s_RenderSystem.Clear(); - s_RenderSystem.SetColor(1.f, 1.f, 1.f); - - common::Logger::GetLoggerInstance()->DrawConsole(); - s_RenderSystem.SwapBuffers(); - - s_RenderSystem.WaitVsync(NN_GX_DISPLAY_BOTH); - - // 電源長押しで終了 - if ( nn::applet::IsExpectedToCloseApplication()) - { - FinalizeAll(); - } - - } -} - -}